Guía Avanzada de Configuración de HAProxy
La configuración avanzada de HAProxy como proxy inverso permite optimizar y asegurar la distribución del tráfico entre múltiples servidores backend, garantizando alta disponibilidad y rendimiento. Para implementar estas configuraciones, es esencial definir reglas de balanceo de carga más sofisticadas, como el balanceo basado en sesiones o cookies, o el uso de algoritmos avanzados como "leastconn" para asignar nuevas conexiones al servidor con menos conexiones activas. Además, se pueden implementar controles de salud personalizados mediante sondas HTTP/HTTPS para monitorear el estado de los servidores backend y retirar automáticamente aquellos que no respondan correctamente. También es posible integrar HAProxy con certificados SSL/TLS para cifrar el tráfico y utilizar ACLs (listas de control de acceso) para gestionar y restringir el acceso a ciertos recursos, basándose en una variedad de parámetros como la IP del cliente, el encabezado HTTP, o los patrones de URL. Con estas configuraciones avanzadas, HAProxy no solo actúa como un simple distribuidor de tráfico, sino que se convierte en una herramienta integral para la gestión eficiente y segura de la infraestructura web.
Global Configuration
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 32768
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
- log /dev/log local0 y local1 notice: Define los destinos de registro (logging) y los niveles de severidad.
local0
ylocal1
son las facilidades de syslog. - chroot /var/lib/haproxy: Cambia el directorio raíz de HAProxy para aumentar la seguridad.
- stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners: Crea un socket UNIX para comandos de administración.
- stats timeout 30s: Tiempo de espera para las conexiones en el socket de estadísticas.
- user haproxy y group haproxy: Ejecuta HAProxy con los permisos de usuario y grupo especificados.
- daemon: Ejecuta HAProxy en segundo plano.
- maxconn 32768: Establece el número máximo de conexiones simultáneas.
- ca-base y crt-base: Directorios base para certificados SSL.
- ssl-default-bind-ciphers y ssl-default-bind-ciphersuites: Define las suites de cifrado por defecto para conexiones SSL.
- ssl-default-bind-options: Opciones SSL adicionales, como la versión mínima de TLS permitida.
Default Configuration
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
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
- log global: Usa los parámetros de logging definidos en la sección
global
. - mode http: Establece el modo de operación HTTP.
- option httplog: Activa el registro HTTP detallado.
- option dontlognull: No registra conexiones nulas.
- option forwardfor: Añade una cabecera
X-Forwarded-For
con la IP del cliente. - timeout http-request 60s: Tiempo de espera para solicitudes HTTP.
- timeout connect 600s: Tiempo de espera para conexiones TCP.
- timeout client 600s y timeout server 600s: Tiempo de espera para las interacciones entre cliente y servidor.
- errorfile 4xx/5xx: Archivos de error personalizados para códigos HTTP específicos.
Estadísticas
listen stats
bind *:9000
mode http
stats enable
stats hide-version
stats refresh 10s
stats show-node
stats uri /server-status
- *bind :9000: Escucha en el puerto 9000.
- mode http: Operación en modo HTTP.
- stats enable: Habilita la interfaz de estadísticas.
- stats hide-version: Oculta la versión de HAProxy en la interfaz de estadísticas.
- stats refresh 10s: Actualiza las estadísticas cada 10 segundos.
- stats show-node: Muestra el nombre del nodo.
- stats uri /server-status: Define la URI para acceder a las estadísticas.
Frontends
HTTP Frontend
frontend www80_front
bind *:80
mode http
option httplog
acl is_example1.com hdr_end(host) -i example1.com
acl is_example2.com hdr_end(host) -i example2.com
acl is_www.example2.com hdr_end(host) -i www.example2.com
acl is_example3.com hdr_end(host) -i example3.com
acl is_www.example3.com hdr_end(host) -i www.example3.com
use_backend example180 if is_example1.com
use_backend example280 if is_example2.com
use_backend example280 if is_www.example2.com
use_backend example380 if is_example3.com
use_backend example380 if is_www.example3.com
- *bind :80: Escucha en el puerto 80.
- mode http: Operación en modo HTTP.
- option httplog: Activa el registro HTTP detallado.
- acl is_example.com: Define reglas ACL para verificar el nombre del host.
- use_backend example80: Usa el backend correspondiente si la condición ACL se cumple.
HTTPS Frontend
frontend www443_front
mode tcp
option tcplog
bind *:443
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 1s
tcp-request content accept if tls
acl is_example1.com_443 req.ssl_sni -i example1.com
acl is_example2.com_443 req.ssl_sni -i example2.com
acl is_www.example2.com_443 req.ssl_sni -i www.example2.com
acl is_example3.com_443 req.ssl_sni -i example3.com
acl is_www.example3.com_443 req.ssl_sni -i www.example3.com
use_backend example1443 if is_example1.com_443
use_backend example2443 if is_example2.com_443
use_backend example2443 if is_www.example2.com_443
use_backend example3443 if is_example3.com_443
use_backend example3443 if is_www.example3.com_443
- *bind :443: Escucha en el puerto 443.
- mode tcp: Operación en modo TCP.
- option tcplog: Activa el registro TCP detallado.
- acl tls req.ssl_hello_type 1: Verifica si es una conexión TLS.
- tcp-request inspect-delay 1s: Tiempo de espera para inspección de contenido TCP.
- tcp-request content accept if tls: Acepta la solicitud si es una conexión TLS.
- acl is_example.com_443: Define reglas ACL para verificar el SNI (Server Name Indication).
- use_backend example443: Usa el backend correspondiente si la condición ACL se cumple.
Backends
Example 1
backend example180
mode http
server apache80 192.168.20.12:80 send-proxy check
backend example1443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.12:443 send-proxy check
- mode http/tcp: Define el modo de operación del backend.
- server apache80/apache443: Define el servidor backend y su IP y puerto.
- send-proxy: Envia información PROXY al servidor backend.
- check: Habilita la verificación de estado del servidor.
Example 2
backend example280
mode http
server apache80 192.168.20.15:80 send-proxy check
backend example2443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.15:443 send-proxy check
Example 3
backend example380
mode http
server apache80 192.168.20.14:80 send-proxy check
backend example3443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.14:443 send-proxy check
Configuración final completa del fichero de haproxy como proxy inverso con multiples dominios:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 32768
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
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
listen stats
bind *:9000
mode http
stats enable
stats hide-version
stats refresh 10s
stats show-node
stats uri /server-status
frontend www80_front
bind *:80
mode http
option httplog
acl is_example1.com hdr_end(host) -i example1.com
acl is_example2.com hdr_end(host) -i example2.com
acl is_www.example2.com hdr_end(host) -i www.example2.com
acl is_example3.com hdr_end(host) -i example3.com
acl is_www.example3.com hdr_end(host) -i www.example3.com
use_backend example180 if is_example1.com
use_backend example280 if is_example2.com
use_backend example280 if is_www.example2.com
use_backend example380 if is_example3.com
use_backend example380 if is_www.example3.com
frontend www443_front
mode tcp
option tcplog
bind *:443
acl tls req.ssl_hello_type 1
tcp-request inspect-delay 1s
tcp-request content accept if tls
acl is_example1.com_443 req.ssl_sni -i example1.com
acl is_example2.com_443 req.ssl_sni -i example2.com
acl is_www.example2.com_443 req.ssl_sni -i www.example2.com
acl is_example3.com_443 req.ssl_sni -i example3.com
acl is_www.example3.com_443 req.ssl_sni -i www.example3.com
use_backend example1443 if is_example1.com_443
use_backend example2443 if is_example2.com_443
use_backend example2443 if is_www.example2.com_443
use_backend example3443 if is_example3.com_443
use_backend example3443 if is_www.example3.com_443
backend example180
mode http
server apache80 192.168.20.12:80 send-proxy check
backend example1443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.12:443 send-proxy check
backend example280
mode http
server apache80 192.168.20.15:80 send-proxy check
backend example2443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.15:443 send-proxy check
backend example380
mode http
server apache80 192.168.20.14:80 send-proxy check
backend example3443
mode tcp
option ssl-hello-chk
server apache443 192.168.20.14:443 send-proxy check
Explicación
- Frontend HTTP (www80_front): Escucha en el puerto 80 y utiliza reglas ACL para redirigir el tráfico HTTP basado en el host.
- Por ejemplo, el tráfico destinado a
example1.com
se dirige al backendexample180
.
- Por ejemplo, el tráfico destinado a
- Frontend HTTPS (www443_front): Escucha en el puerto 443 y utiliza reglas ACL para redirigir el tráfico HTTPS basado en el SNI (Server Name Indication).
- Por ejemplo, el tráfico destinado a
example1.com
se dirige al backendexample1443
.
- Por ejemplo, el tráfico destinado a
- Backends: Define los servidores backend a los que se dirige el tráfico.
example180
yexample1443
corresponden aexample1.com
.example280
yexample2443
corresponden aexample2.com
.example380
yexample3443
corresponden aexample3.com
.
Esta configuración permite manejar múltiples dominios y subdominios en los puertos HTTP y HTTPS, redirigiendo el tráfico a los backends correspondientes según las reglas definidas.
Conclusión
Esta configuración de HAProxy permite gestionar múltiples dominios y subdominios en los puertos HTTP y HTTPS. Las ACLs se utilizan para dirigir el tráfico a los backends apropiados, asegurando que cada solicitud se maneje correctamente según el dominio solicitado. La seguridad se refuerza