【问题标题】:phusion passenger not seeing environment variables?phusion 乘客没有看到环境变量?
【发布时间】: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没有合适的环境?

【问题讨论】:

    标签: ruby-on-rails ubuntu nginx 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;
        

        【讨论】:

          猜你喜欢
          • 2010-09-09
          • 1970-01-01
          • 2019-07-31
          • 1970-01-01
          • 2014-08-03
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多