27

我的服务器有一个 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=production node app.js 工作得很好。

4

4 回答 4

40

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

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

Sudo 正在重置环境。这是在 upstart 或 init 脚本中使用suand的一个令人沮丧的方面。sudo最新版本的新贵支持在不使用 sudo 的情况下通过指令指定 uid/gid,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如果你愿意,你可以在那里做。

于 2012-01-17T23:16:27.660 回答
3

只是为了记录。Upstart Cookbook建议start-stop-daemon您的Upstart 版本实现su时使用.sudosetuid

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

于 2013-01-24T14:16:05.240 回答
1

这一直对我在新贵中设置节点环境变量有用。

#!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
于 2013-08-22T04:25:23.460 回答
0

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

sudo visudo

并将您的环境添加到:

Defaults        env_keep="YOUR_ENV ..."

并重新启动。

于 2017-05-31T02:55:20.460 回答