HAProxy Load Balancer: Guía de Configuración de Alta Disponibilidad

HAProxy (High Availability Proxy) es uno de los balanceadores de carga mas utilizados en la industria. Empresas como GitHub, Reddit, Stack Overflow y Airbnb confian en HAProxy para distribuir millones de solicitudes por segundo entre sus servidores backend. Su rendimiento excepcional, flexibilidad de configuracion y fiabilidad probada lo convierten en una pieza fundamental de cualquier arquitectura web de produccion.

Instalación y Configuración Básica

HAProxy esta disponible en los repositorios de la mayoria de distribuciones Linux, pero para obtener la version mas reciente con todas las caracteristicas es recomendable usar el PPA oficial o compilar desde el codigo fuente.

sudo apt update
sudo apt install haproxy
haproxy -v

sudo systemctl enable haproxy
sudo systemctl start haproxy

La configuracion de HAProxy se encuentra en /etc/haproxy/haproxy.cfg. El archivo se divide en secciones: global para parametros del proceso, defaults para opciones compartidas, frontend para definir donde escucha HAProxy y backend para los servidores destino.

global
    log /dev/log local0
    maxconn 50000
    user haproxy
    group haproxy
    daemon
    ssl-default-bind-options ssl-min-ver TLSv1.2

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms
    retries 3

Estas configuraciones globales establecen los parametros de rendimiento base. El valor maxconn controla el numero maximo de conexiones simultaneas, mientras que los timeouts definen cuanto tiempo espera HAProxy antes de cerrar conexiones inactivas.

Frontend, Backend y Balanceo de Carga

La configuracion de frontend define los puntos de entrada donde HAProxy acepta conexiones de los clientes. El backend define los servidores de aplicacion que procesaran las solicitudes. Los algoritmos de balanceo determinan como se distribuye el trafico.

frontend http_front
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/sitio.pem
    redirect scheme https code 301 if !{ ssl_fc }
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server web1 192.168.1.10:8080 check inter 5s fall 3 rise 2
    server web2 192.168.1.11:8080 check inter 5s fall 3 rise 2
    server web3 192.168.1.12:8080 check inter 5s fall 3 rise 2 backup

La directiva option httpchk configura verificaciones de salud HTTP que envian solicitudes periodicas al endpoint /health de cada servidor. Si un servidor falla tres verificaciones consecutivas (fall 3), HAProxy lo marca como inactivo y deja de enviarle trafico hasta que pase dos verificaciones exitosas (rise 2).

El tercer servidor esta marcado como backup, lo que significa que solo recibira trafico cuando los servidores principales esten caidos. Esta configuracion proporciona una capa adicional de resiliencia para situaciones de emergencia.

Alta Disponibilidad con Keepalived

Para eliminar HAProxy como punto unico de fallo, necesitas al menos dos instancias con una IP virtual compartida mediante Keepalived. VRRP (Virtual Router Redundancy Protocol) permite que multiples nodos compartan una direccion IP, con failover automatico si el nodo primario falla.

sudo apt install keepalived
# /etc/keepalived/keepalived.conf (nodo primario)
vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secreto_seguro
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        chk_haproxy
    }
}

El script chk_haproxy verifica que el proceso de HAProxy este ejecutandose. Si falla, Keepalived reduce la prioridad del nodo, permitiendo que el nodo secundario (con prioridad 100) asuma la IP virtual automaticamente. La transicion ocurre en segundos, minimizando el impacto para los usuarios.

Monitoreo y Rate Limiting

HAProxy incluye una pagina de estadisticas integrada que proporciona metricas en tiempo real sobre el estado de los backends, tasas de solicitudes, tiempos de respuesta y errores. Activarla es esencial para operar HAProxy en produccion.

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats realm HAProxy\ Statistics
    stats auth admin:contraseña_segura
    stats refresh 10s

Para proteger tus backends contra abuso, implementa rate limiting usando stick-tables. Estas tablas almacenan contadores por direccion IP y permiten rechazar o limitar clientes que exceden los umbrales definidos.

frontend http_front
    bind *:80
    stick-table type ip size 200k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }

Esta configuracion limita cada IP a un maximo de 100 solicitudes cada 10 segundos. Las solicitudes que excedan el limite recibiran una respuesta HTTP 429 (Too Many Requests), protegiendo tus servidores de aplicacion contra sobrecarga accidental o ataques de denegacion de servicio.

Artículos Relacionados