我的服务器上有一个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手册页(sudo的Ubuntu版本)
有两种不同的方法来处理环境变量。默认情况下,env_reset sudoers选项处于启用状态。这将使命令在最小环境下执行,该环境包括TERM,PATH,HOME,SHELL,LOGNAME,USER和USERNAME,以及env_check和env_keep sudoers选项允许的调用过程中的变量。实际上有一个环境变量白名单。
Sudo正在重置环境。这是在upstart或init脚本中使用su和的令人沮丧的方面sudo。新贵的最新版本支持通过以下setuid/setgid指令在不使用sudo的情况下指定uid / gid ,如下例所示。另请注意使用chdir。
su
sudo
setuid/setgid
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,因为我讨厌环境变量,所以我只是将文件放置到设置生产模式的应用程序根目录中 。NODE_ENV=production如果愿意,您可以就在那儿。
node_env.txt
NODE_ENV=production