当前位置: 首页>>技术教程>>正文


新贵环境节未为Node.js应用程序设置环境变量(例如NODE_ENV)

, , ,

问题描述

我的服务器上有一个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版本)

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这是一个令人沮丧的方面。新贵的最新版本支持不通过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

对于新版本的新贵,这是我用来解决该问题的方法。

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

次佳思路

仅作记录。当Upstart版本未实现setuid时,Upstart Cookbook建议使用start-stop-daemon代替susudo

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8519.html,未经允许,请勿转载。