Назад | Перейти на главную страницу

Проблема с SSL при использовании HAProxy и Nginx

Я создаю сайт с высокой доступностью, используя несколько балансировщиков нагрузки HAProxy, веб-серверы Nginx и серверы MySQL. Сайт должен выдерживать отключение узлов балансировщика нагрузки или веб-серверов без прерывания обслуживания посетителей. В настоящее время у меня есть два ящика, на которых запущен HAProxy, совместно использующий виртуальный IP-адрес с использованием keepalived, которые пересылаются на два веб-сервера, на которых работает Nginx, которые затем связываются с двумя ящиками MySQL с использованием репликации MySQL и совместного использования виртуального IP-адреса с использованием пульса. Все работает правильно, кроме SSL-трафика через HAProxy. Я использую версию 1.5 dev12 с скомпилированной поддержкой openssl. Когда я пытаюсь перейти к виртуальному IP-адресу для haproxy через https, я получаю сообщение: простой HTTP-запрос был отправлен на HTTPS-порт. Вот мой haproxy.cfg, который в основном собран из других постов:

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:*********

Есть идеи, почему трафик SSL не передается правильно? Кроме того, какие другие изменения вы бы порекомендовали? Мне все еще нужно настроить ведение журнала, так что не беспокойтесь об этом разделе. Заранее спасибо за вашу помощь.

С ssl вы должны использовать интерфейс / бэкэнд, а не слушать. Причина в том, что при прослушивании соединение, поступающее к haproxy на одном порту, переходит к серверу, находящемуся позади на том же порту. Таким образом, запрос SSL на 443 расшифровывается haproxy, но затем отправляется на веб-сервер через порт 443, который ожидает SSL-соединение. (И вот как вы получаете эту ошибку.) Используя интерфейс / бэкэнд, вы можете указать haproxy принимать соединения на одном порту во внешнем интерфейсе, но завершить соединение с другим портом в бэкэнде.

В качестве альтернативы вы можете перенастроить свой веб-сервер для приема HTTP-запросов (не https-запросов) на порт 443. Лично я бы этого не сделал, потому что это довольно нестандартно, тогда как вы ожидаете, что балансировщик нагрузки, выполняющий разгрузку SSL, будет принимать соединение на 443 и завершите его на порту 80.