Correr una aplicación Node.js en producción con PM2
Cuando estás desarrollando, lanzas tu app Node con node app.js y listo. Pero eso no sirve en producción: si el proceso se cae, nadie lo levanta; si cierras la sesión SSH, se muere; y si tu servidor reinicia, tu aplicación queda apagada. La solución estándar se llama PM2, un administrador de procesos pensado específicamente para Node.js.
¿Qué hace PM2 por ti?
PM2 mantiene tu aplicación viva como un demonio del sistema. Si tu código lanza una excepción no controlada y el proceso muere, PM2 lo reinicia automáticamente. Además, centraliza los logs, muestra métricas de CPU y memoria en tiempo real, y te permite correr varias instancias de tu app en paralelo para aprovechar todos los núcleos del CPU.
Instalación
PM2 se instala como paquete global con npm:
npm install -g pm2
Si usas NVM, no necesitas sudo. Después comprueba la instalación con pm2 --version.
Lanzar tu aplicación
Para arrancar una app, ve al directorio del proyecto y ejecuta:
pm2 start app.js --name miapp
El flag --name es opcional pero muy útil para identificarla luego. Para ver el estado de todos los procesos administrados por PM2:
pm2 list pm2 status
Si tu app es un script escrito en TypeScript o necesita variables de entorno, puedes pasarlas directo o usar un archivo de configuración llamado ecosystem.config.js.
Logs y depuración
PM2 captura tanto stdout como stderr. Para ver los logs en vivo:
pm2 logs miapp
Y si quieres solo los últimos 100 renglones: pm2 logs miapp --lines 100. Los archivos de log físicos se guardan en ~/.pm2/logs/. También tienes pm2 flush para vaciarlos cuando crezcan demasiado.
Cluster mode
Si tu VPS tiene varios núcleos, lanza tu app en modo cluster para procesar más requests en paralelo:
pm2 start app.js -i max --name miapp
El -i max arranca tantas instancias como núcleos tengas. PM2 balancea las conexiones entrantes entre ellas automáticamente. Ten presente que tu código debe ser compatible con cluster mode (evita almacenar estado solo en memoria local).
Auto-start al reiniciar el VPS
Para que PM2 vuelva a lanzar tus apps después de un reboot del servidor:
pm2 startup pm2 save
El comando startup te devolverá una línea que debes copiar y pegar (con sudo) para registrar PM2 como servicio del sistema. Luego pm2 save guarda la lista de procesos actual para que se restauren tras el reinicio.
Comandos de uso diario
Los que vas a usar más seguido:
pm2 restart miapp pm2 reload miapp pm2 stop miapp pm2 delete miapp pm2 monit
restart reinicia el proceso desde cero; reload hace un reinicio gradual sin downtime en modo cluster; y monit abre un panel interactivo con uso de recursos en tiempo real, muy práctico cuando sospechas de una fuga de memoria.