node.js ubuntu environment-variables upstart

La sta de env upstart no configura variables de entorno(como NODE_ENV) para la aplicación Node.js



ubuntu environment-variables (4)

Tengo un script Upstart para mi servidor que se ve así:

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

Sin embargo, la aplicación no ve NODE_ENV configurado en producción. De hecho, si console.log (process.env) dentro de la aplicación, no veo NODE_ENV o CUSTOM. ¿Alguna idea de lo que está pasando?

Por cierto, NODE_ENV = nodo de producción app.js funciona bien.


Esto me ha funcionado para establecer las variables env de nodo en 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


Para que conste. El Upstart Cookbook recomienda el uso de start-stop-daemon lugar de su o sudo cuando su versión Upstart no implementa setuid .

Pero, a menos que todavía esté utilizando 10.04 LTS ( Lucid Lynx ) que solo tiene Upstart versión 0.6.5, debe usar las directivas setuid/setgid .


Desde la página sudo man (versión Ubuntu de sudo)

Hay dos formas distintas de tratar con variables de entorno. De forma predeterminada, la opción env_reset sudoers está habilitada. Esto hace que los comandos se ejecuten con un entorno mínimo que contiene TERM, PATH, HOME, SHELL, LOGNAME, USER y USERNAME además de las variables del proceso de invocación permitido por las opciones env_check y env_keep sudoers. Existe efectivamente una lista blanca para variables de entorno.

Sudo está restableciendo el ambiente. Este es un aspecto frustrante del uso de su y sudo en los scripts upstart o init. Las versiones recientes de soporte advenedizo especifican uid / gid sin el uso de sudo a través de las directivas setuid/setgid como en el ejemplo a continuación. También tenga en cuenta el uso de 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

Para versiones anteriores de advenedizo, esto es lo que solía hacer para evitarlo.

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

Tenga en cuenta que simplemente puse un archivo node_env.txt en la raíz de mi aplicación que establece el modo de producción, porque odio las variables de entorno . Solo puede hacer NODE_ENV=production allí si lo prefiere.


visudo tiene una línea para definir las variables de entorno que se mantendrán.

sudo visudo

y agrega tu env a:

Defaults env_keep="YOUR_ENV ..."

y reiniciar