Node.js y ExpressTesting y ProducciónLección 19 de 20
Deploy con PM2 y Nginx
PM2 es el process manager de producción para Node.js. Mantiene tu app corriendo, la reinicia si crashea, usa todos los CPUs disponibles con modo cluster, y proporciona logs centralizados. Nginx actúa como reverse proxy frente a Node, maneja SSL y sirve archivos estáticos eficientemente.
// ecosystem.config.js — configuración de PM2
module.exports = {
apps: [
{
name: 'mi-api',
script: 'src/index.js',
instances: 'max', // usa TODOS los CPUs disponibles
exec_mode: 'cluster', // modo cluster para múltiples instancias
watch: false, // no usar watch en producción
max_memory_restart: '500M', // reiniciar si usa más de 500MB
env: {
NODE_ENV: 'development',
PORT: 3000,
},
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
},
],
};
// Comandos PM2 esenciales:
// pm2 start ecosystem.config.js --env production
// pm2 restart mi-api
// pm2 stop mi-api
// pm2 logs mi-api --lines 100
// pm2 monit ← dashboard en tiempo real
// pm2 save ← guardar lista de procesos
// pm2 startup ← auto-arrancar con el sistema
// ------------------------------------------------
// Configuración Nginx como reverse proxy
// /etc/nginx/sites-available/mi-api
//
// server {
// listen 80;
// server_name api.midominio.com;
// return 301 https://$server_name$request_uri; # redirigir a HTTPS
// }
//
// server {
// listen 443 ssl;
// server_name api.midominio.com;
//
// # Certificados SSL (Let's Encrypt con Certbot)
// ssl_certificate /etc/letsencrypt/live/api.midominio.com/fullchain.pem;
// ssl_certificate_key /etc/letsencrypt/live/api.midominio.com/privkey.pem;
//
// # Pasar peticiones a Node.js
// location / {
// proxy_pass http://localhost:3000;
// proxy_http_version 1.1;
// proxy_set_header Upgrade $http_upgrade;
// proxy_set_header Connection 'upgrade';
// proxy_set_header Host $host;
// proxy_set_header X-Real-IP $remote_addr;
// proxy_cache_bypass $http_upgrade;
// }
//
// # Nginx sirve archivos estáticos directamente (más eficiente)
// location /uploads/ {
// alias /var/www/mi-api/uploads/;
// expires 30d;
// }
// }
ConsejoCon exec_mode: "cluster" e instances: "max", PM2 crea N workers (uno por CPU). El tráfico se distribuye automáticamente. Un servidor de 4 CPUs puede manejar ~4x más carga que con una sola instancia.
Practica esta lección
Resuelve los ejercicios del curso de Node.js y Express en la app, gratis y con corrección automática.
Empezar a practicar