PM2 (Process Manager 2) es una herramienta imprescindible en el arsenal de cualquier administrador de sistemas que trabaje con aplicaciones Node.js. Proporciona una solución fácil y potente para gestionar y mantener en funcionamiento aplicaciones Node.js en un entorno de producción. PM2 no solo garantiza que su aplicación esté siempre en línea, sino que también ofrece funcionalidades para el monitoreo en tiempo real, la gestión de logs, y la carga automática.

Pasos previos

Para el buen funcionamiento de PM2 es necesario tener instalado NodeJS en tu servidor así como el gestor de paquetes npm.

Instalación de NodeJS

Para la instalación de NodeJS os dejamos este tutorial que explica su procedimiento:

Instalación de NodeJS en GNU/Linux [Debian, Ubuntu, CentOS]
En el siguiente tutorial os explicaremos la correcta instalación de NodeJS en GNU/Linux. Ya sea tu servidor un Ubuntu o Debian o CentOS aquí encontrarás las instrucciones correctas para su instalación.

Instalación de PM2

Para comenzar con PM2, primero debe estar instalado Node.js en su sistema. Con Node.js ya configurado, la instalación de PM2 se realiza a través de npm (Node Package Manager), lo cual es tan simple como ejecutar el siguiente comando en la terminal:

npm install pm2 -g

Este comando instala PM2 globalmente en su sistema, permitiendo que se ejecute desde cualquier lugar.

Configuración básica de PM2

Para hacer este tutorial, utilizaremos un script sencillo para hacer pruebas, se trata de un script que levanta un servidor web y muestra un título.

Aquí el script que hemos guardado bajo el nombre app.js:

const http = require('http');

// Crear un servidor HTTP
const server = http.createServer((req, res) => {
    // Configurar la respuesta HTTP con encabezados
    res.writeHead(200, {'Content-Type': 'text/html'});

    // Enviar una respuesta HTML con un título
    res.end('<html><body><h1>Mi Titulo en Pantalla</h1></body></html>');
});

// El servidor escucha en el puerto 3000
server.listen(3000, () => {
    console.log('Servidor ejecutándose en http://localhost:3000/');
});
💡
Tendremos acceso a esta web a través del puerto 3000 utilizando nuestra IP pública del servidor.

Algunos ejemplos de lo que podemos hacer con PM2

Podemos iniciar nuestra aplicación de la siguiente forma:

pm2 start app.js

Y mostrará el siguiente resultado:

# pm2 start app.js 
[PM2] Starting /root/app.js in fork_mode (1 instance)
[PM2] Done.
┌────┬──────┬───────────┬──────┬─────┬────────┬────────┬─────┬───────┬──────┐
│ id │ name │ namespace │ mode │ pid │ uptime │ status │ cpu │ mem   │ user │
├────┬──────┬───────────┬──────┬─────┬────────┬────────┬─────┬───────┬──────┤
│ 0  │ app  │ default   │ fork │ 863 │ 0s     │ online │ 0%  │ 18.3mb│ root │
└────┴──────┴───────────┴──────┴─────┴────────┴────────┴─────┴───────┴──────┘

Con este otro comando podremos mostrar las aplicaciones configuradas:

pm2 ls
pm2 list

Para parar, reiniciar o eliminar una aplicación:

# Para parar
pm2 stop [nombre_app]

# Para reiniciar
pm2 restart [nombre_app]

# Para eliminar 
pm delete [nombre_app]

pm2 stop app
pm2 restart app
pm2 delete app

Monitoreo de las aplicaciones y registros

PM2 viene con herramientas integradas para el monitoreo y la gestión de logs. Puede monitorear sus aplicaciones con pm2 monit y ver los logs con pm2 logs.

Iniciar aplicaciones al arranque del sistema

Si queremos mantener diferentes aplicaciones, existe la posibilidad de añadir un demonio para que levante el servicio y cargue las aplicaciones directamente. Para ello tendremos que ejecutar este comando:

pm2 startup

Salida del comando:

[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

Con esto PM2 iniciará durante el arranque, pero para mantener las aplicaciones iniciadas, debemos de iniciar primero nuestra aplicación y luego guardar el listado de aplicaciones iniciadas:

pm2 save

Configuración avanzada

Para una gestión más avanzada, podemos utilizar un archivo de configuración ecosystem.config.js, que permite definir múltiples aspectos de tu aplicación, como variables de entorno, número de instancias, y más.

module.exports = {
  apps : [{
    name: 'my-app',
    script: 'app.js',
    instances: 'max',
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
        NODE_ENV: 'development'
    },
    env_production: {
        NODE_ENV: 'production'
    }
  }]
};

Para ejecutar una aplicación con este archivo de configuración, utilizaremos:

pm2 start ecosystem.config.js

Guardamos la configuración:

pm2 save

Conclusión

PM2 es una herramienta vital para cualquier administrador de sistemas que trabaje con Node.js. Facilita la gestión de aplicaciones, asegurando su disponibilidad y facilitando su monitoreo y mantenimiento. Con esta guía básica, usted está listo para comenzar a utilizar PM2 en sus proyectos Node.js.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación