提问者:小点点

乘客为什么要查看登机环境?


在我的弹性豆茎-容器选项中。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存在。那么为什么乘客仍然在关注正式生产环境,而它应该关注登台。


共2个答案

匿名用户

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_ENVWSGI_ENV。如果这样做,它会损坏。