Sysadmin

Nginx Reverse Proxy: Configuración Completa y Segura

Un reverse proxy Nginx recibe las peticiones HTTP/HTTPS de los clientes y las reenvía a los servidores backend internos. Para configurar Nginx reverse proxy basta con definir un server block con la directiva proxy_pass, gestionando SSL, headers y rate limiting para proteger las aplicaciones.

| Directiva | Propósito | Ejemplo |

|—|—|—|

| proxy_pass | Reenvía el tráfico al backend | proxy_pass http://localhost:3000; |

| proxy_set_header | Establece headers para el backend | proxy_set_header X-Real-IP $remote_addr; |

| limit_req | Limita peticiones por segundo | limit_req zone=api burst=20 nodelay; |

| proxy_cache | Activa la caché de respuestas | proxy_cache my_cache; |

Cuando configuré la infraestructura para una PA con 2.000 endpoints, el problema principal no era la potencia de los servidores, sino cómo exponer las aplicaciones internas sin que fueran atacadas. El 73% de las brechas de seguridad parte de credenciales robadas o exploits en aplicaciones expuestas, según el Verizon DBIR 2025. Sin un reverse proxy, el backend recibe tráfico directo, sin filtro. Nginx resuelve este problema. Gestiona el cifrado SSL, absorbe el tráfico DDoS, registra la IP real y almacena en caché. En esta guía verás cómo configurar Nginx reverse proxy paso a paso, con ejemplos listos para producción.

Requisitos Previos para Nginx Reverse Proxy / Entorno de Prueba

Necesitas un servidor Linux con acceso root. He probado esta configuración en Ubuntu 24.04 LTS, pero funciona en cualquier distribución basada en Debian. Necesitas un backend escuchando en un puerto local, por ejemplo una app Node.js en el 3000 o una app Python en el 8000. También necesitas un dominio apuntando a la IP del servidor para probar SSL con Let’s Encrypt.

Qué es un reverse proxy y por qué usarlo

Un reverse proxy se sitúa delante de tus servidores aplicativos. Los clientes nunca hablan directamente con Node.js, Python o PHP. Hablan con Nginx, que reenvía la petición al backend. Esto añade una capa de seguridad fundamental. Según W3Techs (2025), Nginx sirve más del 34% de los sitios web activos. Si lo usas solo como servidor web estático, desperdicias el 90% de su capacidad. Cuando configuras Nginx reverse proxy, centralizas SSL, caché, rate limiting y balanceo de carga en un único punto. El backend permanece aislado en la red interna.

Instalar Nginx en Ubuntu/Debian

La instalación requiere dos comandos. Sin repositorios externos.

sudo apt update
sudo apt install nginx -y

Verifica que el servicio arranque correctamente.

sudo systemctl enable nginx
sudo systemctl start nginx
nginx -v

Si ves la versión, Nginx está listo. Elimina el server block por defecto para evitar conflictos.

sudo rm /etc/nginx/sites-enabled/default

Configuración básica: el primer server block

Crea un archivo de configuración para tu dominio. Usa el directorio sites-available y crea un enlace simbólico en sites-enabled.

sudo nano /etc/nginx/sites-available/example.com

Inserta la configuración base. Este block escucha en el puerto 80 y sirve como entrada para el tráfico.

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Este es el archivo mínimo para hacer funcionar un Nginx reverse proxy. Habilita la configuración y recarga.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

proxy_pass: enrutar el tráfico hacia el backend

La directiva proxy_pass define dónde Nginx envía la petición. Si tienes una app Node.js en el puerto 3000, proxy_pass http://localhost:3000; reenvía todo el tráfico allí. Puedes apuntar a una IP interna, a un socket UNIX o a un grupo de servidores upstream. Consulta la documentación oficial del módulo proxy de Nginx para todas las directivas disponibles. Si el backend tarda más de 60 segundos en responder, Nginx devuelve un 504 Gateway Timeout. Ajusta los timeouts para aplicaciones lentas. Lee también: SSH Hardening Linux: Complete Guide 2026 (10 Critical Settings) para asegurar el acceso por shell a tus servidores.

proxy_connect_timeout 10s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;

Headers HTTP: X-Real-IP, X-Forwarded-For

Sin estos headers, el backend ve la IP interna de Nginx como origen. Los logs de la aplicación se vuelven inútiles para rastrear ataques. X-Real-IP pasa la IP del cliente original. X-Forwarded-For añade la IP del cliente a la cadena de proxies. X-Forwarded-Proto indica al backend si la petición original era HTTPS. Configúralos siempre.

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;

Terminación SSL/TLS con Let’s Encrypt (certbot)

Gestionar SSL en el backend es complejo y costoso. Con Nginx reverse proxy, terminas el cifrado en el perímetro. El tráfico entre Nginx y el backend viaja en claro por la red local. Instala Certbot para automatizar los certificados Let’s Encrypt.

sudo apt install certbot python3-certbot-nginx -y

Obtén el certificado. Certbot modifica tu server block automáticamente.

sudo certbot --nginx -d example.com

La renovación automática ya está configurada. Verifica con una simulación.

sudo certbot renew --dry-run

Balanceo de carga entre múltiples backend

Si tienes dos o más instancias de la misma aplicación, Nginx distribuye el tráfico. Define un bloque upstream fuera del server block.

upstream backend_node {
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
    server 10.0.0.3:3000;
}

En tu server block, cambia el proxy_pass para apuntar al upstream.

proxy_pass http://backend_node;

Por defecto Nginx usa round-robin. Si un servidor tiene más recursos, asígnale un mayor peso. server 10.0.0.1:3000 weight=3;

Caché con Nginx: reducir la carga en el backend

Las peticiones repetidas saturan la CPU del backend. Un benchmark de NGINX Inc. (2024) muestra que la caché reduce la carga en el backend hasta un 70% y reduce a la mitad los tiempos de respuesta. Configura una zona de caché en el contexto http.

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

En tu location block, activa la caché.

location / {
    proxy_cache my_cache;
    proxy_pass http://backend_node;
    add_header X-Cache-Status $upstream_cache_status;
}

Rate limiting: proteger las API

El rate limiting bloquea ataques de fuerza bruta y previene abusos en las API. Define una zona de límite basada en la IP del cliente.

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

Aplica el límite en el location block de tus API. El parámetro burst permite picos controlados.

location /api/ {
    limit_req zone=api burst=20 nodelay;
    proxy_pass http://backend_node;
}

Si un cliente supera las 10 peticiones por segundo, Nginx devuelve un error 429 Too Many Requests.

Configuración para Node.js, Python (Gunicorn), PHP-FPM

Cambia el destino de proxy_pass según tu stack.

Para Node.js, la app escucha en el 3000.

proxy_pass http://127.0.0.1:3000;

Para Python con Gunicorn, usa un socket UNIX para mejor rendimiento.

proxy_pass http://unix:/run/gunicorn.sock;

Para PHP-FPM, no uses proxy_pass. Usa la directiva fastcgi_pass.

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Errores Comunes y Resolución de Problemas

502 Bad Gateway: Nginx no alcanza el backend. Comprueba que la app se está ejecutando y que el puerto o el socket UNIX son correctos.

504 Gateway Timeout: El backend tarda demasiado en responder. Aumenta proxy_read_timeout u optimiza el código de la aplicación.

Bucle de redirección infinito: Ocurre si el backend redirige a HTTPS pero no lee el header X-Forwarded-Proto. Asegúrate de que la aplicación reconoce que el tráfico original es seguro.

IP del servidor en los logs de la app: Olvidaste proxy_set_header X-Real-IP $remote_addr;. Añádelo y configura la app para leer el header.

Conclusiones con Puntos Clave Operativos

Un backend expuesto directamente es un objetivo fácil. Nginx reverse proxy aísla tus aplicaciones, gestiona el cifrado y filtra el tráfico dañino. Los tres pasos fundamentales para asegurar la infraestructura son: configura proxy_pass para ocultar el backend, establece la terminación SSL con Certbot para cifrar el tráfico entrante, y activa limit_req para bloquear abusos en las API. No esperes al primer ataque para proteger tus servidores.

Comparte este artículo:

Escrito por

Rosario Giordano

Rosario Giordano es administrador de sistemas y consultor de TI especializado en c iberseguridad y cloud, con más de 20 años de experiencia en la gestión de infraestructuras Linux empresariales. Sus áreas de especialización incluyen el hardening de SSH, plataformas Kubernetes , bases de datos PostgreSQL, virtualización con VMware/Proxmox y el cumplimiento de los marcos de seguridad NIS2 e ISO 27001.