Configurando HAProxy como Proxy Reverso (HTTP/HTTPS)
🌐 Visão Geral
Este guia mostra como configurar o HAProxy como proxy reverso HTTP/HTTPS, com suporte a Let's Encrypt, balanceamento de carga e sticky sessions. A configuração abaixo é baseada na instalação padrão da SaveinCloud.
🧱 Estrutura da Configuração
🔹 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
Explicação:
log
: define o destino dos logs.ssl-default-*
: define as políticas de segurança padrão para conexões SSL.dhparam.pem
: define o parâmetro Diffie-Hellman para SSL seguro (2048 bits).maxconn
: número máximo de conexões simultâneas.daemon
: executa o HAProxy como serviço em background.
🔸 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
Explicação:
mode http
: define o modo HTTP como padrão.option httplog
: ativa logs em formato HTTP detalhado.timeout *
: define limites para evitar conexões presas.redispatch
: tenta outro backend se o atual falhar.
📡 Frontend: Recebendo as conexões
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
Explicação:
bind :::80
/:::443
: escuta em todas interfaces IPv4/IPv6 nas portas 80 (HTTP) e 443 (HTTPS).ssl crt ...
: usa certificado gerado automaticamente pelo Let's Encrypt.alpn
: habilita suporte a HTTP/2.acl hdr(host)
: cria regras com base no domínio acessado.use_backend
: direciona o tráfego com base na ACL correspondente.default_backend
: usado se nenhuma ACL for satisfeita.stats *
: ativa painel de administração via/haproxy_adm_panel
.set-header
: adiciona cabeçalhos úteis para backend (como HTTPS real via proxy).
🧩 Backend padrão (exemplo com balanceamento)
backend bk_http
mode http
cookie SRVNAME insert
balance roundrobin
server webserver1 10.100.75.251:${BACKEND_PORT} check cookie S1
Explicação:
-
mode http
: modo HTTP explícito. -
cookie SRVNAME insert
: ativa sticky sessions via cookie (cliente é mantido no mesmo backend). -
balance roundrobin
: distribui requisições entre os servidores de forma equilibrada. -
server
: define o servidor backend.check
: ativa health check.cookie S1
: valor que será inserido no cookie para sticky session.
🧩 Backend por Domínio (Exemplo com 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
Explicação:
- Permite separar o tráfego de diferentes domínios para destinos distintos.
- Pode ser expandido com
mode http
, balanceamento e cookies conforme necessidade.
🔄 balance: Estratégias de Balanceamento de Carga
Define como as requisições são distribuídas entre os servidores backend.
balance roundrobin
Modo | Descrição |
---|---|
roundrobin | Padrão. Distribui requisições de forma sequencial. |
leastconn | Vai para o servidor com menos conexões ativas. |
source | Usa IP do cliente como base para persistência. |
uri | Usa o caminho da URL para distribuir requisições. |
hdr(name) | Usa o valor de um cabeçalho HTTP (ex: User-Agent ). |
rdp-cookie | Específico para balancear sessões RDP. |
🍪 cookie: Sticky Sessions com Cookies
cookie SRVNAME insert
Opção | Descrição |
---|---|
insert | Insere o cookie na resposta automaticamente. |
rewrite | Usa cookie recebido do cliente. |
prefix | Adiciona nome do servidor ao início do cookie. |
indirect | Não reenvia cookie se já estiver presente. |
nocache | Evita cache de proxies intermediários para o cookie. |
Cada servidor deve ter um identificador de cookie:
server app1 10.0.0.1:80 cookie A1 check
🌍 mode: Tipos de Comunicação
Define o tipo de protocolo inspecionado no frontend/backend.
mode http
Modo | Descrição |
---|---|
http | Modo padrão. Permite inspecionar e manipular cabeçalhos HTTP. |
tcp | Modo raw. Ideal para protocolos como MySQL, PostgreSQL, SMTP etc. |
health | Usado apenas para health checks. |
🛑 Backend Default (fallback)
backend default
mode http
errorfile 503 /etc/haproxy/welcome.http
Explicação:
- Usado como fallback quando não há backends válidos.
- Serve um arquivo estático de erro 503 com mensagem personalizada.
🎯 Dicas e Boas Práticas
- Use
maxconn
para evitar sobrecarga no HAProxy. - O painel em
/haproxy_adm_panel
exige autenticação básica — altere a senha padrão! - O certificado Let's Encrypt é atualizado automaticamente pela plataforma.
- Para redirecionar HTTP para HTTPS, você pode usar:
redirect scheme https if !{ ssl_fc }
Coloque isso no início do frontend ft_http
se quiser forçar HTTPS.