我们正在使用 haproxy 的自定义错误页面功能在对我们的站点进行部署时显示“失败鲸鱼”维护页面。
但是,由于 haproxy 无法显示 SSL 用户自定义错误页面,如果没有可用的后端,我该如何将用户重定向到非 SSL 连接,以显示“失败鲸鱼”?
答案1
据我了解,您无法从 haproxy 内部重定向客户端,因为它根本无法与 SSL 连接交互(无法解密请求或使用重定向加密响应)。连接必须转到具有 SSL 支持的某个服务器才能执行此操作。
我唯一能想到的就是用 SSL 密钥/证书和失败鲸鱼页面设置另一个 Web 服务器(甚至可以在 haproxy 机器本身的一些奇怪端口上运行,使用localhost:4433
或类似的东西),并让 haproxy 在维护期间将所有 SSL 连接发送到该服务器。
答案2
我最终在负载均衡器上安装了 stunnel,并通过隧道将流量重定向回端口 80。
HTTPs 客户端 => haproxy:443 => (没有可用的后端,使用“备份”服务器 127.0.0.1:4443)=> 127.0.0.1:443(stunnel)=> 127.0.0.1:80(haproxy,带有 failwhale 页面)
haproxy配置文件
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
隧道配置文件
; 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
答案3
HAProxy 能够做到这一点的唯一方法是终止 SSL 连接。在此设置中,HAProxy 服务器将拥有 SSL 证书,并且它将通过进一步的 SSL(新连接)或直接 HTTP 与服务器池进行通信。
另一个选择是拥有一个启用 SSL 的 Web 服务器,仅用于故障鲸鱼服务,无论传递的 URI 是什么,它都会提供相同的故障鲸鱼页面。这样,您可以将该服务器保留为“备份”服务器,并且任何连接尝试都将获得鲸鱼的好处。