【问题标题】:process.env.PATH undefined in Passenger node app (production mode)乘客节点应用程序中未定义 process.env.PATH(生产模式)
【发布时间】:2015-04-15 14:10:18
【问题描述】:

我最近用 Phusion Passenger 为 nginx 部署了一个节点应用程序,在这个过程中遇到了一个非常古怪的错误:

我的代码在尝试生成 child_process 时出错。我做了一些调试,最终得出结论,问题出在节点中未定义的$PATH 环境变量,我可以使用这样的passenger_env_var 指令解决问题(显示我的nginx 配置的摘录):

server {
    listen 80;
    server_name blargh.com;
    root /home/user/blargh.com/build;

    passenger_enabled on;
    # For some reason $PATH isn't loaded into node, and we can't spawn child processes without it
    passenger_env_var PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games;
}

我仍然没有弄清楚是什么导致了这个问题 - 设置 passenger_load_shell_envvars on; 没有帮助,并且 www-data 用户确实在 shell 中定义了 $PATH envvar。此外,其他环境变量(如$SHELL)似乎已经被节点加载,增加了为什么$PATH被排除在外的谜团。

有谁知道是什么导致了这个问题?

【问题讨论】:

    标签: node.js nginx passenger


    【解决方案1】:

    tl;博士/etc/default/nginx 中指定您希望在系统启动时定义的全局环境变量(如PATH)。正确使用 dotenv 之类的东西,并在未签入的文本文件中为您的应用编写特定于环境的配置。环境变量通常非常邪恶。

    我觉得这个问题应该得到一个相当冗长的答案,因为在过去的几个月里,环境变量给我带来了反复出现的问题。

    将您的配置存储为环境变量是12 factor app 为编写可扩展的 Web 应用程序制定的规则之一。它们很好,因为它们可以让您以灵活的方式将配置与代码分开。但是,它们的一个问题是我们通常遇到它们的方式,当我们export MYVAR=myvalue 或将它们设置在我们的~/.pam_environment~/.bashrc 中时,它们的范围是我们当前的终端会话

    当我们开始使用 Phusion Passenger 等解决方案在系统启动时启动我们的应用程序时,这会导致问题 - 他们的启动脚本不关心用户 shell 环境。他们显然也不关心全局/etc/environment,这就是导致我的PATH未定义问题的原因。

    Phusion Passenger 实际上在 making global environment variables persist 上有一些文档:

    如果您通过 Debian 或 Ubuntu 软件包安装 Nginx,则可以在 /etc/default/nginx 中定义环境变量。这是一个 shell 脚本,因此您必须使用 export FOO=bar 语法。

    所以通过在/etc/default/nginx 中设置PATH envvar,我可以解决这个问题。但是我仍然遇到其他环境变量的问题 - 我必须在我的 nginx 配置中设置它们才能将它们传递给我的节点应用程序。我很清楚这不是正确的做法。

    此时我已经在使用dotenv,但我稍微误解了它的用途。我签入了.env 文件,并认为它是为环境变量提供默认值的一种方式,环境变量将根据需要将其覆盖。这不是作者自己设想使用此模块的方式:

    我们强烈建议您不要将 .env 文件提交给版本控制。它应该只包含特定于环境的值,例如数据库密码或 API 密钥。

    我开始明白,人们通常不会在实际环境中为他们的应用定义 envvar。我发现 Peter Lyons 的 an article 建议将配置存储在文本文件中而不是 envvars 中,这就是我点击它的时候。

    我的最终解决方案是取消提交我的.env 文件,并为每个环境编写一个特定的文件。我在我的 repo 中留下了 .env.template 作为我的应用程序预期在运行时定义的配置的参考。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2012-03-26
      • 2015-06-30
      • 2011-12-24
      • 2014-09-17
      • 1970-01-01
      • 2015-05-10
      • 2013-08-29
      • 2021-06-04
      相关资源
      最近更新 更多