Inicio > Cursos > Node.js y Express > Deploy con PM2 y Nginx
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.
← Seguridad en APIsProyecto: API Tareas con Auth →

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