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 -tRecargar configuración sin desconectar usuarios (zero downtime):
bash sudo systemctl reload nginxVer el estado del servicio:
bash sudo systemctl status nginxInspeccionar 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:
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:
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:
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:
Instalar Certbot y el plugin de Nginx:
bash sudo apt update sudo apt install certbot python3-certbot-nginx -yObtener y configurar el certificado automáticamente:
Certbot modificará tu bloque de servidor, forzará la redirección de HTTP a HTTPS y configurará los certificados TLS.bash sudo certbot --nginx -d tudominio.com -d www.tudominio.comVerificar 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:
# 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;