Introducción al Proxy inverso con Nginx
El proxy inverso se ha convertido en un componente esencial para arquitecturas modernas de aplicaciones web. Gracias a él, se logra distribuir y equilibrar la carga, mejorar la seguridad y simplificar la administración de certificados SSL. En este artículo presentaremos una guía detallada para configurar un proxy inverso con NGINX, incluyendo HTTPS y gestión de uno o varios hosts virtuales.
¿Qué es un proxy inverso
Un proxy inverso actúa como intermediario entre clientes externos y uno o varios servidores internos. A diferencia del proxy directo (o de salida), el proxy inverso recibe peticiones en nombre de los servidores finales y luego reenvía las solicitudes, ocultando la topología interna.
Beneficios de usar Nginx como proxy inverso
- Alto rendimiento: Maneja gran número de conexiones concurrentes con bajo consumo de memoria.
- SSL/TLS offloading: Descarga cifrado de HTTPS, reduciendo carga en servidores backend.
- Balanceo de carga: Distribuye peticiones entre varios servidores para alta disponibilidad.
- Caché: Acelera respuestas y reduce uso de ancho de banda.
- Seguridad: Filtrado de peticiones, protección contra ataques DDoS y fugas de información.
Requisitos previos
- Un servidor con Linux (Debian/Ubuntu/CentOS).
- Acceso root o usuario con
sudo
. - Puertos 80 y 443 abiertos en el firewall.
- Dominio(s) apuntando a la IP del servidor.
Instalación de Nginx
En distribuciones basadas en Debian/Ubuntu:
sudo apt update
sudo apt install nginx -y
En CentOS/RHEL:
sudo yum install epel-release -y
sudo yum install nginx -y
Iniciar y habilitar servicio:
sudo systemctl start nginx
sudo systemctl enable nginx
Configuración básica de un solo host virtual
Edite el archivo de configuración dentro de /etc/nginx/sites-available/
(o /etc/nginx/conf.d/
en CentOS):
server {
listen 80
server_name ejemplo.com www.ejemplo.com
location / {
proxy_pass http://127.0.0.1:8080
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_http_version 1.1
proxy_set_header Connection
}
}
Habilite y compruebe la configuración:
sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Habilitar HTTPS con Lets Encrypt
Instale Certbot:
sudo apt install certbot python3-certbot-nginx -y
Solicite el certificado:
sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com
Certbot modificará automáticamente la configuración de Nginx para redirigir HTTP a HTTPS y agregar los bloques de ssl_certificate
y ssl_certificate_key
. El resultado será similar a:
server {
listen 80
server_name ejemplo.com www.ejemplo.com
return 301 https://hostrequest_uri
}
server {
listen 443 ssl http2
server_name ejemplo.com www.ejemplo.com
ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem
ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem
include /etc/letsencrypt/options-ssl-nginx.conf
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem
location / {
proxy_pass http://127.0.0.1:8080
}
}
Configuración de múltiples hosts virtuales
Para añadir más dominios, cree nuevos archivos en sites-available
y repita el proceso. Ejemplo de estructura:
Dominio | Puerto interno | Certificado HTTPS |
---|---|---|
app1.ejemplo.com | 8081 | Lets Encrypt |
app2.ejemplo.com | 8082 | Lets Encrypt |
Cada bloque server
apuntará al upstream correspondiente:
upstream app1 {
server 127.0.0.1:8081
}
upstream app2 {
server 127.0.0.1:8082
}
Optimización y caché
- Caché de proxy:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m inactive=60m
- Compresión: Habilite Gzip para reducir tamaño de respuesta.
- Keepalive: Ajuste
keepalive_timeout
ykeepalive_requests
según carga.
Seguridad adicional
- Deshabilitar versiones innecesarias de protocolos SSL (
ssl_protocols TLSv1.2 TLSv1.3
). - Uso de
HTTP Strict Transport Security
(add_header Strict-Transport-Security max-age=31536000 always
). - Limitación de conexiones por IP (
limit_conn_zone binary_remote_addr zone=addr:10m
). - Implementar ModSecurity si es necesario.
Solución de problemas comunes
- Error 502 Bad Gateway: Verifique que el servicio backend esté activo y escuchando en el puerto configurado.
- Certificado inválido: Revise rutas de
ssl_certificate
y permisos en/etc/letsencrypt
. - Fallo en recarga de Nginx: Ejecute
nginx -t
para identificar sintaxis erróneas. - Conexiones lentas: Compruebe límites de sistema (
ulimit
) y ajusteworker_processes
.
Conclusión
La configuración de un proxy inverso con Nginx, combinado con HTTPS y múltiples hosts virtuales, proporciona una infraestructura robusta, segura y escalable para tus aplicaciones web. Siguiendo esta guía podrás implementar un entorno de producción optimizado y con altas garantías de disponibilidad.
Leave a Reply