socket - ¿Cómo ejecuto una aplicación Node.js como su propio proceso?
npm (16)
¿Cuál es la mejor forma de implementar Node.js?
Tengo un Dreamhost VPS (así es como lo llaman una VM ), y he podido instalar Node.js y configurar un proxy. Esto funciona muy bien siempre que mantenga la conexión SSH que comencé con el nodo abierto.
Aquí hay un artículo más extenso sobre cómo resolver este problema con systemd: http://savanne.be/articles/deploying-node-js-with-systemd/
Algunas cosas para tener en mente:
- ¿Quién comenzará su monitoreo de proceso? Forever es una gran herramienta, pero necesita una herramienta de monitoreo para mantenerse en funcionamiento. Eso es un poco tonto, ¿por qué no usar tu sistema init?
- ¿Puedes controlar adecuadamente tus procesos?
- ¿Estás ejecutando múltiples backends? De ser así, ¿tiene disposiciones para evitar que alguna de ellas disminuya a las demás en términos de uso de recursos?
- ¿El servicio será necesario todo el tiempo? Si no, considere la activación del socket (ver el artículo).
Todas estas cosas se hacen fácilmente con systemd.
Como dijo Box9, Forever es una buena opción para el código de producción. Pero también es posible mantener un proceso en marcha incluso si la conexión SSH está cerrada desde el cliente.
Aunque no es necesariamente una buena idea para la producción, es muy útil cuando se realizan sesiones de depuración largas, o para seguir la salida de la consola de procesos largos, o siempre que sea útil desconectar su conexión SSH, pero mantener la terminal activa en el servidor para reconectarse más tarde (como iniciar la aplicación Node.js en casa y volver a conectarse a la consola más tarde en el trabajo para comprobar cómo van las cosas).
Suponiendo que su servidor es un cuadro * nix, puede utilizar el comando de screen desde el shell para mantener el proceso en ejecución incluso si el cliente SSH está cerrado. Puede descargar / instalar la pantalla de la web si aún no está instalado (busque un paquete para su distribución si es Linux, o use MacPorts si es OS X).
Funciona de la siguiente manera:
- Cuando abra por primera vez la conexión SSH, escriba ''pantalla'' - esto iniciará su sesión de pantalla.
- Comience a trabajar normalmente (es decir, inicie su aplicación Node.js)
- Cuando termine, cierre su terminal. Su (s) proceso (s) de servidor continuarán ejecutándose.
- Para volver a conectarse a su consola, vuelva al servidor, inicie sesión e ingrese ''screen -r'' para volver a conectar. El contexto de la consola anterior volverá a estar listo para que pueda volver a usarlo.
- Para salir de la pantalla, mientras está conectado al servidor, escriba ''exit'' en el indicador de la consola, que lo llevará al shell normal.
Si es necesario, puede tener varias sesiones de pantalla simultáneas como esta, y puede conectarse a cualquiera de ellas desde cualquier cliente. Lea la documentación en línea para todas las opciones.
En su caso, puede usar el daemon upstart . Para una solución de implementación completa, puedo sugerir capistrano . Dos guías útiles son Cómo configurar Node.js env y Cómo implementar vía capistrano + upstart .
Forever es una buena opción para mantener las aplicaciones en ejecución (y es npm instalable como un módulo que es bueno).
Pero para una "implementación" más seria -como la administración remota de la implementación, reinicio, ejecución de comandos, etc.- utilizaría capistrano con la extensión del nodo.
He escrito sobre mi método de implementación aquí: Implementar aplicaciones node.js
En breve:
He escrito una guía bastante completa para implementar Node.js, con archivos de ejemplo:
Tutorial: Cómo implementar aplicaciones Node.js, con ejemplos
Hice un script Upstart actualmente utilizado para mis aplicaciones:
description "YOUR APP NAME"
author "Capy - http://ecapy.com"
env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"
######################################################
start on runlevel [2345]
stop on runlevel [016]
respawn
respawn limit 99 5
pre-start script
mkdir -p $PID_PATH
mkdir -p /var/log/node
end script
script
export NODE_ENV=$SERVER_ENV
exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script
post-start script
echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script
Personalice todo antes de #########, cree un archivo en /etc/init/your-service.conf y péguelo allí.
Entonces tú puedes:
start your-service
stop your-service
restart your-service
status your-service
Pruebe node-deploy-server . Es un conjunto de herramientas complejo para implementar una aplicación en sus servidores privados. Está escrito en Node.js y usa npm para la instalación.
Una guía excelente y detallada para implementar aplicaciones Node.js con Capistrano, Upstart y Nginx
Puede usar monit
, forever
, upstart
o systemd
para iniciar su servidor.
Puede utilizar Varnish o HAProxy en lugar de Nginx (se sabe que Nginx no funciona con websockets).
Como una solución rápida y sucia, puede usar nohup node your_app.js &
evitar que su aplicación finalice con su servidor, pero forever
, monit
y otras soluciones propuestas son mejores.
Si tiene acceso de administrador, sería mejor configurar un daemon para que funcione de manera segura en segundo plano. Puede leer cómo hacer eso para Debian y Ubuntu en la publicación de blog Run Node.js as a Service en Ubuntu .
Use para Forever Ejecuta programas Node.js en procesos separados y los reinicia si alguno muere.
Uso:
-
forever start example.js
para iniciar un proceso. -
forever list
paraforever list
para ver la lista de todos los procesos iniciados por siempre -
forever stop example.js
para detener el proceso, oforever stop 0
para detener el proceso con el índice 0 (como se muestra por laforever list
).
pm2 hace los trucos.
Las características son: Monitoreo, recarga de código caliente, equilibrador de carga integrado, script de inicio automático y procesos de resucitación / volcado.
https://paastor.com es un servicio relativamente nuevo que realiza la implementación para usted, para un VPS u otro servidor. Hay una CLI para impulsar el código. Paastor tiene un nivel gratuito, al menos lo hizo en el momento de publicarlo.
Forever hará el truco.
@Kevin: Deberías poder matar procesos bien. Verificaría un poco la documentación un poco. Si puedes reproducir el error, sería genial publicarlo como un problema en GitHub.
Respuesta de 2016 : casi todas las distribuciones de Linux vienen con systemd, lo que significa que para siempre, monit, etc. ya no son necesarias; su sistema operativo ya maneja estas tareas .
Cree un archivo myapp.service
(reemplazando ''myapp'' con el nombre de su aplicación, obviamente):
[Unit]
Description=My app
[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note RHEL/Fedora uses ''nobody'', Debian/Ubuntu uses ''nogroup''
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp
[Install]
WantedBy=multi-user.target
Tenga en cuenta que si es nuevo en Unix: /var/www/myapp/app.js
debería tener #!/usr/bin/env node
en la primera línea.
Copie su archivo de servicio en la carpeta /etc/systemd/system
.
Informe a systemd sobre el nuevo servicio con systemctl daemon-reload
.
Comience con systemctl start myapp
.
Habilítelo para que se ejecute al arrancar con systemctl enable myapp
.
Ver registros con journalctl -u myapp
Más detalles en: Cómo implementamos aplicaciones de nodo en Linux, edición 2018