¿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.