node.js - Upstart env 节没有为 Node.js 应用程序设置环境变量(如 NODE_ENV)

标签 node.js ubuntu environment-variables upstart

我的服务器有一个 Upstart 脚本,如下所示:

description "myapp node.js server"

start on runlevel [2345]
stop on shutdown

env NODE_ENV=production
env CUSTOM=somevalue
exec sudo -u nodejs /usr/local/bin/node /opt/myapp/app.js >> /var/log/nodejs/myapp.log 2>&1

post-start script
    NODE_PID=`status myapp | egrep -oi '([0-9]+)$' | head -n1` 
    echo $NODE_PID > /var/run/nodejs/myapp.pid
end script

但是,该应用没有看到 NODE_ENV 设置为生产。事实上,如果我在应用程序中使用 console.log(process.env),我看不到 NODE_ENV 或 CUSTOM。有什么想法吗?

顺便说一句,NODE_ENV=production node app.js 工作正常。

最佳答案

来自 sudo man page (Ubuntu 版本的 sudo)

There are two distinct ways to deal with environment variables. By default, the env_reset sudoers option is enabled. This causes commands to be executed with a minimal environment containing TERM, PATH, HOME, SHELL, LOGNAME, USER and USERNAME in addition to variables from the invoking process permitted by the env_check and env_keep sudoers options. There is effectively a whitelist for environment variables.

Sudo 正在重置环境。这是在 upstart 或 init 脚本中使用 susudo 的一个令人沮丧的方面。最近版本的 Upstart 支持通过 setuid/setgid 指令指定 uid/gid 而不使用 sudo,如下例所示。还要注意 chdir 的使用。

start on filesystem and started networking
respawn
chdir /var/www/yourapp
setuid yourapp
setgid yourapp
env NODE_ENV=production
env PATH=/usr/local/bin:/usr/bin:/bin
env CUSTOM=somevalue
exec /usr/local/bin/node app.js | /usr/bin/multilog s1024000 /var/log/yourapp 2>&1

对于旧版本的 Upstart ,这是我用来解决它的方法。

description "start and stop the example.com node.js server"

start on filesystem and started networking
respawn

chdir /path/to/your/code
exec su -c 'PATH=$PWD/node/bin NODE_ENV=$(cat node_env.txt) ./node/bin/node app/server.js' www-data  >> tmp/stdout.log 2>&1

请注意,我只是在我的应用根目录中放置了一个 node_env.txt 文件来设置生产模式,因为 I hate environment variables .如果您愿意,可以直接在此处执行 NODE_ENV=production

关于node.js - Upstart env 节没有为 Node.js 应用程序设置环境变量(如 NODE_ENV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902856/

相关文章:

macos - Apple_Ubiquity_Message 到底是什么?

r - 以编程方式设置环境变量

Linux。将文件内容设置为环境变量时如何保留行?

node.js - 依赖版本不同步时如何对齐package.json和package-lock.json?

linux - 使用 RSync 复制连续范围的文件

Eclipse 代码辅助在 Ubuntu 12.04 中不起作用

linux - 如何使用单个 ack 命令更改嵌套在子目录中的文件的权限?

javascript - 如何从 AWS Lambda 的 URL 解析 JSON

javascript - 不能这样做 : NodeJS server creates number, 通过 JSON 将其发送到客户端

node.js - 带有正斜杠的窗口中的Nodejs绝对路径