8

Estoy usando el paquete npm express versión 2.5.2 con la versión de nodo .0.6.5. Parece que estoy ejecutando la versión 4.1.5 de Bash en Debian 4.4.5.¿Cómo puedo ejecutar node.js Express en modo de producción a través de sudo?

Estoy tratando de ejecutar mi servidor en modo de producción, pero todavía se ejecuta en modo de desarrollo.

que ejecutar estos comandos en mi shell bash:

$ export NODE_ENV=production 
$ echo $NODE_ENV 
production 
$ sudo echo $NODE_ENV 
production 
$ sudo node bootstrap.js 

tengo este código dentro de bootstrap.js:

var bootstrap_app = module.exports = express.createServer(); 
//... 
console.log(bootstrap_app.settings.env); 

y esto es lo que veo impreso en la salida estándar:

development 

¿Esto es un problema con mi uso o con mi sistema?

EDIT: Gracias a ThiefMaster por haber identificado correctamente que este problema proviene de mi nodo en ejecución como root. ThiefMaster sugirió usar iptables para reenviar desde el puerto 80 a un puerto no privilegiado, pero mi sistema me da un error. Mover esta discusión a superuser.com o serverfault.com (enlace a seguir)

+2

La mayoría de las variables de entorno no están configuradas cuando se usa sudo por razones de seguridad. Por lo tanto, no puede pasar esa variable de entorno a nodo sin modificar su archivo sudoers para permitir que esa variable pase. Sin embargo, no debería ejecutar el nodo como raíz de todos modos. Si solo lo necesita para el puerto 80, ejecute el nodo en un puerto no privilegiado y configure un reenvío de iptables para asignar el puerto 80 a ese puerto. – ThiefMaster

+0

¡Gracias por la sugerencia! Ejecuto una de mis aplicaciones que no son de puerto 80 e identificó correctamente el entorno como producción. Debería publicar esto como una respuesta: lo aceptaré. ¡Gracias de nuevo! – Aaron

+0

Acabo de intentar instalar y usar iptables (iptables -t -nat L) y obtuve el error "iptables v1.4.8: no se puede inicializar la tabla iptables' nat ': Permiso denegado (debe ser root) Quizás iptables o su kernel necesita ser actualizado" Debian 4.4 es una versión bastante antigua, ¿verdad?/Proc/versión dice" Linux versión 3.1.9-vs2.3.2.5 " – Aaron

Respuesta

9

La mayoría de las variables de entorno no están configuradas cuando se usa sudo por razones de seguridad. Por lo tanto, no puede pasar esa variable de entorno a nodo sin modificar su archivo sudoers para permitir que esa variable pase.

Sin embargo, no debe ejecutar el nodo como raíz de todos modos. Así que aquí es una buena solución:
Si sólo lo necesita para el puerto 80, el nodo se ejecuta en un puerto no privilegiado y una configuración de iptables hacia adelante para asignar el puerto 80 a ese puerto:

iptables -A PREROUTING -d 1.2.3.4/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.3.4.5:1234 

Reemplazar 1.2.3.4 con su público IP, 2.3.4.5 con el nodo IP se ejecuta (podría ser el público o 127.0.0.1) y 1234 con el nodo de puerto se ejecuta.


Con un núcleo suficientemente reciente que tiene el soporte de capacidad también se podría conceder al node ejecutable el privilegio CAP_NET_BIND_SERVICE con el siguiente comando como root:

setcap 'cap_net_bind_service=+ep' /usr/bin/node 

Tenga en cuenta que esto permitirá que cualquier usuario de su sistema de para abrir puertos privilegiados usando un nodo!

+0

Intenté la primera solución, usando iptables, y estoy Todavía tengo problemas para ejecutarlo, incluso utilizando mis privilegios sudoer. He publicado todo el mensaje de error como una edición de mi pregunta (para hacer uso del formato que permite) – Aaron

+2

Probablemente sería mejor preguntar sobre eso en http : //superuser.com o http://serverfault.com. – ThiefMaster

+0

¿Por qué no utilizar 'authbind'? – configurator

2
sudo NODE_ENV=production /usr/local/bin/node /usr/local/apps/test/app.js 
Cuestiones relacionadas