大家下午好,
我是网络托管方面的新手,仍然感觉自己像在大海中学习游泳。我想要做的是设置 HAproxy 将请求转发到后端的远程服务器。该服务器采用 SSL 并位于 Cloudflare 后面。
我搜索了整个互联网,但直到现在我都找不到一个直接明确的答案来回答我的问题。我已经提取了 haproxy 映像,并将其与外部 haproxy.cfg 文件一起用于容器中。没有人明确说明您是否能够将远离网络(非本地)的服务器用作后端服务器,以及如何使用 SSL 进行此通信。如果你们中有任何人对此有所了解,我将非常感激,如果可以做到以及如何做到。
我目前在服务器中使用 NginxProxyManager 容器,并且正在研究 HAProxy 的负载平衡功能。到目前为止,我已经成功地在本地容器周围进行了轮询,但对于远程服务器,我总是在统计信息中得到“停机维护”的响应。我还在 ha-proxy 容器中的终端中运行了 wget 命令,它可以看到外部世界。如果我从 HAProxy 容器内部 ping Google,它会 ping 它。所有容器都连接到桥接网络和 docker 中用户创建的网络(桥接驱动程序)。这就是我完全困惑的原因。所以,主要问题是:可以做到这一点吗?如果可能的话,以下场景是否可行(?):
- 客户端向 HAProxy 发出 https 请求
- 使用 roundrobin,我(想)在本地容器和远程服务器之间轮换
- 当我进入“远程服务器”环节时,我想从后端发送正确的服务器主机(重写 - 我已经可以这样做了,但对于本地容器)以及这是一个 SSL 请求的信息。
- 然后 NginxProxyManager 或另一个 HAProxy 会将其转移到那里连接的容器,获取响应并将其发送回(第一个)HAProxy,然后将后者发送至客户端。
我甚至不确定这是否可行。看看下面的代码。它适用于本地容器,但不适用于远程服务器。它发送请求并重写 Host 标头的名称。这是 haproxy.cfg
global
maxconn 4000
daemon
defaults
mode http
default-server init-addr last,libc,none
option http-keep-alive
option redispatch
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
option forwardfor
resolvers mynameservers
nameserver ns2 8.8.8.8:853
frontend stats
bind *:8500
stats enable
stats uri /
stats refresh 10s
frontend ft
bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/ha_trial.pem
default_backend bt2
backend bt2
balance roundrobin
http-send-name-header Host
server web1 web1:8080 check
server web2 web2:8080 check
server web3 web3:8080 check
server myback.mysite.com myback.mysite.com:443 ssl verify none resolvers mynameservers
## the latter does not work - it ends at down for maintenance in statistics and in logs it says: Layer6 invalid response, info: "SSL handshake failure" while it is "verify none"
如果您能帮我解答(如果您知道的话)和/或为所有像我一样的人(特别是我)提供一些参考,我将不胜感激。
谢谢
答案1
该案例正是 SSL 握手失败案例,因为 HAProxy docker 镜像未启用 QUIC,后端位于 Cloudflare 后面,而 Cloudflare 默认支持 QUIC。如果我在 https 通信协议中使用未启用 QUIC 的其他域,则一切正常。我也很好奇它为什么会以不同的方式处理前端和后端?在前端,它理解 QUIC(?- 或者您和 cloudflare 之间是 QUIC,而 cloudflare 到服务器是不同的加密?)但无法从后端连接?
简而言之:
- HAProxy docker 镜像未启用 QUIC - 至少我得到的是 (alpine)
- Cloudflare 已默认激活 QUIC 作为其产品的通信协议,并且您不能更改它。
- 这两者的合作显然是不可能的,它会给你一个“SSL 握手失败”
- 为了修复它,请使用不支持最新技术通信协议的提供商 - 好的,现在这只是缓解措施而不是解决方案。
- HAProxy 站点提供了一种从 github 重新编译 HAProxy 并支持 QUIC 的方法,我稍后会研究它...