Problema com SSL usando HAProxy e Nginx

1

Estou criando um site altamente disponível usando vários balanceadores de carga HAProxy, servidores da web Nginx e servidores MySQL. O site precisa ser capaz de sobreviver aos nós do balanceador de carga ou dos servidores da Web que ficam off-line sem qualquer interrupção de serviço para os visitantes. Atualmente, tenho duas caixas que executam o HAProxy compartilhando um IP virtual usando keep-alive, que encaminham para dois servidores Web que executam o Nginx, que então se conectam a duas caixas MySQL usando a replicação MySQL e compartilhando um IP virtual usando heartbeat. Tudo está funcionando corretamente, exceto pelo tráfego SSL no HAProxy. Estou executando a versão 1.5 dev12 com suporte openssl compilado dentro Quando tento navegar para o IP virtual para haproxy sobre https, recebo a mensagem: A solicitação HTTP simples foi enviada para a porta HTTPS. Aqui está o meu haproxy.cfg até agora, que foi montado principalmente a partir de outros posts:

global
        log 127.0.0.1 local0
        log 127.0.0.1 local1 notice
        # log 127.0.0.1 local0
        user haproxy
        group haproxy
        daemon
        maxconn 20000

defaults
        log global
        option dontlognull
        balance leastconn
        clitimeout 60000
        srvtimeout 60000
        contimeout 5000
        retries 3
        option redispatch

listen front
        bind :80
        bind :443 ssl crt /etc/pki/tls/certs/cert.pem
        mode http
        option http-server-close
        option forwardfor
        reqadd X-Forwarded-Proto:\ https if { is_ssl }
        reqadd X-Proto:\ SSL if { is_ssl }
        server web01 192.168.25.34 check inter 1s
        server web02 192.168.25.32 check inter 1s
        stats enable
        stats uri /stats
        stats realm HAProxy\ Statistics
        stats auth admin:*********

Alguma ideia de por que o tráfego SSL não está sendo passado corretamente? Além disso, outras alterações que você recomendaria? Eu ainda preciso configurar o log, então não se preocupe com essa seção. Agradecemos antecipadamente sua ajuda.

    
por Ben Chiappetta 26.09.2012 / 22:53

1 resposta

1

Com ssl, você tem que usar frontend / backend, não ouvir. O motivo é que, com listen, uma conexão que chega ao haproxy em uma porta vai para o servidor atrás na mesma porta. Portanto, uma solicitação SSL no 443 é descriptografada pelo haproxy, mas depois enviada para o servidor da Web na porta 443, que está esperando uma conexão SSL. (E é assim que você obtém esse erro.) Com o frontend / backend, você pode dizer ao haproxy para aceitar conexões em uma porta no frontend, mas para completar a conexão com uma porta diferente no backend.

Alternativamente, você pode reconfigurar seu servidor web para aceitar solicitações http (não requisições https) na porta 443. Pessoalmente, eu não faria isso porque isso é bastante não-padrão, enquanto você esperaria um balanceador de carga fazendo offload SSL para aceitar uma conexão em 443 e concluí-la na porta 80.

    
por 30.09.2012 / 04:10