PM2 para JavaScript (Node.js): guía completa con ejemplos prácticos
1. ¿Qué es PM2 y por qué usarlo?
PM2 (Process Manager 2) es un potente gestor de procesos para aplicaciones Node.js, diseñado para entornos de producción. Permite iniciar, detener, reiniciar y monitorear aplicaciones Node.js, garantizando alta disponibilidad y tolerancia a fallos. PM2 reinicia automáticamente los procesos que fallan, distribuye la carga entre múltiples instancias (clustering), incluye un balanceador de carga integrado y soporta reinicios sin tiempo de inactividad (graceful reload).
En producción, las aplicaciones Node.js suelen enfrentar errores inesperados, fugas de memoria o sobrecargas. PM2 resuelve estos problemas actuando como un "demonio guardián": supervisa el estado de cada proceso, registra stdout/stderr, proporciona métricas de rendimiento (CPU, memoria) y permite gestionar la aplicación desde la línea de comandos o mediante una API. Sin PM2, los desarrolladores tendrían que escribir scripts manuales para reinicios, monitoreo y escalado; PM2 automatiza todas estas tareas.
Las funcionalidades clave de PM2 incluyen: clustering (ejecución de varios workers en todos los núcleos de la CPU), reinicios sin tiempo de inactividad, gestión de entornos (desarrollo/producción), monitoreo integrado (pm2 monit), soporte para archivos de configuración (ecosystem.config.js) e integración con sistemas de inicio (systemd, upstart) para arranque automático al iniciar el servidor.
2. Instalación
PM2 se instala globalmente a través de npm (Node Package Manager). El comando exacto es:
npm install -g pm2
Para instalar una versión específica:
npm install -g pm2@5.3.0
Después de la instalación, verifica la versión:
pm2 --version
3. Inicio rápido — ejemplo mínimo funcional
Crea una aplicación Node.js simple llamada app.js:
// app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('¡Hola desde PM2!\n');
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Servidor corriendo en el puerto ${PORT}`);
});
Ejecuta la aplicación con PM2:
pm2 start app.js --name mi-app
Verifica el estado:
pm2 status
Detén la aplicación:
pm2 stop mi-app
4. Métodos principales
4.1. pm2.start() — Iniciar una aplicación
Firma: pm2.start(script, options, callback)
Qué hace: Inicia el script especificado como un proceso de PM2 con las opciones indicadas (nombre, número de instancias, variables de entorno).
Ejemplo de código funcional:
const pm2 = require('pm2');
pm2.connect((err) => {
if (err) {
console.error(err);
process.exit(2);
}
pm2.start({
script: 'app.js',
name: 'mi-app',
instances: 2, // ejecutar 2 instancias
exec_mode: 'cluster', // modo cluster
env: {
NODE_ENV: 'production',
PORT: 3000
}
}, (err, apps) => {
if (err) {
console.error(err);
return pm2.disconnect();
}
console.log('Aplicación iniciada:', apps);
pm2.disconnect();
});
});
4.2. pm2.stop() — Detener un proceso
Firma: pm2.stop(process, callback)
Qué hace: Detiene el proceso especificado (por nombre, ID o todos los procesos).
Ejemplo de código funcional:
const pm2 = require('pm2');
pm2.connect((err) => {
if (err) {
console.error(err);
process.exit(2);
}
// Det