Estoy usando el módulo de nodo para siempre para mantener mi servidor de nodo en ejecución. Sin embargo, para siempre termina cuando hay un reinicio del sistema. ¿Hay alguna manera de que pueda iniciar automáticamente el servidor de nodo (con forever) cuando el sistema se reinicia?
190
Respuestas:
Sugeriría usar crontab. Es facil de usar.
Cómo
Para comenzar a editar, ejecute lo siguiente reemplazando el "usuario de prueba" con el usuario de tiempo de ejecución deseado para el proceso de nodo. Si elige un usuario diferente a usted, tendrá que ejecutar esto con sudo.
Si nunca ha hecho esto antes, le preguntará con qué editor desea editar. Me gusta vim, pero recomendaré nano para facilitar su uso.
Una vez en el editor, agregue la siguiente línea:
Guarda el archivo. Debería recibir algún comentario de que el cron se ha instalado.
Para obtener más confirmación de la instalación del cron, ejecute lo siguiente (nuevamente reemplazando "testuser" con su nombre de usuario objetivo) para enumerar los crons instalados actualmente:
Tenga en cuenta que, en mi opinión, siempre debe usar rutas completas al ejecutar binarios en cron. Además, si la ruta a su script para siempre no es correcta, ejecute
which forever
para obtener la ruta completa.Teniendo en cuenta esas
forever
llamadasnode
, es posible que también desee proporcionar la ruta completa paranode
:Otras lecturas
fuente
@reboot
cron se ejecutan en el inicio del cron deamon. Para agregar, nunca me he encontrado con una situación que sugiera que mis cron que están configurados en@reboot
no se ejecutan en el arranque del sistema. La forma en que lo apaga es irrelevante para esto./home
aún no está montado, por lo que esto no funcionará si su código vive/home
.@reboot varname=value ...
Puede usar el servicio para siempre para hacer esto.
Esto proporcionará app.js en el directorio actual como un servicio para siempre. El servicio se reiniciará automáticamente cada vez que se reinicie el sistema. Además, cuando se detenga, intentará una parada elegante. Este script también proporciona el script logrotate.
URL de Github: https://github.com/zapty/forever-service
NOTA: Soy el autor de forever-service.
fuente
forever-service install test
,test
será el nombre del servicio , pero no el nombre del archivo .js del programa / nodo real a ejecutar. Por defecto, se supone que el nombre del programa esapp.js
, pero se puede anularlo con la--script
bandera, de la siguiente manera:forever-service install test --script main.js
. (No probado, así que corríjame si hay algún detalle de sintaxis incorrecto).Este caso es válido para Debian.
Agregue lo siguiente a
/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
reemplaza su nombre de usuario.{{app path}}
reemplaza la ruta de su aplicación. Por ejemplo,/var/www/test/app.js
fuente
/etc/rc.local
, no/etc/init.d/rc.local
app.js
para garantizar que los archivos relativos se carguen correctamente -process.chdir('/your/path/to/your/app');
Node.js ref docs here/etc/rc.local
me( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Instale PM2 globalmente usando NPM
npm install pm2 -g
Comience su secuencia de comandos con pm2
pm2 start app.js
generar un script de inicio activo
pm2 startup
NOTA: el inicio de pm2 es para iniciar el PM2 cuando el sistema se reinicia. PM2 una vez iniciado, reinicia todos los procesos que había estado administrando antes de que el sistema se cayera.
En caso de que desee deshabilitar el inicio automático, simplemente use pm2 unstartup
Si desea que el script de inicio se ejecute bajo otro usuario, simplemente use la
-u <username>
opción y el--hp <user_home>:
fuente
Un método alternativo de crontab inspirado en esta respuesta y esta publicación de blog.
1. Cree un archivo de script bash (cambie bob al usuario deseado).
2. Copie y pegue esto dentro del archivo que acaba de crear.
¡Asegúrese de editar las rutas anteriores de acuerdo con su configuración!
3. Asegúrese de que se pueda ejecutar el script bash.
4. Pruebe el script bash.
5. Reemplace "bob" con el usuario de tiempo de ejecución para el nodo.
6. Copie y pegue (cambie bob al usuario deseado).
Guarda el crontab.
Has llegado al final, tu premio es un reinicio (para probar) :)
fuente
Respuesta copiada de la pregunta adjunta .
Puede usar PM2 , es un administrador de procesos de producción para aplicaciones Node.js con un equilibrador de carga incorporado.
Instalar PM2
Inicia una aplicación
Si usa Express, puede iniciar su aplicación como
Listado de todos los procesos en ejecución:
Enumerará todo el proceso. Luego puede detener / reiniciar su servicio utilizando la ID o el nombre de la aplicación con el siguiente comando.
Para mostrar registros
fuente
$pm2 startup
después de eso verá pm2 pidiendo ejecutar manualmente un comando, copiar y ejecutar eso. Entonces,$pm2 save
ahora su app.js sobrevivirá a los reinicios del sistemaNecesita crear un script de shell en la carpeta /etc/init.d para eso. Es un poco complicado si nunca lo ha hecho, pero hay mucha información en la web sobre scripts init.d.
Aquí hay una muestra de un script que creé para ejecutar un sitio CoffeeScript para siempre:
Tenía que asegurarme de que la carpeta y las RUTA estuvieran establecidas explícitamente o disponibles para el usuario raíz ya que las secuencias de comandos init.d se ejecutan como raíz.
fuente
Usa el PM2
¿Cuál es la mejor opción para ejecutar el servidor de producción del servidor?
¿Cuáles son las ventajas de ejecutar su aplicación de esta manera?
PM2 reiniciará automáticamente su aplicación si se bloquea.
PM2 mantendrá un registro de sus excepciones no controladas, en este caso, en un archivo en /home/safeuser/.pm2/logs/app-err.log.
Con un comando, PM2 puede garantizar que cualquier aplicación que administre se reinicie cuando el servidor se reinicie. Básicamente, su aplicación de nodo comenzará como un servicio.
ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
fuente
Forever no se creó para que las aplicaciones de nodo se ejecuten como servicios. El enfoque correcto es crear una entrada / etc / inittab (sistemas linux antiguos) o una fuente nueva (sistemas linux más nuevos).
Aquí hay alguna documentación sobre cómo configurar esto como un arranque: https://github.com/cvee/node-upstart
fuente
crontab
no me funciona en CentOS x86 6.5. @reboot parece no funcionar.Finalmente obtuve esta solución:
Editar:
/etc/rc.local
Agregue esta línea al final del archivo. Cambio
USER_NAME
yPATH_TO_PROJECT
para los tuyos.NODE_ENV=production
significa que la aplicación se ejecuta en modo de producción. Puede agregar más líneas si necesita ejecutar más de una aplicación node.js.No establezca
NODE_ENV
en una línea separada, su aplicación seguirá ejecutándose en modo de desarrollo, porque no siempre se obtieneNODE_ENV
.Guarde y salga de vi (presione
ESC : w q return
). Puede intentar reiniciar su servidor. Después de que su servidor se reinicie, su aplicación node.js debería ejecutarse automáticamente, incluso si no inicia sesión en ninguna cuenta de forma remota a través de ssh.Será mejor que establezca el
NODE_ENV
entorno en su shell.NODE_ENV
se configurará automáticamente cuando su cuentaUSER_NAME
inicie sesión.Para que pueda ejecutar comandos como detener / iniciar para siempre a
/PATH_TO_PROJECT/app.js
través de ssh sin configurarNODE_ENV
nuevamente.fuente
Escribí un script que hace exactamente esto:
https://github.com/chovy/node-startup
No lo he intentado para siempre, pero puedes personalizar el comando que ejecuta, por lo que debería ser sencillo:
fuente
Intenté muchas de las respuestas anteriores. Ninguno de ellos funcionó para mí. Mi aplicación está instalada en
/home
y como usuario, no como root. Esto probablemente significa que cuando se ejecutan los scripts de inicio mencionados anteriormente,/home
aún no está montado, por lo que la aplicación no se inicia.Luego encontré estas instrucciones de Digital Ocean:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Usar PM2 como se explicó fue muy simple y funciona perfectamente: mis servidores virtuales tuvieron dos fallas físicas desde entonces: el tiempo de inactividad fue de aproximadamente un minuto.
fuente
El problema con rc.local es que se accede a los comandos como root, lo que es diferente de iniciar sesión como usuario y usar sudo.
Resolví este problema agregando un script .sh con los comandos de inicio que quiero, etc / profile.d. Cualquier archivo .sh en profile.d se cargará automáticamente y cualquier comando será tratado como si usaras el sudo regular.
El único inconveniente de esto es que el usuario especificado necesita iniciar sesión para que las cosas comiencen, lo que en mi situación siempre fue el caso.
fuente
ejemplo completo crontab (ubicado en / etc / crontab) ..
fuente
Puede usar el siguiente comando en su shell para iniciar su nodo para siempre:
Debe tener en cuenta que el servidor en el que se ejecuta su aplicación siempre debe mantenerse encendido.
fuente