web-dev-qa-db-ja.com

Upstart envスタンザが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は問題なく動作します。

27
Chris F

Sudo man page から(UbuntuバージョンのSudo)

環境変数を処理する方法は2つあります。デフォルトでは、env_reset sudoersオプションは有効になっています。これにより、TERM、PATH、HOME、Shell、LOGNAME、USER、USERNAMEに加えて、env_checkおよびenv_keep sudoersオプションで許可された呼び出しプロセスからの変数を含む最小限の環境でコマンドが実行されます。実際には、環境変数のホワイトリストがあります。

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

環境変数が嫌い であるため、本番モードを設定するnode_env.txtファイルをアプリのルートに配置するだけであることに注意してください。必要に応じて、ここでNODE_ENV=productionを実行できます。

40
Peter Lyons

参考までに。 pstart Cookbook 推奨 suまたはSudoの代わりにstart-stop-daemon を使用する場合、Upstartバージョンはnotsetuidを実装します。

ただし、Upstartバージョン0.6.5しかない10.04 LTSLucid Lynx)をまだ使用していない場合は、setuid/setgidディレクティブを使用する必要があります。

3
C2H5OH

これはupstartでノード環境変数を設定するために私のために働いています。

#!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
1
Sean McClory

visudoには、保持する環境変数を定義する行があります。

Sudo visudo

そしてあなたの環境を以下に追加してください:

Defaults        env_keep="YOUR_ENV ..."

そして再起動します。

0
keos