HAProxy 作为选择性正向代理和负载均衡器

HAProxy 作为选择性正向代理和负载均衡器

我正在考虑做一些 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请求的支持。

相关内容