Você pode usar o haproxy para balancear a carga de conexões SSL com vários servidores de back-end, para que os servidores back-end encerrem o SSL em vez do haproxy. O único truque é habilitar o Proxy Protocol no haproxy e nos servidores de back-end, para que o endereço IP real do usuário seja preservado.
Por exemplo, se você tiver dois servidores de aplicativos nginx 10.0.0.11
e 10.0.0.12
e um balanceador de carga haproxy 10.0.0.10
.
Edite /etc/haproxy/haproxy.cfg
adicionando estas linhas:
frontend https-in
bind *:443
default_backend https-servers
backend https-servers
mode tcp
balance roundrobin
server srv1 10.0.0.11:443 send-proxy
server srv2 10.0.0.12:443 send-proxy
Com uma configuração do servidor nginx como:
server {
server_name example.com;
root /opt/example/current/app;
listen 443 ssl http2 proxy_protocol;
set_real_ip_from 10.0.0.10/32;
real_ip_header proxy_protocol;
ssl_certificate /etc/ssl/example/ssl.crt;
ssl_certificate_key /etc/ssl/example/ssl.key;
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/app.sock;
}
}
Isso diz ao haproxy para configurar um proxy da Camada 4 para encaminhar todas as conexões TCP não modificadas para os dois servidores nginx usando roundrobin para balancear as conexões.
Os servidores de aplicativos nginx compartilharão a carga de negociação do SSL e analisarão as solicitações HTTP. O Proxy Protocol encaminha o endereço IP do cliente de origem de haproxy para nginx sem ter que modificar o HTTP solicitar cabeçalhos.
Observe como informamos ao nginx para confiar no endereço IP do seu balanceador de carga haproxy 10.0.0.10
para nos fornecer o IP real do cliente.
O SSL é distribuído entre seus dois servidores de aplicativos nginx e seus arquivos de log nginx mostram o endereço IP do cliente correto para cada solicitação.
Eu escrevi uma postagem no blog descrevendo isso:
link