Un tema importante a tener en cuenta para la salida a producción en el ecosistema del desarrollo de aplicaciones en Node.js es la gestión de procesos y el monitoreo de la aplicación, y ahí es donde entra en juego el famoso PM2.
Si bien en desarrollo no es crítico, a la hora colocar el proyecto en producción estos puntos se transforman en aspectos muy importantes para asegurar un adecuado rendimiento y la estabilidad de las aplicaciones en un entorno de producción.
Para poder cumplir con ambas tareas existe una herramienta llamada PM2 que es ampliamente usada porque facilita estas tareas, principalmente ofreciendo una solución confiable y además sencilla para manejar aplicaciones Node.js, por eso en este artículo, revisaremos qué es PM2, para qué sirve y cuáles son sus beneficios, y por supuesto cómo se instala y cómo se configura, además se repasará los comandos más básicos y útiles que se necesita conocer.
Contenido
Qué es PM2
Para resumir, se puede definir a PM2 (Process Manager 2) como un administrador de procesos para aplicaciones Node.js que permite ejecutar en segundo plano aplicaciones desarrolladas en JavaScript, monitorear su rendimiento y asegurar que se reinicien automáticamente en caso de fallos.
Es una herramienta open-source, y junto a otras como NVM es ampliamente utilizada en la comunidad de Node.js debido a que proporciona una interfaz de línea de comandos que facilitan la gestión de aplicaciones en producción.
Beneficios de usar PM2
Como mencionamos, PM2 es una herramienta de gestión de procesos para aplicaciones Node.js que nos ofrece una variedad de comandos útiles para la gestion y sobre todo para el despliegue y el mantenimiento de aplicaciones en un servidor de producción, a continuación vamos a repasar alguno de los principales beneficios de utilizarlo y proporcionando ejemplos concretos para ver mejor su utilidad.
El principal motivo para usar PM2 es por su facilidad de uso, permite gestionar multiples aplicaciones Node.js con una serie de comandos sencillos e intuitivos, es justamente esta facilidad de uso lo que reduce la curva de aprendizaje y facilita enormemente la gestión para usuarios de todos los niveles, especialmente a los usuarios menos experimentados o sin demasiada experiencia.
Por ejemplo, para iniciar una aplicación, es tan sencillo como escribir el comando pm2 start app.js , mientras que para detenerla, se utiliza stop en lugar de start, todas las operaciones se realizan como comandos de este tipo, fáciles de recordar y que permiten realizar acciones complejas sin necesidad de manejar directamente procesos a bajo nivel en el sistema operativo, más adelante en este artículo se mostrará una lista más extensa de comandos junto con ejemplos prácticos.
Otro de las ventajas de PM2 es que ofrece monitoreo en tiempo real, permite ver todos los datos sobre el uso de recursos del sistema, como CPU y memoria y el estado general de la aplicación, datos de uso específicamente de los procesos manejados por PM2 separado de los demás procesos del sistema, es decir que a diferencia de comandos como ps o top, que muestran todos los procesos del sistema, con PM2 se pueden ver específicamente lo consumido por las aplicaciones que supervisa, lo cual facilita enormemente la lectura.
De esa forma, los desarrolladores pueden ver una consola y en un solo lugar el uso de memoria y CPU de cada proceso gestionado por PM2, facilitando la identificación rápida de cuellos de botella o problemas de rendimiento.
Otra gran facilidad que aporta PM2 es poder configurar de forma muy sencilla el inicio de la aplicación con el arranque del sistema operativo del servidor y el reinicio de la aplicación ante posibles errores, de esa forma se asegura siempre la disponibilidad ante cualquier evento inesperado, reiniciando automáticamente las aplicaciones si se detecta un fallo o si el archivo de código fuente se modifica o por ejemplo si una aplicación se cierra debido a un error de código no capturado, de esa forma PM2 la reiniciará automáticamente sin ninguna intervención humana, lo cual es sumamente importante para servicios críticos que deben estar siempre disponibles.
En cuanto a rendimiento un beneficio que hace la diferencia es el balanceo de carga, Node.js, de forma predeterminada, no puede utilizar más de un núcleo de CPU, eso se debe a su propio diseño se basa en un solo subproceso, también llamado single-threaded, para manejar las operaciones de entrada y salida de manera asincrónica y no bloqueante.
Sin embargo, PM2 permite solucionar esto al distribuir la carga de trabajo entre varios núcleos de un servidor, lo que puede mejorar de forma significativa el rendimiento de aplicaciones que manejan un gran volumen de solicitudes.
Otra función importante que gestiona PM2, son los logs que al facilitar la gestión de logs de las diferentes aplicacion en un solo lugar, no se puede arreglar un error en una aplicación sin un mensaje o pista que analizar, por eso tener logs de las aplicaciones ayudan a un análisis y depuración más eficiente ante cualquier error.
Con PM2, todos los logs de la aplicación pueden ser gestionados desde un único lugar utilizando comandos como pm2 logs, lo cual simplifica en gran manera la tarea de dar seguimiento a los errores y comportamientos inesperados en las aplicaciones.
En resumen, PM2 ayuda a simplificar enormemente el proceso de despliegue y de gestión de aplicaciones mediante el uso de comandos sencillos que realizan tareas y configuraciones que de otra manera serían bastante complejas para la mayoría de los usuarios, ya que requieren de conocimientos un poco más avanzados sobre la administración de servidores.
Instalación y configuración de PM2
La forma más sencilla de instalar PM2 es mediante NPM, que a su vez se instala junto con Node a través de NVM. Lo primero entonces instalar NVM, para esto se ejecuta en la consola:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Para comprobar que quedara funcionando:
nvm --version
Ahora se instala Node, por defecto instala la versión más nueva e incluye a NPM. Siempre puedes consultar las versiones en la página oficial de NodeJS.
nvm install node
Una vez que están Node y NPM instalados se instala pm2 con el siguiente comando:
npm install pm2@latest -g
Comandos básicos de PM2
PM2 es una herramienta versátil que ofrece múltiples funcionalidades para gestionar tus aplicaciones Node.js, aquí se explica cómo usar algunas de las características más comunes de PM2:
Iniciar una Aplicación
Para iniciar una aplicación con PM2, usa el comando start seguido del archivo de script, por ejemplo, si la aplicación se llama app.js, se puede iniciarla con:
pm2 start app.js
Por defecto el nombre será el nombre del archivo sin la extensión, por tanto si se tiene varios proyectos con la misma estructura lo mejor es asignar un nombre distintivo, para eso puedes usar la opción –name:
pm2 start app.js --name "myApp"
Por defecto Node.JS solo puede usar un núcleo de CPU por ejecución y PM2 inicia la aplicación en modo fork, sin embargo en los servidores modernos se pueden tener decenas de CPU que pueden usarse para mejorar el rendimiento, si por ejemplo se quiere hacer uso de 8 núcleos se puede iniciar en modo cluster de la siguiente forma:
pm2 start app.js --name "myApp" -i 8
Si se quiere aprovechar la máxima cantidad de núcleos sin tener que especificar la cantidad se puede ejecutar:
pm2 start app.js --name "myApp" -i max
Este comando inicia tantas instancias como núcleos tenga el procesador del servidor, incluso se puede especificar un número superior a la cantidad física de núcleos aunque en tal caso dos o más instancias compartirán el mismo núcleo, lo cual no necesariamente significa un aumento de rendimiento.
Listar y Monitoreo de Aplicaciones
Para ver todas las aplicaciones que están siendo manejadas por PM2, puedes usar:
pm2 list
Para obtener más detalles sobre un proceso específico, usa:
pm2 show [NOMBRE]
Por ejemplo
pm2 show myApp
Una herramienta muy importante a la hora de analizar el rendimiento y que sucede con las aplicaciones, por ejemplo en horarios picos y visualizar el uso de los recursos de CPU y memoria en tiempo real de cada una, se puede utilizar el siguiente comando:
pm2 monit
Gestión de Logs
PM2 automáticamente maneja los logs de las aplicaciones de forma predeterminada, para ver los logs de una aplicación específica, puedes usar:
pm2 logs [NOMBRE]
Para ver los logs de todas las aplicaciones, simplemente sin especificar usuario se escribe:
pm2 logs
Reiniciar y Detener Procesos
Si se necesita reiniciar una aplicación, se puede hacerlo con:
pm2 restart [NOMBRE]
Para detener una aplicación, se usa:
pm2 stop [NOMBRE]
Configuración para Arranque Automático
PM2 puede configurarse para reiniciar las aplicaciones automáticamente al reiniciar el sistema, esto se logra ejecutando un script de startup, para ello primero se ejecuta el script de la siguiente forma:
pm2 startup
Luego, sigue las instrucciones que PM2 te proporciona en la terminal para activar el arranque automático, posteriormente de ajustar los procesos (iniciar, detener, eliminar), se puede guardar la lista actual de procesos que PM2 reiniciará automáticamente en el siguiente arranque del sistema:
pm2 save
Estos son los comandos básicos para empezar a usar PM2 y algunos no tan básicos como el modo cluster (para balanceo de carga y uso de múltiples núcleos simultáneamente), manejo de variables de entorno y más, todos comandos que son imprescindibles para el despliegue y la gestión de aplicaciones Node.JS
Ejemplo completo
El primer paso es crear un directorio para el proyecto:
mkdir proyecto
Se ingresa al directorio y instala Express, dependencia necesaria para este ejemplo:
cd proyecto
npm install express
Luego el siguiente paso es crear un archivo llamado app.js y colocar el siguiente contenido:
const express = require('express'); const hostname = "127.0.0.1" const port = 3000 const app = express(); app.get('/', (req, res) => { res.send('Hola Mundo'); }); app.listen(port, () => { console.log(`Servidor ejecutándose en http:/${hostname}:${port}`); });
Una vez guardado el archivo se inicia de la siguiente forma colocando el nombre adecuado:
pm2 start app.js --name "newApp"
Se configura el inicio automático con el arranque de la máquina
pm2 startup
Por último, se guardan los cambios
pm2 save
Con apenas algunos pasos se tiene una aplicación completa configurada para arrancar con el servidor desde el inicio.
Un detalle importante que puede afectar el funcionamiento es SELinux o AppArmor por ese motivo se deben configurar adecuadamente o incluso deshabilitarlos.
Conclusión
PM2 es una herramienta esencial para cualquier desarrollador de Node.js que busque una solución eficiente para la gestión y monitoreo de aplicaciones en producción,su sencilles y su facilidad de uso, capacidades de monitoreo en tiempo real, reinicio automático y balanceo de carga, hacen de PM2 una elección frecuente en la comunidad de desarrollo, si aún no lo has probado, instalar y configurar PM2 puede ser un paso importante para mejorar la estabilidad y rendimiento de tus aplicaciones Node.js en producción.