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