ruby-on-rails - Elastic Beanstalk、Rails 5 和Passenger:Rails.env 受挫
问题描述
我在 Elastic Beanstalk 中有一个堆栈,运行“在 64 位 Amazon Linux/2.8.3 上运行 Ruby 2.5 的乘客”图像。Rails 是 v5.2.1。希望使它成为一个登台环境,即让“Rails.env”返回“登台”并运行 staging.rb 配置。问题是,无论我做什么,它似乎都在作为“生产”运行。
- 我将 RACK_ENV 和 RAILS_ENV 设置为 EB 配置变量,都设置为“暂存”。我用 'printenv' 作为 ec2-user、webapp 和 root 确认了它们在服务器上的存在。
- 我尝试将Passenger 配置中的passenger_app_env 更改为“staging”。我已通过使用 'ps aux | 查看流程确认Passenger Standalone 正在使用正确的配置。grep 乘客”。
- 我尝试切换到根服务器并手动执行“/etc/init.d/passenger stop”然后“启动”,打印输出确认Passenger正在启动,其“环境”设置为“暂存”:
=============== Phusion Passenger 独立网络服务器已启动 ================ PID 文件:/var/app/support/pids/passenger. pid 日志文件:/var/app/support/logs/passenger.log 环境:staging 可通过:http://0.0.0.0/ 在后台作为守护进程服务。问题?检查 https://www.phusionpassenger.com/documentation/Users%20guide%20Standalone.html#troubleshooting
我将其放入 environment.rb 并添加了一个 EB 配置变量,以使 STAGING 为“真”。:
if ENV['STAGING'] %w(RACK_ENV RAILS_ENV).each do |key| ENV[key] = 'staging' end end
但是,我在 Rails 应用程序中创建的测试页面仍然显示“Rails.env”是“生产”,并且没有使用“staging.rb”中的值。然而,同一个测试页面显示 'ENV['RACK_ENV']' 和 'ENV['RAILS_ENV'] 都设置为 'staging'。
在这一点上,我不知道如何以任何其他方式强制环境。
解决方案
经过多次黑客攻击,我发现Passenger启动时使用了“production”(默认)的passenger_app_env,然后切换到“staging”。Rails.env 将获得“production”环境并使用“production.rb”,然后 RACK_ENV 和 RAILS_ENV 将被覆盖为“staging”,从而产生令人困惑的二元性。
解决方案是在Passenger 使用的Passenger Standalone 模板中将passenger_app_env 指令上移;我们将它放在 http 指令内的服务器指令中。将它从 server 指令中移到 http 指令本身解决了这个问题。
推荐阅读
- couchbase - Couchbase 同步网关多个客户端
- firebase - 这个系统设计可以改进吗?
- python - 我将如何拆分 python 字符串并保留分隔符,但分隔符不是单独的列表项?
- reactjs - 凸轮我向后端发送不同的 URL,即使服务器 url 作为前端的 id 值发送?
- prolog - prolog中递归规则中的常量递增变量
- python - 在机器人框架中使用 MQTT 订阅多个主题
- mongodb-realm - 领域聚合的奇怪回报
- node.js - 阻止 node.js 和电子的音频应用程序
- azure - Grafana 作为 Azure 流分析输出
- apache-spark - 无法从 spark scala 应用程序中的 kafka 流中读取 AVRO 数据