Cambiar una aplicación Rails a producción

190

¿Cómo puedo cambiar mi aplicación Rails para que se ejecute en modo de producción? ¿Hay un archivo de configuración, environment.rb, por ejemplo, para hacer eso?

Adler Medrado
fuente
2
Parece que la segunda respuesta tiene muchos más votos, ¿estaría dispuesto a darle una revisión rápida y aceptar la segunda respuesta a menos que tenga algún problema con ella? Solo ayudará a futuros visitantes. Thx :)
Evoluciona el

Respuestas:

73

Cómo configurar y ejecutar una aplicación Rails 4 en modo Producción (paso a paso) usando Apache y Phusion Passenger:

Normalmente, podrá ingresar a su proyecto Rails rails sy obtener una versión de desarrollo de su aplicación en http://something.com:3000 . El modo de producción es un poco más complicado de configurar.

He estado jugando con esto por un tiempo, así que pensé en escribir esto para los novatos (como yo). Hay algunos pequeños ajustes que se extienden a través de Internet y pensé que esto podría ser más fácil.

  1. Consulte esta guía para la configuración central del servidor (CentOS 6, pero debe aplicarse a casi todos los sabores de Linux): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-with-apache-and-passenger-on-centos-6

  2. Asegúrese de que después de configurar Passenger haya editado el /etc/httpd/conf/httpd.confarchivo para reflejar la estructura de su directorio. Desea apuntar DocumentRoot a su proyecto Rails / carpeta pública En cualquier parte del httpd.confarchivo que tenga este tipo de directorio: /var/www/html/your_application/publicdebe actualizarse o todo se volverá muy frustrante. No puedo enfatizar esto lo suficiente.

  3. Reinicie el servidor (o Apache como mínimo service httpd restart)

  4. Ingrese su carpeta de proyecto Rails /var/www/html/your_applicationy comience la migración con rake db:migrate. Asegúrese de que exista una tabla de base de datos, incluso si planea agregar tablas más tarde (esto también es parte del paso 1).

  5. RAILS_ENV=production rake secret- esto creará una clave secreta a la que puede agregar config/secrets.yml. Usted puede copiar / pegar esto en config / secrets.yml en aras de conseguir las cosas funcionando, aunque me gustaría recomendar que no lo hace. Personalmente, hago este paso para asegurarme de que todo lo demás funciona, luego lo cambio y lo busco más tarde.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompileSi está sirviendo activos estáticos. Esto empujará js, css, archivos de imagen a la /publiccarpeta.

  8. RAILS_ENV=production rails s

En este punto, su aplicación debería estar disponible en http://something.com/whateverlugar de :3000. Si no, passenger-memory-statsy ver si hay una entrada como908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Probablemente me he perdido algo atroz, pero esto me ha funcionado en el pasado.

etusm
fuente
2
Siento que esta respuesta debería migrarse a la documentación de stackoverflow.
Whitecat
Agregaría que si no desea utilizar una entrega de contenido web como apache, podría agregar un RAILS_SERVE_STATIC_FILES = 1 al lado de RAILS_ENV = producción, eso significaría que los rieles servirían a cada archivo, por lo que no lo recomendaré para un estado de producción real ...
3d0
351

Esto ahora sería

rails server -e production

O más compacto

rails s -e production

Funciona para rieles 3+ proyectos.

BandsOnABudget
fuente
33
o la versión cortarails s -e production
Pavel Nikolov
2
¿Qué pasa con los servicios en la nube como Heroku? ¿Cómo correr server -e productionsobre ellos?
Verde
Los servicios en la nube generalmente tienen opciones para especificar el entorno, pero en ellos productiones invariablemente el valor predeterminado.
James Billingham
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Respuesta muy preferida, esta debería llegar a la documentación de StackOverflow.
dmanexe
61

Si está ejecutando en Passenger , entonces el valor predeterminado es ejecutar en producción, en su configuración de apache:

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

Si solo está ejecutando un servidor local con mongrel o webrick, puede hacer:

./script/server -e production

o en bash:

RAILS_ENV=production ./script/server

en realidad, anular la constante RAILS_ENV en enviornment.rb probablemente debería ser su último recurso, ya que probablemente no se mantendrá establecido (vea otra respuesta que di sobre eso)

Dan McNevin
fuente
54

Si la sugerencia de mipadi no funciona, agregue esto a 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
fuente
¿Qué pasa con los servicios en la nube como Heroku? ¿Se ENV['RAILS_ENV'] ||= 'production'puede aplicar sobre ellos también?
Verde
Edité este archivo hace mucho tiempo y olvidé ... gracias por recordarme ... ahorré mucho tiempo
Agnes
19

Cambie la variable de entorno RAILS_ENVa production.

mipadi
fuente
3
¿Dónde se encuentra la variable de entorno?
BKSpurgeon
puede estar ubicado en ~/.bashrco ~/.bash_profilesimplementeexport RAILS_ENV=production"
Shimaa Marzouk
19
$> export RAILS_ENV=production
Evolucionar
fuente
18

También puede pasar el entorno al script / servidor:

$ script/server -e production
foz
fuente
12
rails s -e production

Esto ejecutará el servidor con RAILS_ENV= 'production'.

Aparte de esto, debe establecer la ruta de los activos en production.rb

config.serve_static_assets = true

Sin esto, sus activos no se cargarán.

Prasanna
fuente
Lo siento ... voté en contra cuando estaba destinado a votar. Se realizó una ligera edición para corregir el error y votar.
tomd
7
RAILS_ENV=production rails s

O

rails s -e production

Por defecto el entorno es desarrollo.

puneet18
fuente
5

Como otros han publicado: rails server -e production

O mi favorito personal: RAILS_ENV=production rails s

alex1sz
fuente
2

En rieles 3

Agregar Rails.env = ActiveSupport::StringInquirer.new('production')a la aplicación.rb y rails sfuncionará igual 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
fuente
2

No es una buena forma de ejecutar el servidor rails en el entorno de producción mediante "rails server -e production", ya que rails se ejecuta como una aplicación de un solo subproceso y solo puede responder a una solicitud HTTP a la vez.

El mejor artículo sobre entorno de producción para rieles es Entornos de producción - Rieles 3

Evgeny Liskovets
fuente
3
Link rot ... disponible en la máquina wayback: link
rosuav
1

para el servidor predeterminado: rails s -e production

para el puerto del servidor costum: rails s -p [port] -e producción, por ejemplo. rieles s -p 3002 -e producción

usuario3786185
fuente
1

Por defecto, el servidor se ejecuta en el entorno de desarrollo: $ rails s

Si está ejecutando en un entorno de producción: $ rails s -e productiono$ RAILS_ENV=production rails s

Pankaj Dhote
fuente
0

Asegúrese de haberlo hecho a continuación en su archivo environment.rb.

ENV ['RAILS_ENV'] || = 'producción'

Si su aplicación se ejecuta en un entorno de alojamiento compartido o pasajero, es posible que deba realizar cambios en .httaccess (dentro de la carpeta pública) y establecer el modo como producción.

Rakesh
fuente