Upstart env stanza не устанавливает переменные окружения (например, NODE_ENV) для приложения Node.js - PullRequest
27 голосов
/ 18 января 2012

У меня есть сценарий 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 в рабочем состоянии.На самом деле, если я консоль.log (process.env) в приложении, я не вижу NODE_ENV или CUSTOM.Есть идеи, что происходит?

Кстати, NODE_ENV = производственный узел app.js работает просто отлично.

Ответы [ 4 ]

40 голосов
/ 18 января 2012

Со страницы руководства sudo (версия sudo для Ubuntu)

Существует два различных способа работы с переменными среды.По умолчанию опция env_reset sudoers включена.Это приводит к тому, что команды выполняются с минимальным окружением, содержащим TERM, PATH, HOME, SHELL, LOGNAME, USER и USERNAME в дополнение к переменным из процесса вызова, разрешенного опциями endo_check и env_keep sudoers.Фактически существует белый список для переменных среды.

Sudo сбрасывает среду.Это неприятный аспект использования su и sudo в сценариях upstart или init.Последние версии upstart поддерживают указание uid / gid без использования 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

Для более старых версий 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 прямо здесь, если хотите.

3 голосов
/ 24 января 2013

Только для записи. Поваренная книга Upstart рекомендует использовать start-stop-daemon вместо su или sudo, когда ваша версия Upstart не реализует setuid.

Но, если вы все еще используете 10.04 LTS ( Lucid Lynx ), который имеет только Upstart версии 0.6.5, вы должны использовать директивы setuid/setgid.

1 голос
/ 22 августа 2013

Это работает для меня, чтобы установить переменные env узла в 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
0 голосов
/ 31 мая 2017

visudo имеет строку для определения переменных среды, которые будут сохраняться.

sudo visudo

и добавьте свой env к:

Defaults        env_keep="YOUR_ENV ..."

и перезагрузите компьютер.

...