我正在考虑做一些 Sidecar 代理。目前,我们已将 Squid 代理用作互联网代理,并且 HAProxy 已成功对这些代理连接进行负载平衡。
但我想要做的是分离一些内部服务以实现本地负载平衡。所有服务都是 TLS。
因此,如果连接 http 请求有特定的域名,我想使用不同的后端。但目前我还不知道该怎么做。
这很好用:
curl -v -x http://127.0.0.1:5000 https://google.com
成功转到我们的 squid 转发代理。但以下内容未使用我们的 git 服务器的替代后端:
curl -v -x http://127.0.0.1:5000 https://git.business.dom
我尝试在传入请求中匹配域名,但无法获得匹配结果。我也没有找到其他方式来匹配 HTTP CONNECT 方法请求中的 URL。
这总是最终被路由到默认的后端 squid 代理
frontend main
mode http
bind 127.0.0.1:5000
acl connect_git req.payload(0,0) -m sub git.business.dom
use_backend git if connect_git
default_backend forward_internet_proxies
backend git
mode http
option httpclose
option forwardfor header X-Client
option forwardfor
balance roundrobin
http-check expect rstatus (2..|3..)
server git1 git1.business.dom:443 weight 1 ssl verify none
server git2 git2.business.dom:443 weight 1 ssl verify none
backend forward_internet_proxies
balance roundrobin
mode http
server proxy1 192.168.1.220:3128 check
server proxy2 192.168.1.221:3128 check
答案1
愚蠢的是,HTTP CONNECT 方法只是一个普通的 HTTP 连接请求。它包含一个可以匹配以选择后端的主机标头。
HAProxy 还为 CONNECT 方法提供了预定义的 ACL,因此也可以使用。
造成混淆的原因是使用了-i git.business.dom
,但主机标头包含连接的域和端口号。因此我们需要匹配,-i git.business.dom:443
否则请使用-m sub
选项。
因此我们最终得到:
acl githost hdr(host) -i git.business.dom:443
use_backend git if githost METH_CONNECT
这将需要 git 后端服务器来处理HTTP CONNECT
请求,否则将不起作用。
如果您正在使用 nginx,那么您可以使用插件来启用对HTTP CONNECT
请求的支持。