¿Qué es PM2?

PM2 es un gestor de procesos para Node.js que te permite:

  • Ejecutar scripts Node como servicios.
  • Gestionar procesos en modo clúster (varios procesos para aprovechar todos los núcleos de CPU).
  • Monitorizar el estado de cada proceso.
  • Configurar límites de memoria y reinicio automático.

Opción A: Tú gestionas el cluster manualmente (cluster.js)

Ejemplo de código (cluster.js)

const cluster = require('cluster');
const os = require('os');
const numCPUs = os.cpus().length;

if (cluster.isMaster) {
  console.log(`? Master PID ${process.pid} lanzando ${numCPUs} workers`);

  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`? Worker ${worker.process.pid} murió, relanzando...`);
    cluster.fork();
  });

} else {
  require('./api.js');
}

Comando para lanzarlo con control de memoria

pm2 start cluster.js \
  --name scraper-api \
  --node-args="--max-old-space-size=1500" \
  --max-memory-restart 1600M \
  --restart-delay 3000 \
  --watch false \
  --log-date-format="YYYY-MM-DD HH:mm:ss"

Explicación de las opciones

Opción Descripción
--name scraper-api Nombre del proceso en PM2
--node-args="--max-old-space-size=1500" Límite de heap de V8 a 1500 MB
--max-memory-restart 1600M Reinicia si el proceso usa más de 1600 MB
--restart-delay 3000 Retraso de 3 segundos antes de reiniciar
--watch false Desactiva reinicios por cambios de archivo
--log-date-format="..." Formato de fecha en logs

Importante: PM2 solo verá un proceso (el master). Los workers no aparecen en pm2 list.


Opción B: PM2 gestiona las instancias directamente (-i max)

Ejemplo de código (api.js)

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => res.send('Hola mundo desde worker'));

app.listen(port, () => {
  console.log(`? API escuchando en puerto ${port}`);
});

Comando para lanzarlo con clustering automático

pm2 start api.js \
  --name scraper-api \
  -i max \
  --node-args="--max-old-space-size=1500" \
  --max-memory-restart 1600M \
  --restart-delay 3000 \
  --watch false \
  --log-date-format="YYYY-MM-DD HH:mm:ss"

¿Qué hace este comando?

  • -i max: Lanza una instancia por CPU disponible.
  • Usa clustering interno de Node.js automáticamente.
  • Todos los procesos aparecen en PM2 y son monitorizados.

Cómo reiniciar o reconfigurar

Eliminar proceso existente

pm2 delete scraper-api

Volver a lanzar con opciones nuevas

pm2 start api.js \
  --name scraper-api \
  -i max \
  --node-args="--max-old-space-size=1500" \
  --max-memory-restart 1600M \
  --restart-delay 3000 \
  --watch false \
  --log-date-format="YYYY-MM-DD HH:mm:ss"

Guardar configuración de PM2

pm2 save

Hacer que se inicie al arrancar el sistema

pm2 startup

¿Qué opción elegir?

Característica Opción A (cluster.js) Opción B (PM2 -i max)
Gestión de workers Tú la haces manualmente PM2 la hace por ti
Control personalizado Máximo control Menos control
Visibilidad en PM2 Solo ves 1 proceso Ves todos los procesos
Reinicio de workers Lo haces tú con código PM2 los reinicia
Simplicidad Más compleja Más simple

Si necesitas flexibilidad total, usa Opción A . Si solo quieres escalar fácil y ver todo en PM2, usa Opción B .