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 乘客没有看到环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 Phusion 乘客版本?

无法启动 Phusion 乘客看门狗?

Phusion 乘客内部服务器错误

Phusion 乘客(适合傻瓜!)

Phusion 乘客配置文件在哪里?

安装 Phusion 乘客时出错“在 [] (Gem::LoadError) 中找不到乘客 (>= 0)”