我的服务器上有一个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 =生产节点app.js可以正常工作。
最佳答案
从sudo man page(sudo的Ubuntu版本)
Sudo正在重置环境。这是在upstart或init脚本中使用su
和sudo
的令人沮丧的方面。 Upstart 的最新版本支持不通过setuid/setgid
指令使用sudo来指定uid/gid,如下例所示。另请注意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
请注意,因为I hate environment variables,我只是将
node_env.txt
文件放在设置生产模式的应用程序根目录中。如果愿意,您可以在此处直接进行NODE_ENV=production
。关于node.js - Upstart 环境节未为Node.js应用程序设置环境变量(如NODE_ENV),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8902856/