Мы используем функцию настраиваемой страницы ошибок haproxy, чтобы показывать страницу обслуживания «отказавшего кита», пока мы выполняем развертывание на нашем сайте.
Однако, поскольку haproxy не может показывать пользователям SSL настроенную страницу ошибок, как я могу перенаправить пользователей на соединение без SSL, чтобы показать «кит сбоя», если бэкенды недоступны?
В итоге я установил stunnel на балансировщик нагрузки и перенаправил трафик обратно на порт 80 через туннель.
HTTPs-клиент => haproxy: 443 => (бэкенды отсутствуют, используйте резервный сервер 127.0.0.1:4443) => 127.0.0.1:443 (stunnel) => 127.0.0.1:80 (haproxy, со страницей failwhale)
haproxy.conf
listen SSL-via-shared-ip 1.2.3.2:443
mode tcp
option ssl-hello-chk
#option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
option httpchk HEAD /test.txt HTTP/1.0
# list of web servers
server app1 1.2.3.4:443 check port 80 maxconn 60
server app2 1.2.3.5:443 check port 80 maxconn 60
server failwhale 127.0.0.1:4443 backup maxconn 500
#error pages#
##these are in raw http, not just html ##
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
stunnel.conf
; Protocol version (all, SSLv2, SSLv3, TLSv1)
sslVersion = all
options = NO_SSLv2
; PID is created inside the chroot jail
pid = /var/run/stunnel4/stunnel4.pid
; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
; Some debugging stuff useful for troubleshooting
debug = 7
output = /var/log/stunnel4/stunnel.log
; Certificate/key is needed in server mode and optional in client mode
cert = /etc/ssl/certs/stunnel.pem
key = /etc/ssl/certs/stunnel.pem
; Some security enhancements for UNIX systems - comment them out on Win32
;chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; Service-level configuration
[failwhale]
accept = 4443
connect = 127.0.0.1:80
TIMEOUTclose = 0
Насколько я понимаю, вы не можете перенаправлять клиентов изнутри haproxy, поскольку он вообще не может взаимодействовать с SSL-соединениями (не может расшифровать запрос или зашифровать ответ с перенаправлением). Для этого соединение должно идти к какому-либо серверу с поддержкой SSL.
Единственное, что я могу придумать, - это настроить другой веб-сервер с ключом / сертификатом SSL и страницей с ошибочным китом (может даже работать на каком-то нечетном порту на самой машине haproxy, используйте localhost:4433
или что-то в этом роде), и пусть haproxy отправляет все SSL-соединения на этот сервер во время обслуживания.
HAProxy может это сделать только в том случае, если он также разрывает соединения SSL. В этой настройке сервер (ы) HAProxy будет иметь сертификаты SSL и будет связываться с пулом серверов через дополнительный SSL (новое соединение) или напрямую HTTP.
Другой вариант - иметь веб-сервер с поддержкой SSL только для обслуживания отказоустойчивого кита, который будет обслуживать одну и ту же страницу сбойного кита, независимо от того, какой URI он передан. Таким образом, вы можете оставить этот сервер в качестве «резервного», и любые попытки подключиться будут безупречны.