PM2: QUÉ ES Y CÓMO GESTIONAR PROCESOS DE NODE.JS

PM2 es un módulo de NodeJS de gestión de procesos. Está diseñado para facilitar el despliegue, monitoreo y mantenimiento de aplicaciones en entornos de producción. Es un process manager que permite ejecutar aplicaciones NodeJS de manera persistente, reiniciarlas automáticamente en caso de fallos, balancear carga entre múltiples instancias y monitorizar su rendimiento, todo desde una interfaz simple de línea de comandos. Su objetivo es simplificar tareas como:
  • Mantener aplicaciones corriendo de forma continua, incluso después de reiniciar el servidor.
  • Reiniciar automáticamente una aplicación si se produce un error o se consume demasiada memoria.
  • Escalar aplicaciones ejecutando múltiples instancias en clúster para aprovechar múltiples núcleos de CPU.
  • Monitorear el uso de CPU, memoria y logs en tiempo real.
  • Gestionar aplicaciones como servicios en un servidor.

Características principales de PM2

  • Gestión de procesos: Inicia, detiene, reinicia o elimina procesos de NodeJS con comandos simples. Ejemplo: "pm2 start app.js".
  • Reinicio automático: Si una aplicación falla (por ejemplo, por un error no manejado), PM2 la reinicia automáticamente. Configurable para limitar reinicios o establecer condiciones.
  • Modo clúster: Permite ejecutar múltiples instancias de una aplicación NodeJS para aprovechar todos los núcleos de CPU, mejorando el rendimiento en servidores multi-core. Ejemplo: "pm2 start app.js -i max" (usa todos los núcleos disponibles).
  • Monitorización en tiempo real: Proporciona un dashboard en la terminal ("pm2 monit") para ver CPU, memoria, estado de procesos y logs. También ofrece monitorización remota con PM2 Plus (servicio pago).
  • Gestión de logs: Centraliza y rota logs automáticamente, lo que es útil para aplicaciones que generan grandes cantidades de datos, como las que procesan streams (por ejemplo, logs de generación de PDFs).
  • Inicio automático en el arranque del sistema: Configura aplicaciones para iniciarse automáticamente al reiniciar el servidor. Ejemplo: "pm2 startup".
  • Soporte para variables de entorno: Permite cargar configuraciones desde un archivo (como ecosystem.config.js) para gestionar variables de entorno, conectando con tu interés en este tema.
  • Integración con despliegues: Facilita despliegues sin downtime usando "pm2 reload" para recargar procesos sin interrumpir el servicio.

  • Suponiendo que una APP, hecha con Express, que genera PDFs (como en tu pregunta anterior). Aquí se muestra cómo usar PM2 para ejecutarla, monitorizarla y escalarla.

    const express = require('express');
    const PDFDocument = require('pdfkit');
    const app = express();
    
    app.get('/generate-pdf', (req, res) => {
      const doc = new PDFDocument();
      res.setHeader('Content-Type', 'application/pdf');
      res.setHeader('Content-Disposition', 'attachment; filename=factura.pdf');
      doc.pipe(res); // Stream el PDF al cliente
      doc.fontSize(20).text('Factura Generada', 50, 50);
      doc.end();
    });
    
    app.listen(process.env.PORT || 3000, () => console.log('API corriendo'));
    
    Ahora se explica como gestionar el ejemplo anterior con PM2
    1. Iniciar la aplicación: '"pm2 start app.js --name "pdf-api""'. Se le puede asignar un nombre al proceso con '"--name "pdf-api""' para identificarlo.
    2. Ver lista de procesos con '"pm2 list"'. Mostrando los procesos en ejecución, con ID, nombre, uso de memoria y CPU.
    3. Monitorización en tiempo real: '"pm2 monit"'. Muestra un dashboard con métricas de CPU, memoria y logs.
    4. Habilitar modo clúster: "pm2 start app.js --name "pdf-api" -i max". Ejecuta múltiples instancias para aprovechar todos los núcleos de CPU.
    5. Ver logs: "pm2 logs pdf-api".Muestra los logs de la aplicación, útil para depurar errores.
    6. Reiniciar sin downtime: "pm2 reload pdf-api". Recarga la aplicación sin interrumpir las solicitudes.
    7. Configurar inicio automático: "pm2 startup"y luego "pm2 save".Asegura que la aplicación se inicie al reiniciar el servidor.

    Comandos útiles de PM2

    • Iniciar un proceso: "pm2 start app.js"
    • Detener un proceso: "pm2 stop pdf-api"
    • Eliminar un proceso: "pm2 delete pdf-api"
    • Ver logs: "pm2 logs"
    • Reiniciar todos los procesos: "pm2 restart all"
    • Monitorear: "pm2 monit"
    • Información detallada: "pm2 show pdf-api"