PM2, también llamado "Módulo de Gestión de Procesos", es un gestor de procesos que se utiliza para gestionar aplicaciones en Node.js. Es gratuito, de código abierto y tiene un equilibrador de carga incorporado. Reinicia automáticamente el servidor Node.js cuando un proceso deja de funcionar. Es multiplataforma y se puede ejecutar en Windows, Linux y macOS. Te permite ejecutar la aplicación Node.js en modo de clúster sin realizar ningún cambio en el código.
En esta tutorial te mostramos cómo ejecutar y administrar aplicaciones Node.js usando PM2.
Requisitos Previos
- Un servidor corriendo con Ubuntu 20.04.
- Una contraseña root configurada en el servidor.
Instala Node.js
Antes de empezar, debes instalar Node.js en tu servidor. Primero, añade el repositorio de origen de Node con el siguiente comando:
# curl -sL https://deb.nodesource.com/setup_14.x | bash -
Después, instala Node.js con el siguiente comando:
# apt-get install nodejs -y
Una vez que la instalación esté completa, verifica la versión de Node.js utilizando el comando que indicamos más abajo:
# node --version
Deberías obtener el siguiente resultado:
# v14.17.1
Crea una Aplicación de muestra de Node.js
Para el propósito de este tutorial, necesitarás crear una aplicación de muestra de Node.js.
Primero, crea un directorio para tu app con el siguiente comando:
# mkdir myapp
Para continuar, crea una aplicación hello.js con el siguiente comando:
# nano myapp/hello.js
Añade las siguientes líneas:
const http = require('http');
const hostname = 'your-server-ip';
const port = 8000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('This is My First Nodejs App!\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Recuerda que debes de cambiar 'your-server-ip' por la IP Pública del servidor. Guarda y cierra el archivo cuando hayas terminado.
También deberás de abrir el puerto 8000 en el Firewall de tu servidor.
Instala PM2
Puedes instalar PM2 fácilmente utilizando el comando NPM como se muestra más abajo:
# npm i -g pm2
Una vez que PM2 esté instalado, inicia tu aplicación utilizando PM2:
# pm2 start myapp/hello.js
Deberías ver el siguiente resultado:
__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
_\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
_\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
_\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
_\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
_\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
_\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
_\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
_\///______________\///______________\///__\///////////////__
Runtime Edition
PM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.
Start and Daemonize any application:
$ pm2 start app.js
Load Balance 4 instances of api.js:
$ pm2 start api.js -i 4
Monitor in production:
$ pm2 monitor
Make pm2 auto-boot at server restart:
$ pm2 startup
To go further checkout:
http://pm2.io/
-------------
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /root/myapp/hello.js in fork_mode (1 instance)
[PM2] Done.
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ hello │ default │ N/A │ fork │ 2788 │ 0s │ 0 │ online │ 0% │ 28.0mb │ root │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴───────
Cómo usar PM2
Para listar todas tus aplicaciones corriendo con Node.js, hazlo con el siguiente comando:
# pm2 list
Deberías obtener el siguiente resultado:
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ hello │ default │ N/A │ fork │ 2788 │ 26s │ 0 │ online │ 0% │ 37.5mb │ root │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Para reiniciar la aplicación, utiliza el siguiente comando:
# pm2 restart myapp/hello.js
Para iniciar tu aplicación con Node.js en modo cluster, hazlo con el siguiente comando:
# pm2 start myapp/hello.js -i 2
Deberías ver el siguiente resultado:
[PM2] Starting /root/myapp/hello.js in cluster_mode (2 instances)
[PM2] Done.
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ hello │ default │ N/A │ cluster │ 3228 │ 0s │ 0 │ online │ 0% │ 35.6mb │ root │ disabled │
│ 1 │ hello │ default │ N/A │ cluster │ 3235 │ 0s │ 0 │ online │ 0% │ 30.0mb │ root │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Para monitorizar tu aplicación, utiliza el siguiente comando:
# pm2 monit
Deberías ver la siguiente pantalla:
Para comprobar los logs de la aplicación, hazlo con el siguiente comando:
# pm2 logs
Deberías obtener el siguiente resultado:
/root/.pm2/logs/hello-error-0.log last 15 lines:
/root/.pm2/logs/hello-out-0.log last 15 lines:
0|hello | Server running at http://your-server-ip:8000/
/root/.pm2/logs/hello-out-1.log last 15 lines:
1|hello | Server running at http://your-server-ip:8000/
Para eliminar todos los logs, utiliza el siguiente comando:
# pm2 flush
Para mostrar información detallada de tu aplicación, utiliza el siguiente comando:
# pm2 show 0
Deberías ver la siguiente pantalla:
Gestiona la aplicación Node.js con PM2
Para iniciar tu aplicación Node.js con un reinicio del sistema, utiliza el siguiente comando:
# pm2 startup
Deberías ver el siguiente resultado:
[ '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
Para eliminar el proceso de iniciar con un reinicio, hazlo con el siguiente comando:
# pm2 unstartup
Para guardar el proceso de iniciar con un reinicio del sistema, hazlo con el siguiente comando:
# pm2 save
Para actualizar PM2, utiliza el siguiente comando:
# pm2 update
Deberías obtener el siguiente resultado:
Be sure to have the latest version by doing `npm install pm2@latest -g` before doing this procedure.
[PM2] Applying action deleteProcessId on app [all](ids: [ 0, 1 ])
[PM2] [hello](0) ✓
[PM2] [hello](1) ✓
[PM2] [v] All Applications Stopped
[PM2] [v] PM2 Daemon Stopped
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] Restoring processes located in /root/.pm2/dump.pm2
[PM2] Process /root/myapp/hello.js restored
[PM2] Process /root/myapp/hello.js restored
>>>>>>>>>> PM2 updated
┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ hello │ default │ N/A │ cluster │ 3445 │ 0s │ 0 │ online │ 0% │ 37.9mb │ root │ disabled │
│ 1 │ hello │ default │ N/A │ cluster │ 3446 │ 0s │ 0 │ online │ 0% │ 37.9mb │ root │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
Para parar todos los procesos de Node.js, utiliza el siguiente comando:
# pm2 stop all
Para parar el proceso de Node.js con id 0, hazlo con el siguiente comando:
# pm2 stop 0
Para reiniciar todos los procesos de la aplicación de Node.js, utiliza el siguiente comando:
# pm2 restart all
Para eliminar todos los procesos, hazlo con el siguiente comando:
# pm2 delete all
Para eliminar un proceso con id 1, hazlo con el siguiente comando:
# pm2 delete 1
Accede a la aplicación de Node.js
Ahora abre tu navegador web y accede a tu aplicación de Node.js con la URL http://your-server-ip:8000. Deberías ver tu aplicación en la siguiente imagen:
Conclusión
Con este tutorial has aprendido cómo instalar y usar PM2 para gestionar la aplicación con Node.js.
¡Esperamos que PM2 te ayude a gestionar tus aplicaciones Node.js de forma fácil!