Saltar al contenido principal

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
ModoDescripción
roundrobinPredeterminado. Distribuye solicitudes de forma secuencial.
leastconnVa al servidor con menos conexiones activas.
sourceUsa IP del cliente como base para persistencia.
uriUsa la ruta de la URL para distribuir solicitudes.
hdr(name)Usa el valor de un encabezado HTTP (ej: User-Agent).
rdp-cookieEspecífico para balancear sesiones RDP.

cookie SRVNAME insert
OpciónDescripción
insertInserta la cookie en la respuesta automáticamente.
rewriteUsa cookie recibido del cliente.
prefixAñade nombre del servidor al inicio de la cookie.
indirectNo reenvía cookie si ya está presente.
nocacheEvita 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
ModoDescripción
httpModo predeterminado. Permite inspeccionar y manipular cabeceras HTTP.
tcpModo raw. Ideal para protocolos como MySQL, PostgreSQL, SMTP, etc.
healthUsado 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 maxconn para evitar sobrecarga en HAProxy.
  • El panel en /haproxy_adm_panel requiere 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.


📘 Documentación adicional