phusion 乘客没有看到环境变量?
Posted
技术标签:
【中文标题】phusion 乘客没有看到环境变量?【英文标题】:phusion passenger not seeing environment variables? 【发布时间】:2012-05-19 15:06:36 【问题描述】:我们正在为我们的 rails 3.0x 应用程序运行带有 nginx + Phusion Passenger 的 ubuntu 服务器。
我在测试机器的 /etc/environment 中设置了一个环境变量:
MC_TEST=true
如果我运行控制台(bundle exec rails c)并输出 ENV["MC_TEST"] 我会看到“真”。 但是,如果我将相同的代码放在页面上( ),它什么也看不到。该变量不存在。
这让我产生疑问:
1 - 使用 nginx(不是 apache SetEnv)将环境变量导入乘客的正确方法是什么?
2 - 为什么Passenger没有合适的环境?
【问题讨论】:
【参考方案1】:在 ubuntu 上使用带有 nginx 和 nginx 初始化脚本的乘客时,我遇到了同样的问题。 原因是我使用 sudo service nginx restart(由 init 脚本安装)来启动 nginx 和 它由 root 运行,并且 root 没有获取您的登录用户环境变量。 有两种解决方案。 一种是手动运行nginx。
sudo service nginx stop
sudo -E /path/to/your/nginx
一个是将 env 添加到您的 nginx 初始化脚本中
export MC_TEST=true
后一种解决方案有点难看,但它有效。而且我认为更好的方法是找到一个配置来告诉初始化脚本保留登录用户环境。
【讨论】:
【参考方案2】:Passenger fusion v4+ 可以直接从 bashrc 文件中读取环境变量。确保 bashrc 位于执行乘客进程的用户的主文件夹中(在我的情况下,它是 ubuntu,用于 ec2 linux 和 nginx)
这里是documentation,详细介绍了 bashrc
【讨论】:
该文档部分解释了您需要的有关环境变量的一切。它们是什么、它们如何工作、它们的属性以及如何将它们传递给 Phusion 乘客服务的应用程序。 请注意,但即使在非交互式 shell 中,默认情况下也可以使用。【参考方案3】:我有另一个丑陋的解决方案。
env_file = '/etc/environment'
if File.exist?(env_file)
text = File.open(env_file).read
text.each_line do |line|
key, val = line.split('=', 2)
ENV[key] = val.strip
end
end
【讨论】:
【参考方案4】:使用 nginx,您可以使用变量 Passenger_env_var。请参阅下面的示例
passenger_env_var GEM_HOME /home/foo/.rbenv/rubygems;
passenger_env_var GEM_PATH /home/foo/.rbenv/rubygems/gems;
所以对于你的情况
passenger_env_var MC_TEST true;
【讨论】:
以上是关于phusion 乘客没有看到环境变量?的主要内容,如果未能解决你的问题,请参考以下文章