将Rails应用程序更改为生产


190

如何更改Rails应用程序使其在生产模式下运行?是否有一个配置文件(例如,environment.rb)来做到这一点?


2
似乎第二个答案有更多的票数,除非您有任何问题,否则您是否愿意对此进行快速回顾并接受第二个答案。只会帮助将来的访客。Thx :)
演变

Answers:


73

如何使用Apache和Phusion Passenger在生产模式下(逐步)设置和运行Rails 4应用程序:

通常,您将可以进入Rails项目rails s,并在http://something.com:3000上获得应用程序的开发版本。生产模式配置起来有些棘手。

我已经花了一段时间了,所以我想我会为新手(比如我自己)写这个。互联网上有一些小调整,他们认为这样做可能会更容易。

  1. 请参阅本指南以了解服务器的核心设置(CentOS 6,但它应适用于几乎所有Linux版本):https : //www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4在centos-6上使用apache和passenger的应用程序

  2. 绝对确定在设置了Passenger后,您已经编辑了/etc/httpd/conf/httpd.conf文件以反映您的目录结构。您想将DocumentRoot指向Rails项目/ public文件夹,在httpd.conf具有这种dir的文件中的任何位置:/var/www/html/your_application/public需要更新,否则一切都会变得很沮丧。我不能太强调这一点。

  3. 重新启动服务器(或至少重启Apache- service httpd restart

  4. 输入您的Rails项目文件夹,/var/www/html/your_application然后从开始迁移rake db:migrate。确保数据库表存在,即使您计划稍后添加表(这也是步骤1的一部分)。

  5. RAILS_ENV=production rake secret-这将创建一个secret_key,您可以将其添加到中config/secrets.yml。您可以将其复制/粘贴到config / secrets.yml中,以使程序运行,尽管我建议您不要这样做。就个人而言,我执行此步骤以确保其他所有功能均正常运行,然后将其更改回并稍后再提供。

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompile如果您要投放静态资产。这会将js,css,图像文件推送到该/public文件夹中。

  8. RAILS_ENV=production rails s

此时,您的应用程序应该位于http://something.com/whatever而不是:3000。如果没有,passenger-memory-stats请查看是否有类似908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

我可能错过了一些令人发指的事情,但这在过去对我有用。


2
我觉得这个答案应该迁移到stackoverflow文档。
Whitecat '17

我要补充一点,如果您不想使用像apache这样的Web内容交付,则可以在RAILS_ENV = production旁边添加RAILS_SERVE_STATIC_FILES = 1,这意味着Rails可以处理每个文件,因此不建议在实际生产状态...
3d0

351

现在是

rails server -e production

或者,更紧凑

rails s -e production

它适用于Rails 3+项目。


33
还是简短版本rails s -e production
Pavel Nikolov

2
像Heroku这样的云服务又如何呢?如何server -e production在它们上运行?
格林

云服务通常具有用于指定环境的选项,但其中production始终都是默认选项。
James Billingham

2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi 2014年

更可取的答案是,这一点应该适用于StackOverflow文档。
dmanexe

61

如果您在Passenger上运行,则默认设置是在apache conf中的生产环境中运行:

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

如果您仅使用mongrel或webrick运行本地服务器,则可以执行以下操作:

./script/server -e production

或以重击:

RAILS_ENV=production ./script/server

实际上在enviornment.rb中重写RAILS_ENV常量应该是您的最后选择,因为它可能不会保持不变(请参阅我对此给出的另一个答案


54

如果mipadi的建议不起作用,请将其添加到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'

像Heroku这样的云服务又如何呢?可能ENV['RAILS_ENV'] ||= 'production'也适用于他们吗?
格林

我很久以前编辑了此文件,并忘记了..感谢您的提醒..节省了大量时间
Agnes



18

您还可以将环境传递到脚本/服务器:

$ script/server -e production

12
rails s -e production

这将使用RAILS_ENV= 运行服务器'production'

除此之外,您还必须在 production.rb

config.serve_static_assets = true

否则,您的资产将无法加载。


抱歉...本该打算投票赞成的。进行了少许编辑,以更正错误并赞成。
tomd 2015年

7
RAILS_ENV=production rails s

要么

rails s -e production

默认情况下是开发环境。


5

正如其他人发布的: rails server -e production

或者,我个人最喜欢: RAILS_ENV=production rails s


2

Rails 3中

添加Rails.env = ActiveSupport::StringInquirer.new('production')到application.rb中,rails s将与rails 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


1

对于默认服务器:rails s -e production

对于costum服务器端口:rails s -p [port] -e生产,例如。rails s -p 3002 -e生产


1

默认情况下,服务器在开发环境上运行: $ rails s

如果您在生产环境上运行:$ rails s -e production$ RAILS_ENV=production rails s


0

请确保已在environment.rb文件中完成以下操作。

ENV ['RAILS_ENV'] || ='生产'

如果您的应用程序在共享主机环境或phushion乘客中运行,则可能需要对.httaccess(在公共文件夹中)进行更改,并将模式设置为生产。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.