8

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

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

MC_TEST=true

如果我运行控制台(bundle exec rails c)并输出 ENV["MC_TEST"] 我看到'true'。但是,如果我将相同的代码放在页面上( <%= ENV["MC_TEST"] %> ),它什么也看不到。该变量不存在。

这让我产生疑问:

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

2 - 为什么Passenger没有合适的环境?

4

4 回答 4

7

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

这是详细介绍 bashrc的文档

于 2013-06-25T00:08:45.903 回答
4

在 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

后一种解决方案有点丑陋,但它有效。而且我认为更好的方法是找到一个配置来告诉初始化脚本保留登录用户环境。

于 2012-08-23T06:31:44.223 回答
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
于 2014-01-12T10:11:06.770 回答
0

使用 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;
于 2021-12-08T05:57:39.973 回答