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

时间:2012-01-17 22:55:20

标签: 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设置为生产。事实上,如果我在app中使用console.log(process.env),我看不到NODE_ENV或CUSTOM。任何想法发生了什么?

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

4 个答案:

答案 0 :(得分:40)

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

  

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

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

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

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

答案 1 :(得分:3)

仅供记录。当您的Upstart版本实施su时,Upstart Cookbook建议the usage of start-stop-daemon而不是sudosetuid

但是,除非您仍然使用只有Upstart版本0.6.5的10.04 LTS Lucid Lynx ),否则您应该使用setuid/setgid指令。

答案 2 :(得分:1)

我一直在努力在upstart中设置节点env变量。

#!upstart

start on runlevel [2345]
stop on runlevel [016]

respawn

script
    echo $$ > /var/run/app.pid
    exec sudo NODE_ENV=production /opt/node/bin/node /opt/myapp/app.js >> /var/log/app.sys.log 2>&1
end script

答案 3 :(得分:0)

visudo有一行来定义要保留的环境变量。

sudo visudo

并将您的env添加到:

Defaults        env_keep="YOUR_ENV ..."

并重启。