Подтвердить что ты не робот

Upstart env stanza не устанавливает переменные среды (например, NODE_ENV) для приложения Node.js

У меня есть Upstart script для моего сервера, который выглядит так:

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 работает отлично.

4b9b3361

Ответ 1

Из sudo man page (версия Ubuntu sudo)

Существует два разных способа решения переменных окружения. По умолчанию, env_reset sudoers        опция включена. Это приводит к выполнению команд с минимальной средой, содержащей TERM,        PATH, HOME, SHELL, LOGNAME, USER и USERNAME в дополнение к переменным из процесса вызова        разрешено параметрами env_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

Для более старых версий выскочки, вот что я использовал, чтобы обойти это.

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 прямо там, если хотите.

Ответ 2

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

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

Ответ 3

Это работало для меня, чтобы установить node 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

Ответ 4

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

sudo visudo

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

Defaults        env_keep="YOUR_ENV ..."

и перезагрузитесь.