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

Chr*_*s F 27 ubuntu upstart environment-variables node.js

我的服务器的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
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,NODE_ENV =生产节点app.js工作正常.

Pet*_*ons 40

来自sudo手册页(Ubuntu版的sudo)

有两种不同的方法来处理环境变量.默认情况下,启用env_reset sudoers选项.这导致命令在包含TERM,PATH,HOME,SHELL,LOGNAME,USER和USERNAME的最小环境中执行,以及env_check和env_keep sudoers选项允许的调用过程中的变量.环境变量实际上是白名单.

Sudo正在重置环境.这是使用susudo在upstart或init脚本中令人沮丧的方面.最新版本的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
Run Code Online (Sandbox Code Playgroud)

对于旧版本的新贵,这是我过去常常要解决的问题.

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
Run Code Online (Sandbox Code Playgroud)

请注意,我只是node_env.txt在我的应用程序根目录中放置了一个设置生产模式的文件,因为 我讨厌环境变量.NODE_ENV=production如果您愿意,您可以在那里做.

  • 我不同意"环境变量是有害的"......它们在代码开发和服务器部署配置之间提供了可靠的接口.当与诸如chef之类的适当的devops策略结合使用时,可以在所有正确的位置可靠地设置环境变量 - 使部署更容易改变配置,而无需在源代码文件夹中查找. (3认同)