Pular para o conteúdo principal

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
ModoDescrição
roundrobinPadrão. Distribui requisições de forma sequencial.
leastconnVai para o servidor com menos conexões ativas.
sourceUsa IP do cliente como base para persistência.
uriUsa o caminho da URL para distribuir requisições.
hdr(name)Usa o valor de um cabeçalho HTTP (ex: User-Agent).
rdp-cookieEspecífico para balancear sessões RDP.

cookie SRVNAME insert
OpçãoDescrição
insertInsere o cookie na resposta automaticamente.
rewriteUsa cookie recebido do cliente.
prefixAdiciona nome do servidor ao início do cookie.
indirectNão reenvia cookie se já estiver presente.
nocacheEvita 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
ModoDescrição
httpModo padrão. Permite inspecionar e manipular cabeçalhos HTTP.
tcpModo raw. Ideal para protocolos como MySQL, PostgreSQL, SMTP etc.
healthUsado 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.


📘 Documentação adicional