HAProxy es una herramienta ampliamente utilizada para balanceo de carga y proxy inverso, diseñada para manejar grandes volúmenes de tráfico en entornos de alta disponibilidad. Su archivo de configuración es esencial para definir cómo se gestionan las solicitudes entrantes y cómo se distribuyen entre los servidores backend. En este artículo, explicaremos las secciones clave de un archivo de configuración típico de HAProxy, destacando su propósito y funcionalidad.
Estructura General del Archivo de Configuración
Un archivo de configuración de HAProxy suele dividirse en tres secciones principales:
- Global: Define parámetros a nivel global, como los límites de conexión, la ubicación de los registros y otros ajustes generales.
- Defaults: Establece configuraciones predeterminadas que se pueden aplicar a las secciones de frontend y backend.
- Frontend y Backend: Estas secciones se encargan de gestionar cómo se reciben las solicitudes (frontend) y cómo se envían a los servidores backend.
A continuación, explicamos un ejemplo de configuración de HAProxy con dominios ficticios (example.com
, example2.com
, example3.com
).
Ejemplo de Archivo de Configuración
Sección Global
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
maxconn 8192
En esta sección:
- log: Define las ubicaciones de los registros. Se indican dos destinos para los logs,
/dev/log
con los niveleslocal0
ylocal1
. - chroot: Cambia el directorio raíz a
/var/lib/haproxy
, lo que mejora la seguridad al limitar el acceso de HAProxy al sistema. - user y group: Definen el usuario y grupo bajo los cuales se ejecuta HAProxy, en este caso,
haproxy
. - daemon: Ejecuta HAProxy como un proceso en segundo plano.
- maxconn: Establece el número máximo de conexiones que HAProxy puede manejar simultáneamente.
Sección Defaults
defaults
log global
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
Aquí, se definen opciones predeterminadas para los frontends y backends, como:
- log: Utiliza la configuración global de los registros.
- option httplog: Habilita el registro de solicitudes HTTP.
- option dontlognull: Evita registrar solicitudes sin contenido.
- timeouts: Se establecen límites de tiempo para las solicitudes HTTP, la conexión y la comunicación con los clientes y servidores.
- errorfile: Define los archivos de error personalizados que se sirven cuando ocurre un error (por ejemplo, 400, 403, 404, etc.).
Sección Frontend
frontend www80_front
bind *:80
mode http
option httplog
option forwardfor
use_backend example80 if { hdr(host) -i example.com }
use_backend example2_80 if { hdr(host) -i example2.com }
use_backend example3_80 if { hdr(host) -i example3.com }
use_backend example3_80 if { hdr(host) -i www.example3.com }
En esta sección:
- bind: HAProxy escucha en el puerto 80 (HTTP) en todas las interfaces.
- mode http: El tráfico se maneja en modo HTTP, lo que permite aplicar opciones específicas de HTTP, como el registro de solicitudes.
- option httplog: Activa el registro de solicitudes HTTP.
- option forwardfor: Añade la cabecera
X-Forwarded-For
para mantener la dirección IP original del cliente. - use_backend: Redirige las solicitudes a diferentes backends según el encabezado
Host
de la solicitud. En este caso, si el dominio esexample.com
, la solicitud se redirige al backend correspondiente.
Sección Backend
backend example80
mode http
server example1_server 192.168.1.10:80 send-proxy check
backend example2_80
mode http
server example2_server 192.168.1.20:80 send-proxy check
backend example3_80
mode http
server example3_server 192.168.1.30:80 send-proxy check
Cada backend define cómo se gestionan las solicitudes que llegan a los frontends. En este caso:
- mode http: Define que el backend maneja tráfico HTTP.
- server: Especifica la dirección IP y el puerto del servidor backend. Aquí, HAProxy se conecta a servidores específicos (por ejemplo,
192.168.1.10:80
) para manejar las solicitudes. La opciónsend-proxy
pasa información adicional a los servidores, ycheck
habilita la verificación de salud del servidor para garantizar que las solicitudes solo se envíen a servidores funcionales.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
maxconn 8192
defaults
log global
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 example80 if { hdr(host) -i example.com }
use_backend example2_80 if { hdr(host) -i example2.com }
use_backend example3_80 if { hdr(host) -i example3.com }
use_backend example3_80 if { hdr(host) -i www.example3.com }
frontend www443_front
mode tcp
option tcplog
bind *:443
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend example443 if { req.ssl_sni -i example.com }
use_backend example2_443 if { req.ssl_sni -i example2.com }
use_backend example3_443 if { req.ssl_sni -i example3.com }
use_backend example3_443 if { req.ssl_sni -i www.example3.com }
backend example80
mode http
server example1_server
192.168.1.10:80 send-proxy check
backend example443
mode tcp
server example1_server
192.168.1.10:443 send-proxy check
backend example2_80
mode http
server example2_server
192.168.1.20:80 send-proxy check
backend example2_443
mode tcp
server example2_server
192.168.1.20:443 send-proxy check
backend example3_80
mode http
server example3_server
192.168.1.30:80 send-proxy check
backend example3_443
mode tcp
server example3_server
192.168.1.30:443 send-proxy check
Conclusión
El archivo de configuración de HAProxy es esencial para gestionar de manera eficiente el tráfico web y garantizar la alta disponibilidad. Mediante las secciones globales, defaults, frontend y backend, se puede controlar cómo se reciben y procesan las solicitudes y cómo se distribuyen entre los servidores backend.
Este ejemplo ha sido simplificado y adaptado a un escenario con dominios ficticios (example.com
, example2.com
, example3.com
) para ilustrar cómo funciona HAProxy en un entorno de producción. Al personalizar estos valores según las necesidades específicas de tu infraestructura, puedes garantizar que tu sistema de balanceo de carga funcione de manera óptima y segura.