Gestión de procesos cuando desplegamos una aplicación NodeJS en un Servidor Cloud

Hace ya un tiempo que vimos Cómo instalar NodeJS en un Servidor Cloud Linux y Cómo desplegar una aplicación NodeJS en un Servidor Cloud, ahora vamos un paso más allá en las configuraciones avanzadas que nos permiten sacar el máximo partido en los servidores con varios núcleos, ejemplificándolo principalmente con Servidores Cloud de varios vCores, pero lo mismo sucede también cuando trabajamos con un Servidor Dedicado con varios nucleos.

La plataforma de ejecución de NodeJS consta generalmente de un único hilo, debido a que el propio lenguaje JavaScript es single-thread. Entonces ¿qué ocurre si en un Servidor Cloud disponemos de un procesador que virtualiza varios núcleos? En principio, si no tenemos en cuenta realizar pasos extra, debido al propio lenguaje, no estaríamos aprovechando las capacidades de una máquina multihilo.

A continuación, vamos a hablar de una solución sencilla para poder resolver esta situación, junto con otra también muy importante: ¿qué pasa si la máquina se debe reiniciar con las aplicaciones Node que están ejecutándose?, ¿o si surge un problema en su ejecución y las aplicaciones se detienen? Por supuesto, lo ideal es que se vuelvan a arrancar, pero la realidad es que no lo consiguen hacer por sí solas, a no ser que realicemos algunos pasos extra.

El paquete PM2

PM2 es un paquete de npm que se puede instalar en el servidor para solucionar los problemas anteriores, y muchos otros, ya que consta de una increíble suite de software y servicios útiles en el despliegue de aplicaciones NodeJS. Puedes encontrar todo el detalle en su correspondiente página web.

Para usar PM2 como gestor de procesos en nuestro servidor, tenemos que comenzar por instalar este paquete:

npm install -g pm2

Gestión de procesos

Ahora, en vez de ejecutar las aplicaciones NodeJS directamente con el comando correspondiente, lo haremos a través de PM2.

pm2 start app.js

Con esto, hemos conseguido nuestro primer paso, que es disponer de PM2 como gestor de este proceso. Pero seguro que querremos ir un poco más allá. La opcion -i nos sirve para definir el número de núcleos que usará en nuestro sistema. Una configuración habitual es la siguiente:

pm2 start app.js -i max

Al indicarle max estamos diciendo que arranque en modo cluster y use el máximo número de procesos, tantos como núcleos se disponga en la máquina virtual.

Lanzado el anterior comando, en un servidor cloud con 4 nodos obtendremos la siguiente salida:

Rearranque de los procesos ante los reinicios

Otra cosa que seguramente vamos a querer configurar también, es el reinicio de los procesos cuando éstos se detienen por cualquier motivo, ya sea por un apagado de la máquina o por un fallo que pare la ejecución de la aplicación.

Gracias a PM2 este paso es extremadamente sencillo. Básicamente, se trata de configurar el sistema de arranque del servidor con este comando:

pm2 startup

Y luego salvar la configuración de procesos actual, con el comando:

pm2 save

PM2 se encargará de realizar todas las configuraciones necesarias para realizar el arranque y crear de nuevo los procesos que estaban configurados.

Comprobar los procesos arrancados

Para probar la configuración puedes hacer un reinicio de la máquina, con el comando reboot de Linux.

Ahora, o en cualquier momento que se necesite, es posible comprobar qué procesos se encuentran arrancados, cuánta memoria ocupan y qué porcentaje de recursos del procesador. Lo conseguimos con el comando:

pm2 status

Una vez reiniciado el procesador, deberíamos comprobar que todos los procesos se encuentran arrancados, tal como aparece en la imagen anterior.

PM2 es una herramienta compleja, pero que tiene muchas más opciones y posibilidades. Te recomendamos una lectura atenta de su documentación oficial.