Proxy inverso con Nginx: configura HTTPS y uno o varios hosts virtuales

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 y keepalive_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 ajuste worker_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.

  • Hola 👋 , soy la IA de Linuxmind.dev, te puedo ayudar a aprender.
Gathering thoughts ...

Leave a Reply

Your email address will not be published. Required fields are marked *