HAProxy (High Availability Proxy) es un balanceador de carga TCP/HTTP de alto rendimiento y código abierto, y un servidor proxy que distribuye el tráfico de red entre múltiples servidores backend para maximizar el rendimiento, la fiabilidad y la capacidad del servidor. Opera tanto en la Capa 4 (TCP) como en la Capa 7 (HTTP) del modelo OSI, lo que permite una gestión precisa del tráfico, alta disponibilidad y una utilización eficiente de los recursos para aplicaciones y servicios.
HAProxy es reconocido por su velocidad, estabilidad y capacidad para manejar volúmenes de tráfico muy altos. Se implementa comúnmente delante de servidores web, servidores de aplicaciones y clústeres de bases de datos para asegurar una distribución uniforme de las solicitudes de los clientes, prevenir la sobrecarga del servidor y facilitar operaciones de mantenimiento sin interrupciones.
Balanceo de Carga con HAProxy
El balanceo de carga es el proceso de distribuir el tráfico de red entre un grupo de servidores backend, conocido como granja o clúster de servidores. HAProxy emplea varios algoritmos para determinar qué servidor recibe la siguiente solicitud, con el objetivo de optimizar el uso de recursos, maximizar el rendimiento, minimizar el tiempo de respuesta y evitar la sobrecarga de servidores individuales.
Los aspectos clave del balanceo de carga de HAProxy incluyen:
- Selección de Algoritmo: HAProxy ofrece varios algoritmos para adaptarse a diferentes necesidades de la aplicación.
- Comprobaciones de Salud del Servidor: Monitoreo continuo de la disponibilidad y capacidad de respuesta del servidor backend.
- Ponderación de Servidores: Priorizar ciertos servidores para que reciban más tráfico.
Algoritmos de Balanceo de Carga
HAProxy proporciona una variedad de algoritmos configurados dentro de la sección backend:
roundrobin: Distribuye las solicitudes secuencialmente a cada servidor en el grupo backend. Algoritmo predeterminado.leastconn: Dirige las nuevas conexiones al servidor con el menor número de conexiones activas. Óptimo para conexiones de larga duración.source: Utiliza un hash de la dirección IP de origen para determinar el servidor. Asegura que un cliente se conecte consistentemente al mismo servidor, útil para aplicaciones con estado sin persistencia de sesión explícita.uri: Hashea la parte izquierda de la URL (antes de la cadena de consulta) para seleccionar un servidor. Útil para proxies de caché.hdr(<name>): Hashea el valor de un encabezado HTTP especificado.random: Elige un servidor al azar.
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
server web3 192.168.1.12:80 check
Proxying con HAProxy
El proxying implica un servidor intermediario que actúa en nombre de un cliente o servidor. HAProxy funciona como un proxy inverso, aceptando conexiones de clientes y reenviándolas a servidores backend, luego devolviendo las respuestas de los servidores a los clientes. Esta capa de abstracción proporciona beneficios de seguridad, rendimiento y operativos.
Proxying de Capa 4 (TCP)
En la Capa 4, HAProxy reenvía conexiones TCP sin procesar sin inspeccionar el contenido de la capa de aplicación. Esto es adecuado para servicios no HTTP, bases de datos o protocolos personalizados donde la inspección de contenido no es necesaria o deseada.
listen mysql_cluster
bind *:3306
mode tcp
balance leastconn
server db1 192.168.1.20:3306 check
server db2 192.168.1.21:3306 check
Proxying de Capa 7 (HTTP)
En la Capa 7, HAProxy puede inspeccionar y manipular los encabezados de solicitud y respuesta HTTP, URLs y cookies. Esto permite características avanzadas como enrutamiento basado en contenido, terminación SSL, reescritura de URL y persistencia de sesión.
frontend http_frontend
bind *:80
mode http
default_backend web_servers
Componentes de Configuración de HAProxy
La configuración de HAProxy reside típicamente en /etc/haproxy/haproxy.cfg y está estructurada en varias secciones.
Sección global
La sección global define parámetros a nivel de proceso, como el registro, la configuración de seguridad y los límites de rendimiento. Estos ajustes se aplican a toda la instancia de HAProxy.
global
log /dev/log local0 info
maxconn 20000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
Sección defaults
La sección defaults especifica parámetros predeterminados para todas las secciones listen, frontend y backend que la siguen. Esto reduce la redundancia de la configuración.
defaults
mode http
log global
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option http-server-close
Sección frontend
Un frontend define el punto de entrada público donde HAProxy escucha las conexiones de los clientes. Especifica la dirección IP, el puerto, el protocolo (mode) y las reglas para enrutar las solicitudes a backends específicos utilizando Listas de Control de Acceso (ACLs).
frontend http_in
bind *:80
mode http
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
use_backend app1_servers if host_app1
use_backend app2_servers if host_app2
default_backend default_web_servers
Sección backend
Un backend define un grupo de servidores a los que HAProxy puede reenviar solicitudes. Incluye el algoritmo de balanceo de carga, los parámetros de comprobación de salud y las definiciones de servidores individuales.
backend app1_servers
balance leastconn
option httpchk GET /healthz
server s1 10.0.0.10:8080 check inter 2000 fall 3 rise 2
server s2 10.0.0.11:8080 check inter 2000 fall 3 rise 2 backup
check: Habilita las comprobaciones de salud para el servidor.inter 2000: Comprueba cada 2000ms.fall 3: Marca el servidor como inactivo después de 3 comprobaciones fallidas consecutivas.rise 2: Marca el servidor como activo después de 2 comprobaciones exitosas consecutivas.backup: El servidor solo se utilizará cuando todos los demás servidores no-backup estén inactivos.
Sección listen
Una sección listen combina las funcionalidades de un frontend y un backend en un solo bloque. Esto se usa a menudo para configuraciones más simples o para servicios como la página de estadísticas de HAProxy.
listen stats_page
bind *:8080
mode http
stats enable
stats uri /haproxy?stats
stats realm HAProxy\ Statistics
stats auth admin:securepassword
stats refresh 5s
Listas de Control de Acceso (ACLs)
Las ACLs son potentes reglas condicionales utilizadas para hacer coincidir criterios específicos en las solicitudes de los clientes (por ejemplo, IP de origen, encabezado de host, ruta de URL, método HTTP). Permiten el enrutamiento dinámico, el cambio de contenido y el bloqueo.
frontend website_frontend
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
# ACLs basadas en la ruta
acl is_admin_area path_beg /admin
acl is_api_v1 path_beg /api/v1
# Enrutamiento basado en ACLs
use_backend admin_backend if is_admin_area
use_backend api_v1_backend if is_api_v1
default_backend main_website_backend
Comprobaciones de Salud
HAProxy monitorea continuamente la salud de los servidores backend para asegurar que las solicitudes solo se envíen a instancias operativas. Si un servidor falla las comprobaciones de salud, HAProxy lo elimina temporalmente de la rotación hasta que se recupera.
- Comprobación TCP (
check): Conectividad básica del puerto. - Comprobación HTTP (
option httpchk): Envía una solicitud HTTP (por ejemplo,GET /health) y espera un código de estado HTTP válido (2xx o 3xx). - Comprobación SSL Hello (
ssl-hello-chk): Comprueba si se puede establecer un handshake SSL.
Características Avanzadas de HAProxy
Terminación y Descarga SSL
HAProxy puede manejar el cifrado y descifrado SSL/TLS, descargando esta tarea intensiva en CPU de los servidores backend. Descifra el tráfico HTTPS entrante y reenvía HTTP plano al backend, o puede volver a cifrar para SSL de extremo a extremo.
frontend https_in
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
mode http
default_backend web_servers
Sesiones Pegajosas (Persistencia)
Las sesiones pegajosas aseguran que las solicitudes de un cliente se enruten consistentemente al mismo servidor backend durante toda su sesión. Esto es crítico para aplicaciones que mantienen el estado de la sesión en servidores individuales.
- Persistencia basada en cookies: HAProxy inserta una cookie en el navegador del cliente, que luego se utiliza para identificar el servidor backend correcto para solicitudes posteriores.
- Persistencia de IP de origen: Utiliza la dirección IP de origen del cliente para enrutar consistentemente al mismo servidor (menos fiable detrás de NAT).
backend web_servers_sticky
balance roundrobin
cookie SERVERID insert indirect nocache
server s1 10.0.0.10:80 check cookie s1
server s2 10.0.0.11:80 check cookie s2
Enrutamiento Basado en Contenido
El enrutamiento basado en contenido dirige el tráfico a diferentes grupos de servidores backend basándose en atributos específicos dentro de la solicitud del cliente, como la ruta de URL solicitada, el encabezado de host HTTP o los encabezados HTTP personalizados. Esto facilita las arquitecturas de microservicios o las aplicaciones multi-inquilino.
(Ejemplo ya mostrado en la sección frontend con acl host_app1 y use_backend).
Alta Disponibilidad del Propio HAProxy
Mientras que HAProxy está diseñado para la alta disponibilidad de los servicios backend, las propias instancias de HAProxy pueden hacerse altamente disponibles utilizando mecanismos externos como VRRP (Virtual Router Redundancy Protocol) con herramientas como Keepalived. Esto crea una dirección IP flotante que automáticamente conmuta por error entre los servidores HAProxy primario y secundario en caso de un fallo, asegurando un servicio de balanceo de carga continuo.
HAProxy vs. Nginx (Breve Comparación)
Tanto HAProxy como Nginx pueden funcionar como proxies inversos y balanceadores de carga. Sus objetivos de diseño principales y patrones de implementación típicos difieren.
| Característica | HAProxy | Nginx |
|---|---|---|
| Rol Principal | Balanceador de Carga y Proxy dedicado, de alto rendimiento | Servidor Web, Proxy Inverso, Balanceador de Carga, Caché |
| Rendimiento | Extremadamente alto (especialmente L4/TCP) | Alto (bueno en general) |
| Configuración | Diseñado específicamente para balanceo de carga, amplias opciones | Más de propósito general, flexible |
| Almacenamiento en Caché | Limitado (requiere módulos externos) | Nativo, potente almacenamiento en caché HTTP |
| Servicio de Archivos Estáticos | No es su enfoque principal | Excelente, altamente optimizado |
| Modularidad | Relativamente monolítico | Altamente modular con un rico ecosistema de módulos |
| Terminación SSL | Sí | Sí |
| WebSockets | Sí | Sí |
HAProxy se elige a menudo para entornos críticos y de alto tráfico donde el rendimiento puro del balanceo de carga y las robustas comprobaciones de salud son primordiales. Nginx se utiliza con frecuencia cuando se necesita una combinación de servicio web, almacenamiento en caché y proxy inverso, junto con el balanceo de carga. Es común verlos implementados juntos, con HAProxy actuando como el balanceador de carga principal y Nginx manejando el proxying a nivel de aplicación específico o el contenido estático.
