在我的弹性豆茎-容器选项中。RACK_ENV
设置为staging
。
事实上,如果我SSHEC2实例,在/var/app/当前/
中执行rails控制台
,然后键入Rails. env
,它会返回staging
。
阅读http://www.modrails.com/documentation/Users指南Nginx. html#RackEnv
它说设置一个RACK_ENV
变量,因为默认情况下,该值是生产
。
你会假设一切正常,除了弹性豆茎日志,它说:
[ 2013-11-18 14:28:26.4677 8061/7fb5fe01a700 Pool2/Implementation.cpp:1274 ]: [App 7428 stdout] PG::ConnectionBad (FATAL: database "foobar_production" does not exist
foobar_production
数据库不存在,但是foobar_staging
存在。那么为什么乘客仍然在关注正式生产环境,而它应该关注登台。
AWS这条线索似乎暗示RACK_ENV只能设置为“开发”或“生产”之一。
有趣的是,在我自己的测试中,当将Elastic Beanstrak环境配置为RACK_ENV=staging
时,迁移将针对数据库. yml中定义的staging
数据库运行,但Passenger仍然尝试连接到生产
数据库。
我们想出的解决方案是在应用程序下设置两个不同的“环境”,每个环境都有自己的RDS数据库。然后在Database. yml中,我们使用ENV参数在运行时连接到正确的数据库:
production:
database: <%= ENV['RDS_DB_NAME'] %>
username: <%= ENV['RDS_USERNAME'] %>
password: <%= ENV['RDS_PASSWORD'] %>
host: <%= ENV['RDS_HOSTNAME'] %>
port: <%= ENV['RDS_PORT'] %>
在您的豆茎配置中,将STAGING
设置为true
。
如果在轨道上或机架应用程序的顶部,请将修复程序添加到config/环境. rb
的顶部。
# Fix the environment
if ENV['STAGING']
%w(RACK_ENV RAILS_ENV).each do |key|
ENV[key] = 'staging'
end
end
# Load the Rails application.
...
不要乱用PASSENGER_ENV
或WSGI_ENV
。如果这样做,它会损坏。