Alterar um aplicativo Rails para produção

190

Como posso alterar meu aplicativo Rails para executar no modo de produção? Existe um arquivo de configuração, environment.rb, por exemplo, para fazer isso?

Adler Medrado
fonte
2
Parece que a segunda resposta tem muito mais votos. Você gostaria de fazer uma revisão rápida e aceitar a segunda resposta, a menos que tenha algum problema com ela? Apenas ajudará futuros visitantes. Thx :)
Evolve

Respostas:

73

Como configurar e executar um aplicativo Rails 4 no modo Produção (passo a passo) usando o Apache e o Phusion Passenger:

Normalmente, você poderá entrar no seu projeto Rails rails se obter uma versão de desenvolvimento do seu aplicativo em http://something.com:3000 . O modo de produção é um pouco mais complicado de configurar.

Estou brincando com isso há um tempo, então achei que escreveria isso para os novatos (como eu). Existem alguns pequenos ajustes que estão espalhados pela Internet e concluímos que isso pode ser mais fácil.

  1. Consulte este guia para obter a configuração principal do servidor (CentOS 6, mas deve aplicar-se a quase todos os tipos de Linux): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-with-apache-and-passenger-on-centos-6

  2. Certifique-se de que, após a instalação do Passenger, você edite o /etc/httpd/conf/httpd.confarquivo para refletir sua estrutura de diretórios. Você deseja apontar o DocumentRoot para a pasta pública / projeto do Rails em qualquer lugar do httpd.confarquivo que possua esse tipo de diretório: /var/www/html/your_application/publicprecisa ser atualizado ou tudo ficará muito frustrante. Não posso enfatizar isso o suficiente.

  3. Reinicie o servidor (ou Apache, no mínimo - service httpd restart)

  4. Digite sua pasta de projeto do Rails /var/www/html/your_applicatione inicie a migração rake db:migrate. Verifique se existe uma tabela de banco de dados, mesmo se você planeja adicionar tabelas posteriormente (isso também faz parte da etapa 1).

  5. RAILS_ENV=production rake secret- isso criará uma chave_ secreta à qual você pode adicionar config/secrets.yml. Você pode copiar / colar isso em config / secrets.yml com o objetivo de fazer as coisas funcionarem, embora eu recomendo que você não faça isso. Pessoalmente, eu faço essa etapa para garantir que tudo funcione, em seguida, altero-a novamente e a fonte mais tarde.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompilese você estiver servindo ativos estáticos. Isso enviará arquivos de imagem js, css para a /publicpasta.

  8. RAILS_ENV=production rails s

Nesse momento, seu aplicativo deve estar disponível em http://something.com/whatevervez de :3000. Caso contrário, passenger-memory-statse veja se existe uma entrada como908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Provavelmente perdi algo hediondo, mas isso funcionou para mim no passado.

etusm
fonte
2
Eu sinto que esta resposta deve ser migrada para a documentação do stackoverflow.
Whitecat
Eu acrescentaria que, se você não quiser usar um conteúdo da Web entregue como o apache, poderá adicionar um RAILS_SERVE_STATIC_FILES = 1 ao lado da produção RAILS_ENV =, isso significaria que os trilhos serviriam todos os arquivos, portanto não recomendam isso para um estado de produção real ...
3d0
351

Isso seria agora

rails server -e production

Ou, mais compacto

rails s -e production

Funciona para trilhos com mais de 3 projetos.

BandsOnABudget
fonte
33
ou a versão curtarails s -e production
Pavel Nikolov
2
E os serviços em nuvem como o Heroku? Como correr server -e productioncom eles?
Verde
Os serviços em nuvem geralmente têm opções para especificar o ambiente, mas neles productioné invariavelmente o padrão.
James Billingham
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Resposta muito preferida, esta deve chegar à documentação do StackOverflow.
precisa saber é o seguinte
61

Se você estiver executando no Passenger , o padrão é executar na produção, no seu apache conf:

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

Se você está apenas executando um servidor local com mongrel ou webrick, pode:

./script/server -e production

ou no bash:

RAILS_ENV=production ./script/server

na verdade, substituir a constante RAILS_ENV no ambiente.rb provavelmente deve ser seu último recurso, pois provavelmente não permanecerá definido (veja outra resposta que eu dei sobre isso)

Dan McNevin
fonte
54

Se a sugestão do mipadi não funcionar, adicione-o ao 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
fonte
E os serviços em nuvem como o Heroku? ENV['RAILS_ENV'] ||= 'production'Também pode ser aplicado a eles?
Verde
Eu editei este arquivo longo para trás e esqueci .. graças para lembrar .. muito salvo de tempo
Agnes
19

Mude a variável de ambiente RAILS_ENVpara production.

mipadi
fonte
3
onde está localizada a variável de ambiente?
precisa saber é o seguinte
pode estar localizado em ~/.bashrcou ~/.bash_profilesimplesmenteexport RAILS_ENV=production"
Shimaa Marzouk
19
$> export RAILS_ENV=production
Evoluir
fonte
18

Você também pode passar o ambiente para script / servidor:

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

Isso executará o servidor com RAILS_ENV= 'production'.

Além disso, você deve definir o caminho dos ativos em production.rb

config.serve_static_assets = true

Sem isso, seus ativos não serão carregados.

Prasanna
fonte
Desculpe ... votou para baixo quando deveria votar. Foi feita uma pequena edição para corrigir o erro e o voto positivo.
tomd 29/09/15
7
RAILS_ENV=production rails s

OU

rails s -e production

Por padrão, o ambiente é desenvolvimento.

puneet18
fonte
5

Como outros postaram: rails server -e production

Ou, meu favorito pessoal: RAILS_ENV=production rails s

alex1sz
fonte
2

No Rails 3

Adicionando Rails.env = ActiveSupport::StringInquirer.new('production')ao application.rb e rails sfuncionará da mesma forma 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
fonte
2

Não é uma boa maneira de executar o servidor rails no ambiente de produção "rails server -e production", porque o rails é executado como um aplicativo de thread único e só pode responder a uma solicitação HTTP por vez.

O melhor artigo sobre ambiente de produção para trilhos é Ambientes de produção - Rails 3

Evgeny Liskovets
fonte
3
Fazer a ligação podridão ... acessível em máquina do tempo, porém: ligação
rosuav
1

para servidor padrão: produção de rails s -e

para porta do servidor de costum: produção de trilhos s -p [port] -e, por exemplo. produção de trilhos s -p 3002 -e

user3786185
fonte
1

Por padrão, o servidor é executado no ambiente de desenvolvimento: $ rails s

Se você estiver executando no ambiente de produção: $ rails s -e productionou$ RAILS_ENV=production rails s

Pankaj Dhote
fonte
0

Verifique se você fez o seguinte no arquivo environment.rb.

ENV ['RAILS_ENV'] || = 'produção'

Se o seu aplicativo for executado em um ambiente de hospedagem compartilhada ou em um passageiro, talvez seja necessário fazer alterações no .httaccess (dentro da pasta pública) e definir o modo de produção.

Rakesh
fonte