El blog de LiveCommerce

Un blog de comercio electrónico y tiendas online

Tutorial completo: Ejecutar procesos Node.js con PM2 y controlar recursos

¿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ónDescripción
--name scraper-apiNombre del proceso en PM2
--node-args="--max-old-space-size=1500"Límite de heap de V8 a 1500 MB
--max-memory-restart 1600MReinicia si el proceso usa más de 1600 MB
--restart-delay 3000Retraso de 3 segundos antes de reiniciar
--watch falseDesactiva 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ísticaOpción A (cluster.js)Opción B (PM2 -i max)
Gestión de workersTú la haces manualmentePM2 la hace por ti
Control personalizadoMáximo controlMenos control
Visibilidad en PM2Solo ves 1 procesoVes todos los procesos
Reinicio de workersLo haces tú con códigoPM2 los reinicia
SimplicidadMás complejaMá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.

Compártelo:

¿Tienes alguna consulta?

Si tienes alguna pregunta o sabes la respuesta sobre algún comentario, no dudes en contribuir.
Responderemos rápidamente.
Puedes utilizar etiquetas BBCode para escribir negrita, enlaces, imágenes, etc...
Más información en la página oficial de BBCOde http://www.bbcode.org/ Ejemplo:
[url=http://google.com]links[/url], [color=red]colores[/color] [b]negrita[/b]...

¿Has visto los videos en nuestro canal de Youtube?

En nuestro canal de Youtube publicamos periódicamente mejoras y funcionalidades del software de ecommerce.