Configuración de HAProxy como Proxy Inverso para Multidominios y Multibackend

Artículos Guías Manuales Sistemas Linux Windows Binario 0

Este archivo de configuración de HAProxy actúa como un proxy inverso que dirige el tráfico entrante a diferentes backends (servidores de aplicaciones) en función del dominio solicitado. Esta configuración está optimizada para un entorno multi-dominio y multi-backend, donde se gestiona tanto tráfico HTTP como HTTPS (puertos 80 y 443). Se omiten estadísticas y opciones innecesarias, manteniendo solo lo esencial.

Secciones principales del archivo de configuración de HAProxy

La configuración de HAProxy se organiza en varias secciones que facilitan su configuración modular:

  1. Sección global: Define parámetros globales que afectan a toda la instancia de HAProxy.
  2. Sección defaults: Configura parámetros predeterminados para simplificar la definición de otras secciones.
  3. Sección frontend: Define las entradas de tráfico, es decir, las interfaces y puertos que HAProxy escucha.
  4. Sección backend: Define los servidores a los que HAProxy envía el tráfico en función de las reglas configuradas en el frontend.

Explicación de cada sección del archivo

1. Sección global

La sección global contiene configuraciones de nivel general. Aquí se define cómo HAProxy maneja el registro, los permisos y la ubicación de su ejecución. Estas opciones son:

  • log /dev/log local0 y log /dev/log local1 notice: Define el registro de logs en dos niveles.
  • chroot /var/lib/haproxy: Cambia el directorio raíz por seguridad.
  • user haproxy y group haproxy: Define el usuario y grupo bajo los cuales se ejecuta HAProxy.
  • daemon: Configura HAProxy para que se ejecute en segundo plano.
  • maxconn 8192: Limita el número máximo de conexiones simultáneas para gestionar recursos.

2. Sección defaults

La sección defaults configura parámetros comunes para las demás secciones y evita redundancia en la configuración:

  • log global: Define que use la configuración de logs de la sección global.
  • mode http: Establece el modo HTTP para la mayoría de las opciones.
  • option httplog y option dontlognull: Controlan el tipo de registro de solicitudes.
  • timeout: Define varios tiempos de espera:
    • timeout http-request 60s: Tiempo de espera para la solicitud HTTP.
    • timeout connect 600s: Tiempo de espera al conectarse al backend.
    • timeout client 600s y timeout server 600s: Tiempos de espera para el cliente y el servidor.
  • errorfile: Define archivos personalizados de error para códigos HTTP comunes, ubicados en /etc/haproxy/errors.

3. Sección frontend

La sección frontend configura las interfaces que HAProxy escucha y redirige el tráfico según el dominio o el SNI (Server Name Indication):

Configuración de HTTP (puerto 80)
  • bind *:80: Escucha en todas las interfaces en el puerto 80.
  • mode http: Activa el modo HTTP.
  • option forwardfor: Permite reenviar la IP original del cliente.
  • use_backend: Redirige el tráfico a los diferentes backends según el encabezado Host.
Configuración de HTTPS (puerto 443)
  • bind *:443: Escucha en el puerto 443.
  • mode tcp: Se usa el modo TCP para el tráfico cifrado.
  • tcp-request inspect-delay 3s: Define un retardo para inspeccionar la conexión SSL.
  • tcp-request content accept if { req_ssl_hello_type 1 }: Inspecciona el tipo de conexión SSL.
  • use_backend: Redirige el tráfico al backend correspondiente usando SNI para determinar el dominio.

4. Sección backend

La sección backend configura los servidores a los que se redirige el tráfico entrante de acuerdo con el dominio. Cada backend representa un servicio distinto y permite gestionar tanto tráfico HTTP como HTTPS:

  • mode http o mode tcp: Define el tipo de tráfico para cada backend.
  • server: Define el nombre del servidor, la IP y el puerto a donde se enviará el tráfico.

En este archivo de ejemplo, los dominios son miweb1.com, miweb2.com, y miweb3.com, que se redirigen a diferentes servidores backend.

Archivo de Configuración de HAProxy

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
maxconn 8192

defaults
log global
mode http
option httplog
option dontlognull
timeout http-request 60s
timeout connect 600s
timeout client 600s
timeout server 600s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

frontend www80_front
bind *:80
mode http
option httplog
option forwardfor

use_backend miweb1_80 if { hdr(host) -i miweb1.com }
use_backend miweb2_80 if { hdr(host) -i miweb2.com }
use_backend miweb3_80 if { hdr(host) -i miweb3.com }

frontend www443_front
mode tcp
option tcplog
bind *:443
tcp-request inspect-delay 3s
tcp-request content accept if { req_ssl_hello_type 1 }

use_backend miweb1_443 if { req.ssl_sni -i miweb1.com }
use_backend miweb2_443 if { req.ssl_sni -i miweb2.com }
use_backend miweb3_443 if { req.ssl_sni -i miweb3.com }

backend miweb1_80
mode http
server server1_80 192.168.50.10:80 send-proxy check

backend miweb1_443
mode tcp
server server1_443 192.168.50.10:443 send-proxy check

backend miweb2_80
mode http
server server2_80 192.168.50.11:80 send-proxy check

backend miweb2_443
mode tcp
server server2_443 192.168.50.11:443 send-proxy check

backend miweb3_80
mode http
server server3_80 192.168.50.12:80 send-proxy check

backend miweb3_443
mode tcp
server server3_443 192.168.50.12:443 send-proxy check

Este archivo está diseñado para que HAProxy funcione como proxy inverso, distribuyendo el tráfico en función del dominio solicitado. En este caso, cada dominio es gestionado por un backend diferente, lo que permite un control detallado sobre el tráfico de cada dominio y protocolo.