¿Cómo hacer que una aplicación node.js se ejecute permanentemente?

259

En un servidor Debian, instalé Node.js. Entiendo cómo iniciar una aplicación desde masilla con esta línea de comando:

node /srv/www/MyUserAccount/server/server.js

y acceder a él en la dirección 50.51.52.53:8080(IP y puerto).

Pero tan pronto como cierro la masilla, ya no puedo alcanzar la dirección 50.51.52.53:8080.

¿Cómo hacer que una aplicación Node.js se ejecute permanentemente?

Como puedes adivinar, soy un principiante con Linux y Node.js.

Sam
fuente
77
Tenga en cuenta que pm2 es una buena alternativa a Forever , si no desea utilizar Forever por cualquier motivo.
Kevin B
gracias @KevinB github.com/Unitech/pm2 es una muy buena alternativa
Sachin Chavan

Respuestas:

221

Aunque las otras respuestas resuelven el problema del OP, todas son excesivas y no explican por qué él o ella está experimentando este problema.

La clave es esta línea, "Cierro masilla, entonces no puedo alcanzar la dirección"

Cuando haya iniciado sesión en su host remoto en Putty, ha iniciado un proceso de SSH Linux y todos los comandos escritos desde esa sesión de SSH se ejecutarán como elementos secundarios de dicho proceso.

Su problema es que cuando cierra Putty está saliendo de la sesión SSH que mata ese proceso y cualquier proceso secundario activo. Cuando cierra la masilla, inadvertidamente mata su servidor porque lo ejecutó en primer plano . Para evitar este comportamiento, ejecute el servidor en segundo plano agregando & a su comando:

node /srv/www/MyUserAccount/server/server.js &

El problema aquí es la falta de conocimiento de Linux y no una pregunta sobre el nodo. Para obtener más información, consulte: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

ACTUALIZAR:

Como otros han mencionado, el servidor de nodo aún puede morir al salir del terminal. Un problema común que he encontrado es que a pesar de que el proceso de nodo se ejecuta en bg, es stdout y stderr todavía apunta a la terminal. Esto significa que si el servidor de nodo escribe en console.log o console.error, recibirá un error de tubería rota y se bloqueará. Esto se puede evitar canalizando la salida de su proceso:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Si el problema persiste, debe buscar cosas como tmux o nohup , que son aún más robustas que las soluciones específicas de nodo, porque pueden usarse para ejecutar todo tipo de procesos (bases de datos, servicios de registro, otros idiomas).

Un error común que podría hacer que el servidor salga es que después de ejecutarlo nohup node your_path/server.js &simplemente cierre la terminal de Putty con un simple clic. En su exitlugar, debe usar el comando, luego su servidor de nodo estará en funcionamiento.

DogNibbler
fuente
77
Sin embargo, si todavía cierra la sesión de Putty mientras realiza &el servicio, también se cierra. (Acabo de probar en Debian Jesse)
NiCk Newman
1
Como dijo @NiCkNewman, ¡esta respuesta está incompleta! Vea la respuesta de Rick Roy para la solución correcta.
thejonwithnoh
19
El "&" hace que el proceso se ejecute en segundo plano, pero en realidad necesitaría agregar "nohup" al comienzo de este comando para separarlo de la ventana de la consola para que la aplicación no se detenga cuando la ventana se duerma después de unos segundos. horas, modificando el comando mencionado anteriormente para:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge
2
AIX powersystem, nohup node myApp.js &ejecutó la aplicación en el bg pero muere cuando se cerró el término. Aunque no estoy seguro de por qué.
AnBisw
44
@Annjawn, debes usar el exitcomando para salir de la terminal.
Ionut Necula
342

Puede instalar para siempre usando npm de esta manera:

sudo npm install -g forever

Y luego inicie su aplicación con:

forever server.js

O como un servicio:

forever start server.js

Forever reinicia su aplicación cuando se bloquea o se detiene por algún motivo. Para restringir los reinicios a 5, puede usar:

forever -m5 server.js

Para enumerar todos los procesos en ejecución:

forever list

Tenga en cuenta el número entero entre paréntesis y úselo de la siguiente manera para detener un proceso:

forever stop 0

Reiniciar un proceso en ejecución va:

forever restart 0

Si está trabajando en su archivo de aplicación, puede usar el -wparámetro para reiniciar automáticamente cada vez server.jsque cambie su archivo:

forever -w server.js
N20
fuente
11
@MarthaJames si se cierra cuando se cierra su sesión / ventana ssh, entonces probablemente olvidó incluir "inicio" en elforever start <file>
Kristian
8
¿Cuál es la diferencia entre usar forever server.jsy forever start server.js? Sé que dice que es "como un servicio", pero ¿qué significa eso?
Marquizzo
55
Cuando escribo forever server.js, inicia el servidor. Si presiono Ctrl+ C, se detiene el servicio. Si forever start server.jsescribo, inicia el servicio e incluso si presiono Ctrl+ Cpermanece abierto. Luego puede hacer los otros comandos mencionados anteriormente para detener / mirar la lista. Eso es lo que experimenté al menos.
Termato
66
¿Esto inicia el script después de reiniciar el servidor?
beingalex
1
El forevermódulo (v0.15.3) es vulnerable a los ataques de denegación de servicio de expresión regular y no debe usarse: github.com/foreverjs/forever/issues/960
Benny Neugebauer
82

Puede usar PM2 , es un administrador de procesos de producción para aplicaciones Node.js con un equilibrador de carga incorporado.

Instalar PM2

$ npm install pm2 -g

Inicia una aplicación

$ pm2 start app.js

Si usa Express, puede iniciar su aplicación como

pm2 start ./bin/www --name="app"

Listado de todos los procesos en ejecución:

$ pm2 list

Enumerará todo el proceso. Luego puede detener / reiniciar su servicio utilizando la ID o el nombre de la aplicación con el siguiente comando.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Para mostrar registros

$ pm2 logs ['all'|app_name|app_id]
Vikash Rajpurohit
fuente
1
¡Dios te bendiga! ¡¡funciona!! Forever y Nohup no funcionan en el servidor web amazon bitnami nodejs ( docs.bitnami.com/aws/infrastructure/nodejs ). ¡PM2 funciona muy bien!
polras
Esta biblioteca parece tener el mayor número de inicios en github
DragonFire
41

Recomiendo buscar algo como Forever para reiniciar Node en el caso de un bloqueo, y manejar el demonio por usted.

Puntilla
fuente
Me gustaría señalar que sin nohup, el nodo saldrá cuando salga de la sesión ssh si lo ejecuta de esta manera (a menos que esté usando algo como screen para tmux).
Haozhun
1
@Haozhun, Interesante, pero no es así como me ha funcionado en mis máquinas. Cuando ingreso y comienzo algo con este comando, se ejecuta para siempre en segundo plano, incluso después de cerrar la sesión SSH.
Brad
@Brad Consulte la segunda respuesta en stackoverflow.com/questions/4018154/… . Parece que algunas personas están de acuerdo con el primer comentario de esa pregunta que explica nohup. Sería genial si podemos resolver esta confusión. Pero no sé por dónde empezar.
Haozhun
44
Para la mayoría de los Unixen (incluidas la mayoría de las distribuciones de Linux), ejecutar cosas en segundo plano aún matará el proceso si cierra la ventana del terminal. Para evitar esto, ejecútelo con nohup. Ejemplo:nohup node app.js &
slebetman
1
Yo uso Forever con un entorno de producción de Linux. Por lo general, uso el comando start para siempre --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil
36

Si solo desea ejecutar su aplicación de nodo en la terminal siempre, solo use la pantalla.

Instalar en ubuntu / debian:

sudo apt-get install screen

Uso:

$ screen
$ node /path/to/app.js

ctrl + ay luego ctrl + ddespedir

Para volver está de vuelta:

Una pantalla: screen -r

Si hay más de uno, puede enumerar todas las pantallas con: screen -ls

Y entonces: screen -r pid_number

film42
fuente
1
Esta es una buena opción, ya que también me permite cambiar el proceso a primer plano en cualquier momento
ejemplo, el
26

Simplemente podrías usar esto

nohup node /srv/www/MyUserAccount/server/server.js &

Esto mantendrá la aplicación ejecutándose y para cerrarla, tendrá que eliminarla.

Para eso, puede instalar htopy luego buscar el nodo y luego matarlo

Rick Roy
fuente
18
Es importante tener en cuenta que en este caso, el usuario necesitaría salir de la sesión PuTTY correctamente (es decir, a través del exitcomando). Si el usuario simplemente cierra la ventana, esto puede usar una señal que no sea SIGHUPpara finalizar el proceso y, por lo tanto, el nodo se cerraría de todos modos.
thejonwithnoh
1
+1 por ser una solución simple de Linux para todo el problema. Esto es mejor que la respuesta de DogNibbler .
thejonwithnoh
@thejonwithnoh después de leer tu comentario, he intentado cerrar bruscamente la masilla pero el servidor aún funcionaba, tal vez tuvo que ver con la configuración del entorno. Pero pensé que lo que el OP estaba pidiendo sería la forma más sencilla de lograrlo
Rick Roy el
Me gusta este enfoque simple, es el que estoy usando, ya que para matarlo, el más fácil es solo un killall node, que matará todos los procesos de nodo, en mi caso solo uno.
Nelson
@Nelson Eso eliminaría todos los procesos de nodo, y si tiene varios scripts en ejecución y solo desea terminar uno específico, le sugiero que encuentre el proceso y luego finalice ese proceso en particular en caso de que haya múltiples procesos de nodo ejecutándose en un servidor de producción y no quiero tener ganas de entrar en una pesadilla: D
Rick Roy
12

Forever es un muy buen módulo de NodeJs para hacer exactamente eso.

Instalar foreverescribiendo en la línea de comando

$ npm install forever -g

Luego use el siguiente comando para ejecutar un script node.js

$ forever start /path/to/script.js

Tú eres bueno para irte. Además puedes correr

$ forever list

para ver todos los scripts en ejecución. Puede terminar cualquier script específico escribiendo

$ forever stop [pid]

¿Dónde [pid]está el ID de proceso del script que obtendrá del listcomando? Para detener todas las secuencias de comandos, puede escribir

$ forever stopall

fuente
10

no funciona, me registré en AWS Ubunto vm, siga el correctosyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

luego presione enter verá esta línea

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

luego escribe esto

rm nohup.out

ingrese la descripción de la imagen aquí

Adiii
fuente
3
Me gusta cómo borró el nombre de host en el pequeño aviso de bash, pero lo dejó en el título grande de la ventana con
conny
10

Instalación

$ [sudo] npm install forever -g

Puedes usar forever para ejecutar scripts continuamente

forever start server.js

forever list

para detener el servicio

forever stop server.js
Sudhir singh
fuente
9

Aquí hay una solución nueva que he estado usando para mis proyectos personales:

Colocarlo en /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Esto también se encargará de reaparecer su aplicación en caso de que falle. Renunciará a los intentos de reactivar su aplicación si se bloquea 3 o más veces en menos de 15 segundos.

Adam Eberlin
fuente
9

Durante el desarrollo, recomiendo usar nodemon . Reiniciará su servidor cada vez que cambie un archivo. Como otros han señalado, Forever es una opción, pero en producción, todo depende de la plataforma que esté utilizando. Por lo general, querrá utilizar la forma recomendada del sistema operativo para mantener los servicios actualizados (por ejemplo, http://www.freedesktop.org/wiki/Software/systemd/ ).

Olivier Lalonde
fuente
Esto funcionó para mí en una aplicación MEAN.JS - nodemonejecuta el comando ronco menos que especifique un archivo JS servidor, por lo que estoy usando esto para ejecutar mongo y el nodo para siempre / al mismo tiempo
J-Dizzle
8

He encontrado siempre para hacer el trabajo perfectamente bien.

Suponiendo que ya tiene instalado npm, si no, simplemente hágalo

sudo apt-get install npm

Luego instalar para siempre

npm install forever --global

Ahora puedes ejecutarlo así

forever start app.js

https://codingweb.io/run-nodejs-application-background/

erax
fuente
npm rm -g para siempre por eliminarlo
DragonFire
6

Primero instala pm2 a nivel mundial

npm install -g pm2

entonces empezar

pm2 start bin/www 
Vinayak Shedgeri
fuente
5

Otra forma es crear una unidad del sistema para su aplicación. cree un archivo "XXX.service" en la carpeta "/ etc / systemd / system", similar a esto:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Un beneficio es que la aplicación se ejecutará como un servicio, se reinicia automáticamente si se bloquea.

También puede usar sytemctl para administrarlo:

systemctl start XXXpara iniciar el servicio, systemctl stop XXXdetenerlo e systemctl enable XXXiniciar automáticamente la aplicación cuando se inicia el sistema.

Alex
fuente
4

Espero que esto ayude.

En la línea de comando, instale para siempre:

npm install forever -g

Crea un archivo de ejemplo:

sudo nano server.js 

Puede editar el archivo y obtener resultados directamente en su navegador.
Puede usar filezilla o cualquier editor para editar el archivo. Ejecute este comando para ejecutar el archivo:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

ingrese la descripción de la imagen aquí

Ghanshyam Nakiya
fuente
4

No es necesario instalar ningún otro paquete.

Ejecute este comando

node server.js > stdout.txt 2> stderr.txt &

server.js es su archivo de servidor o puede ser api.js

Después de eso, presione " salir " para cerrar la terminal

exit
Gajender Singh
fuente
0

El paquete forever funcionó para mí, solo una cosa, depende de la igualdad profunda , por lo que si tuvo problemas para instalarlo como:

npm -g install forever

Tratar:

npm -g install forever deep-equal@1.1.1

en lugar.

Alireza
fuente