Я создаю сайт с высокой доступностью, используя несколько балансировщиков нагрузки 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.