Changer une application Rails en production

190

Comment puis-je modifier mon application Rails pour qu'elle s'exécute en mode production? Existe-t-il un fichier de configuration, environment.rb par exemple, pour faire cela?

Adler Medrado
la source
2
Il semble que la deuxième réponse a beaucoup plus de votes, seriez-vous prêt à l'examiner rapidement et à accepter la deuxième réponse à moins que vous n'ayez un problème avec elle. Aidera simplement les futurs visiteurs. Thx :)
Evolve

Réponses:

73

Comment configurer et exécuter une application Rails 4 en mode Production (étape par étape) à l'aide d'Apache et de Phusion Passenger:

Normalement, vous pourrez entrer votre projet Rails rails set obtenir une version de développement de votre application à l' adresse http://something.com:3000 . Le mode production est un peu plus délicat à configurer.

Je m'amuse avec ça depuis un moment, alors j'ai pensé que j'écrirais ça pour les débutants (comme moi). Il y a quelques petites modifications qui sont réparties sur Internet et qui ont pensé que cela pourrait être plus facile.

  1. Reportez-vous à ce guide pour la configuration de base du serveur (CentOS 6, mais il devrait s'appliquer à presque toutes les versions Linux): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-avec-apache-et-passager-sur-centos-6

  2. Assurez-vous qu'après la configuration de Passenger, vous avez modifié le /etc/httpd/conf/httpd.conffichier pour refléter la structure de votre répertoire. Vous voulez faire pointer DocumentRoot vers votre projet / dossier public Rails N'importe où dans le httpd.conffichier qui a ce type de dir: /var/www/html/your_application/publicdoit être mis à jour ou tout deviendra très frustrant. Je ne peux insister assez sur ce point.

  3. Redémarrez le serveur (ou Apache au moins - service httpd restart)

  4. Entrez votre dossier de projet Rails /var/www/html/your_applicationet démarrez la migration avec rake db:migrate. Assurez-vous qu'une table de base de données existe, même si vous prévoyez d'ajouter des tables ultérieurement (cela fait également partie de l'étape 1).

  5. RAILS_ENV=production rake secret- cela créera une clé secrète que vous pourrez ajouter config/secrets.yml. Vous pouvez copier / coller ceci dans config / secrets.yml pour faire fonctionner les choses, bien que je vous recommande de ne pas le faire. Personnellement, je fais cette étape pour m'assurer que tout le reste fonctionne, puis changez-le et sourcez-le plus tard.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompilesi vous diffusez des actifs statiques. Cela poussera les fichiers js, css, image dans le /publicdossier.

  8. RAILS_ENV=production rails s

À ce stade, votre application devrait être disponible au http://something.com/whateverlieu de :3000. Sinon, passenger-memory-statset voyez s'il y a une entrée comme908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

J'ai probablement raté quelque chose d'odieux, mais cela a fonctionné pour moi dans le passé.

etusm
la source
2
Je pense que cette réponse devrait être migrée vers la documentation de stackoverflow.
Whitecat
J'ajouterais que si vous ne voulez pas utiliser un contenu Web comme Apache, vous pouvez ajouter un RAILS_SERVE_STATIC_FILES = 1 à côté de RAILS_ENV = production, cela signifierait que les rails serviraient chaque fichier, donc je ne le recommanderais pas pour un état de la production réelle ...
3d0
351

Ce serait maintenant

rails server -e production

Ou, plus compact

rails s -e production

Cela fonctionne pour les projets de rails 3+.

BandsOnABudget
la source
33
ou la version courterails s -e production
Pavel Nikolov
2
Qu'en est-il des services cloud comme Heroku? Comment courir server -e productiondessus?
Vert
Les services cloud ont généralement des options pour spécifier l'environnement, mais productionc'est invariablement la valeur par défaut.
James Billingham
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Réponse de loin préférée, celle-ci devrait être intégrée à la documentation de StackOverflow.
dmanexe
61

Si vous utilisez Passenger , la valeur par défaut est de s'exécuter en production, dans votre configuration apache:

<VirtualHost *:80>
  ServerName application_name.rails.local
  DocumentRoot "/Users/rails/application_name/public"
  RailsEnv production ## This is the default
</VirtualHost>

Si vous utilisez juste un serveur local avec mongrel ou webrick, vous pouvez faire:

./script/server -e production

ou en bash:

RAILS_ENV=production ./script/server

en fait, remplacer la constante RAILS_ENV dans enviornment.rb devrait probablement être votre dernier recours, car il ne restera probablement pas défini (voir une autre réponse que j'ai donnée à ce sujet)

Dan McNevin
la source
54

Si la suggestion de mipadi ne fonctionne pas, ajoutez ceci à config / environment.rb

# force Rails into production mode when                          
# you don't control web/app server and can't set it the proper way                  
ENV['RAILS_ENV'] ||= 'production'
Pete
la source
Qu'en est-il des services cloud comme Heroku? Peut ENV['RAILS_ENV'] ||= 'production'être appliqué sur eux aussi?
Vert
J'ai édité ce fichier il y a longtemps et j'ai oublié .. merci pour le rappel .. gagné beaucoup de temps
Agnes
19

Remplacez la variable d'environnement RAILS_ENVpar production.

mipadi
la source
3
où se trouve la variable d'environnement?
BKSpurgeon
peut être situé dans ~/.bashrcou ~/.bash_profileou simplementexport RAILS_ENV=production"
Shimaa Marzouk
19
$> export RAILS_ENV=production
Évoluer
la source
18

Vous pouvez également transmettre l'environnement au script / serveur:

$ script/server -e production
foz
la source
12
rails s -e production

Cela exécutera le serveur avec RAILS_ENV= 'production'.

En dehors de cela, vous devez définir le chemin des actifs dans production.rb

config.serve_static_assets = true

Sans cela, vos actifs ne seront pas chargés.

Prasanna
la source
Désolé ... a voté contre alors qu'il était censé voter. Fait de légères modifications afin de corriger l'erreur et le vote favorable.
tomd
7
RAILS_ENV=production rails s

OU

rails s -e production

Par défaut, l'environnement est le développement.

puneet18
la source
5

Comme d'autres l'ont signalé: rails server -e production

Ou, mon préféré: RAILS_ENV=production rails s

alex1sz
la source
2

Dans les rails 3

L'ajout Rails.env = ActiveSupport::StringInquirer.new('production')dans l'application.rb et rails sfonctionnera de la même manière querails server -e production

module BlacklistAdmin
  class Application < Rails::Application

    config.encoding = "utf-8"
    Rails.env = ActiveSupport::StringInquirer.new('production')

    config.filter_parameters += [:password]
  end
end
RSK
la source
2

Ce n'est pas un bon moyen d'exécuter des rails server dans un environnement de production en "rails server -e production", car les rails s'exécutent alors comme une application monothread et ne peuvent répondre qu'à une seule requête HTTP à la fois.

Le meilleur article sur l'environnement de production pour les rails est Environnements de production - Rails 3

Evgeny Liskovets
la source
3
Link rot ... disponible sur wayback machine cependant: lien
rosuav
1

pour le serveur par défaut: rails s -e production

pour le port du serveur costum: rails s -p [port] -e production, par exemple. rails s -p 3002 -e production

user3786185
la source
1

Par défaut, le serveur s'exécute sur l'environnement de développement: $ rails s

Si vous utilisez un environnement de production: $ rails s -e productionou$ RAILS_ENV=production rails s

Pankaj Dhote
la source
0

Veuillez vous assurer que vous avez fait ci-dessous dans votre fichier environment.rb.

ENV ['RAILS_ENV'] || = 'production'

Si votre application s'exécute dans un environnement d'hébergement partagé ou un passager phushion, vous devrez peut-être apporter des modifications dans .httaccess (dans le dossier public) et définir le mode comme production.

Rakesh
la source