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=本番ノードapp.jsは問題なく動作します。

4

4 に答える 4

40

sudoのmanページから(sudoのUbuntuバージョン)

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

須藤は環境をリセットしています。suこれは、sudoupstartまたはinitスクリプトを使用する際の苛立たしい側面です。setuid/setgid最近のバージョンのupstartは、以下の例のように、ディレクティブを介して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

于 2012-01-17T23:16:27.660 に答える
3

記録のためだけに。Upstart Cookbookは、Upstartバージョンがを実装していない場合の代わりに、またはその場合の使用をstart-stop-daemon推奨しています。susudosetuid

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

于 2013-01-24T14:16:05.240 に答える
1

これは、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
于 2013-08-22T04:25:23.460 に答える
0

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

sudo visudo

次の場所に環境を追加します。

Defaults        env_keep="YOUR_ENV ..."

再起動します。

于 2017-05-31T02:55:20.460 に答える