我们正在为我们的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 - 为什么乘客没有适当的环境?
答案 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