phusion乘客没有看到环境变量?

时间:2012-05-11 01:23:43

标签: ruby-on-rails ubuntu nginx passenger

我们正在为我们的rails 3.0x应用程序运行带有Nginx + Phusion Passenger的ubuntu服务器。

我在测试机器上的/ etc / environment中设置了一个环境变量:

MC_TEST=true

如果我运行一个控制台(捆绑exec rails c)并输出ENV [“MC_TEST”],我看到'true'。 但是,如果我在页面上放置相同的代码(<%= ENV [“MC_TEST”]%>)它看不到任何内容。该变量不存在。

这引出了我的问题:

1 - 使用nginx(不是apache SetEnv)将环境变量引入乘客的正确方法是什么?

2 - 为什么乘客没有适当的环境?

3 个答案:

答案 0 :(得分:7)

Passenger fusion v4 +可以直接从bashrc文件中读取环境变量。确保bashrc存在于执行乘客进程的用户的主文件夹中(在我的例子中,它是ubuntu,用于ec2 linux和nginx)

这是documentation,详细介绍了bashrc

答案 1 :(得分:4)

在ubuntu上使用带有nginx和nginx init脚本的乘客时,我遇到了同样的问题。 原因是我使用sudo服务nginx restart(由init脚本安装)来启动nginx和
 它是由root运行的,并且root没有获得您的登录用户环境变量。 有两种解决方案。 一个是手动运行nginx。

sudo service nginx stop
sudo -E /path/to/your/nginx

一个是将env添加到你的nginx init脚本

export MC_TEST=true

后一种解决方案有些难看,但它确实有效。我认为更好的方法是找到一个配置来告诉init脚本保留登录用户env。

答案 2 :(得分:0)

我得到了另一个丑陋的解决方案。

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