我正在使用 HAProxy 将流量重定向到本地网络中的不同 Web 服务器。
如果未启用 SSL,我可以像这样根据主机名进行路由(在前端部分):
acl is_local hdr_end(host) -i mirror.skbx.co
acl is_kiev hdr_end(host) -i kiev.skbx.co
use_backend kiev if is_kiev
default_backend wwwlocalbackend
一旦我启用 SSL,一切都将通过 SSL 模式在 TCP 模式下运行。
但我还需要确保 HTTP 重定向到 HTTPS。当我使用:
redirect scheme https if !{ ssl_fc }
在我的 HAProxy 配置的 HTTP 前端部分,我将所有请求重定向到默认后端,因此如果请求从 重定向,则会忽略上述 acl 规则redirect scheme
。
这个问题有答案关于如何通过 SSL 终止使其工作,其中 SSL 在 HAProxy 级别被剥离。
我的问题是 - 在保留直通(模式 tcp)的同时是否可以将 HTTP 重定向到 HTTPS?
我拥有的前端和后端部分的完整配置位于这个要点。
答案1
在 TCP 模式下,HAproxy 实际上甚至不会终止 SSL,它只是将数据包传递到后端。由于https-frontend
无法解码以下几行中的标头,它只是将所有内容传递给default_backend
。
您必须在线上指定一个证书bind
并在其中运行前端和后端mode http
。
例如:
frontend http-frontend
bind 10.1.0.4:80
redirect scheme https if !{ ssl_fc }
frontend https-frontend
bind 10.1.0.4:443 ssl crt /etc/ssl/haproxy.pem
option httplog
mode http
acl is_local hdr_end(host) -i mirror.skbx.co
acl is_kiev hdr_end(host) -i kiev.skbx.co
use_backend kiev if is_kiev
default_backend wwwlocalbackend
backend wwwlocalbackend
mode http
server 1-www 127.0.0.1:443
backend kiev
mode http
server 1-www 10.8.0.6:443
其中/etc/ssl/haproxy.pem
包含您想要托管的所有域的证书,或涵盖这些域的通配符证书。
如果每个域都有单独的证书,则需要按照frontend ft_test
您发布的问题中接受的答案进行配置(在 Haproxy 中配置多个 SSL 证书)。