Configurando HAProxy como Proxy Reverso (HTTP/HTTPS)
🌐 Visión General
Esta guía muestra cómo configurar HAProxy como proxy reverso HTTP/HTTPS, con soporte para Let's Encrypt, balanceo de carga y sesiones sticky. La configuración a continuación está basada en la instalación estándar de SaveinCloud.
🧱 Estructura de la Configuración
🔹 Global
global
log 127.0.0.1 local0
user haproxy
group haproxy
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-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-default-server-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-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-dh-param-file /etc/haproxy/dhparam.pem
tune.ssl.default-dh-param 2048
pidfile /var/run/haproxy.pid
maxconn 10000
daemon
Explicación:
log: define el destino de los logs.ssl-default-*: define las políticas de seguridad estándar para conexiones SSL.dhparam.pem: define el parámetro Diffie-Hellman para SSL seguro (2048 bits).maxconn: número máximo de conexiones simultáneas.daemon: ejecuta HAProxy como servicio en segundo plano.
🔸 Defaults
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 10000
Explicación:
mode http: define el modo HTTP como predeterminado.option httplog: activa logs en formato HTTP detallado.timeout *: define límites para evitar conexiones colgadas.redispatch: intenta otro backend si el actual falla.
📡 Frontend: Recibiendo las conexiones
frontend ft_http
bind :::80 v4v6
bind :::443 v4v6 ssl crt /var/lib/jelastic/SSL/jelastic.pem alpn h2,http/1.1
mode http
acl host_app1 hdr(host) -i app1.exemplo.com
acl host_app2 hdr(host) -i app2.exemplo.com
use_backend bk_app1 if host_app1
use_backend bk_app2 if host_app2
stats enable
stats auth admin:<senha>
stats refresh 30s
stats uri /haproxy_adm_panel
stats show-node
stats admin if TRUE
option forwardfor
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header HTTPS on if { ssl_fc }
http-request set-header Ssl-Offloaded 1 if { ssl_fc }
default_backend bk_http
Explicación:
bind :::80/:::443: escucha en todas las interfaces IPv4/IPv6 en los puertos 80 (HTTP) y 443 (HTTPS).ssl crt ...: usa certificado generado automáticamente por Let's Encrypt.alpn: habilita soporte para HTTP/2.acl hdr(host): crea reglas basadas en el dominio accedido.use_backend: direcciona el tráfico basado en la ACL correspondiente.default_backend: usado si ninguna ACL es satisfecha.stats *: activa panel de administración vía/haproxy_adm_panel.set-header: añade cabeceras útiles para el backend (como HTTPS real vía proxy).
🧩 Backend predeterminado (ejemplo con balanceo)
backend bk_http
mode http
cookie SRVNAME insert
balance roundrobin
server webserver1 10.100.75.251:${BACKEND_PORT} check cookie S1
Explicación:
-
mode http: modo HTTP explícito. -
cookie SRVNAME insert: activa sesiones sticky vía cookie (el cliente se mantiene en el mismo backend). -
balance roundrobin: distribuye solicitudes entre los servidores de forma equilibrada. -
server: define el servidor backend.check: activa health check.cookie S1: valor que será insertado en la cookie para sesión sticky.
🧩 Backend por Dominio (Ejemplo con ACLs)
backend bk_app1
server app1_backend 10.0.0.101:80 check
backend bk_app2
server app2_backend 10.0.0.102:80 check
Explicación:
- Permite separar el tráfico de diferentes dominios hacia destinos distintos.
- Puede ser expandido con
mode http, balanceo y cookies según necesidad.
🔄 balance: Estrategias de Balanceo de Carga
Define cómo las solicitudes se distribuyen entre los servidores backend.
balance roundrobin
| Modo | Descripción |
|---|---|
roundrobin | Predeterminado. Distribuye solicitudes de forma secuencial. |
leastconn | Va al servidor con menos conexiones activas. |
source | Usa IP del cliente como base para persistencia. |
uri | Usa la ruta de la URL para distribuir solicitudes. |
hdr(name) | Usa el valor de un encabezado HTTP (ej: User-Agent). |
rdp-cookie | Específico para balancear sesiones RDP. |
🍪 cookie: Sesiones Sticky con Cookies
cookie SRVNAME insert
| Opción | Descripción |
|---|---|
insert | Inserta la cookie en la respuesta automáticamente. |
rewrite | Usa cookie recibido del cliente. |
prefix | Añade nombre del servidor al inicio de la cookie. |
indirect | No reenvía cookie si ya está presente. |
nocache | Evita caché de proxies intermedios para la cookie. |
Cada servidor debe tener un identificador de cookie:
server app1 10.0.0.1:80 cookie A1 check
🌍 mode: Tipos de Comunicación
Define el tipo de protocolo inspeccionado en frontend/backend.
mode http
| Modo | Descripción |
|---|---|
http | Modo predeterminado. Permite inspeccionar y manipular cabeceras HTTP. |
tcp | Modo raw. Ideal para protocolos como MySQL, PostgreSQL, SMTP, etc. |
health | Usado solo para health checks. |
🛑 Backend Default (fallback)
backend default
mode http
errorfile 503 /etc/haproxy/welcome.http
Explicación:
- Usado como fallback cuando no hay backends válidos.
- Sirve un archivo estático de error 503 con mensaje personalizado.
🎯 Consejos y Buenas Prácticas
- Use
maxconnpara evitar sobrecarga en HAProxy. - El panel en
/haproxy_adm_panelrequiere autenticación básica — ¡cambie la contraseña predeterminada! - El certificado Let's Encrypt se actualiza automáticamente por la plataforma.
- Para redirigir HTTP a HTTPS, puede usar:
redirect scheme https if !{ ssl_fc }
Coloque esto al inicio de frontend ft_http si desea forzar HTTPS.