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

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 .