Nginx Cheat Sheet: Reverse Proxy, SSL con Certbot y Buenas Prácticas

Nginx es el estándar de la industria para actuar como proxy inverso, balanceador de carga y servidor de archivos estáticos. Esta guía condensa las configuraciones más utilizadas en entornos reales de producción para conectar tus aplicaciones (Node.js, Python/FastAPI, Go, Docker) a internet de forma segura y eficiente.


1. Comandos de Gestión y Diagnóstico

Antes de tocar cualquier archivo, ten siempre a mano los comandos básicos para no romper el tráfico activo:

  • Validar sintaxis antes de aplicar cambios (vital):

    bash
    sudo nginx -t

  • Recargar configuración sin desconectar usuarios (zero downtime):

    bash
    sudo systemctl reload nginx

  • Ver el estado del servicio:

    bash
    sudo systemctl status nginx

  • Inspeccionar los logs de error y accesos:

    bash
    tail -f /var/log/nginx/error.log
      tail -f /var/log/nginx/access.log


2. Reverse Proxy Básico (Node.js / FastAPI / Go / Docker)

Un bloque de servidor estándar ubicado habitualmente en /etc/nginx/sites-available/miapp.com:

nginx
server {
    listen 80;
    server_name api.tudominio.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;

        # Headers esenciales para preservar la IP y protocolo del cliente
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Soporte para WebSockets (si tu app los utiliza)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Timeouts recomendados para operaciones pesadas
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Para habilitarlo y enlazarlo con sites-enabled:

bash
sudo ln -s /etc/nginx/sites-available/miapp.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx


3. Servir un Frontend SPA (React, Vue, Astro, Angular)

Para evitar errores 404 Not Found al recargar rutas manejadas por el router del lado del cliente:

nginx
server {
    listen 80;
    server_name tudominio.com www.tudominio.com;
    root /var/www/miapp/dist;
    index index.html;

    location / {
        # Si no encuentra el archivo o carpeta, redirige a index.html
        try_files $uri $uri/ /index.html;
    }

    # Caché agresiva para assets con hash (JS, CSS, imágenes)
    location ~* \.(?:css|js|woff2?|png|jpg|jpeg|gif|svg|ico)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
}


4. SSL Gratuito y Automatizado con Certbot (Let's Encrypt)

La forma más rápida y segura de obtener HTTPS con renovación automática:

  1. Instalar Certbot y el plugin de Nginx:

    bash
    sudo apt update
       sudo apt install certbot python3-certbot-nginx -y

  2. Obtener y configurar el certificado automáticamente:

    bash
    sudo certbot --nginx -d tudominio.com -d www.tudominio.com
    Certbot modificará tu bloque de servidor, forzará la redirección de HTTP a HTTPS y configurará los certificados TLS.

  3. Verificar que la renovación automática funcione:

    bash
    sudo certbot renew --dry-run


5. Headers de Seguridad y Rendimiento Recomendados

Añade estas directivas dentro de tu bloque server o a nivel global en /etc/nginx/nginx.conf:

nginx
# Ocultar versión exacta de Nginx
server_tokens off;

# Limitar tamaño máximo de subida de archivos (por defecto es 1M)
client_max_body_size 25M;

# Headers de seguridad modernos
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Compresión Gzip para reducir payload de red
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss;