HaProxy 在具有不同主机头的同一端口上使用 IIS

HaProxy 在具有不同主机头的同一端口上使用 IIS

HA-Proxy version 1.8.12-1ppa1~bionic 2018/06/27在 Ubuntu 上运行版本。

我正在尝试使用 IIS 将对 load.mysite.com 的请求负载平衡到两个不同的 Windows 服务器。这些服务器还运行着使用相同端口在 IIS 上运行的其他网站。我们使用主机名绑定来访问正确的网站。

这是我的 HAProxy 配置:

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option forwardfor
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        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

# Stats
listen stats
        bind *:9999
        stats enable
        stats hide-version
        stats uri /stats
        stats auth admin:***

# Http In - forward to https
frontend http-in
        bind *:80
        redirect scheme https if !{ ssl_fc }

# Https in
frontend https-in
        bind *:443 ssl crt /etc/ssl/mysite.com/mysite.com.pem
        acl host_mysitePlatform hdr(host) -i load.mysite.com
        use_backend mysitePlatform_cluster if host_mysitePlatform

backend mysitePlatform_cluster
        balance roundrobin
        http-request set-header Host node1.mysite.com if { srv_id 1 }
        http-request set-header Host node2.mysite.com if { srv_id 2 }
#       http-send-name-header Host
        server mysite1Server node1.mysite.com:443 check ssl verify none
        server mySite2Server node2.mysite.com:443 check ssl verify none

此配置不起作用。IIS 返回 404,因为它不知道应该绑定到哪个站点。

node1.mysite.com当我删除时,它适用于后端服务器if { srv_id 1 }。但是当然它只适用于一台服务器。

因此看起来条件if { srv_id ? }总是错误的。

我可以通过在两个 IIS 服务器上使用相同的主机名绑定来修复它(例如 www.mysite.com),但是我们有一些限制阻止我们这样做。

此外,我们最初希望后端采用 https,因为我们需要更改代码以禁用 https,并且我们希望在负载均衡器上线后进行这些更改。在后期,我们所有的后端都将位于端口 80 上。

我评论http-send-name-header Host说这个也不起作用。只http-request set-header Host <hostName>对我有用。

所以我的问题是,我该如何开始srv_id工作?我还尝试先创建一个 acl,例如检查 srv_id 是否 = 1,但这也总是错误的。也许如果我可以记录srv_id负载平衡到服务器时的实际值,那么我就可以将 if 语句更改为正确的值。

答案1

Srv_id 可能按应有的方式工作:当您收到响应时。

"Returns an integer containing the server's id when processing the response. While it's almost only used with ACLs, it may be used for logging or debugging."

尝试 SNI:

server mysite1Server node1.mysite.com:443 check ssl verify none sni node1.mysite.com
server mySite2Server node2.mysite.com:443 check ssl verify none sni node2.mysite.com

答案2

我可以通过将后端配置更改为以下内容来修复此问题

backend mysitePlatform_cluster
    balance roundrobin
    http-send-name-header Host
    server node1.mysite.com node1.mysite.com:443 check ssl verify none
    server node2.mysite.com node2.mysite.com:443 check ssl verify none

现在,主机名(在 HAproxy 中这是服务器名称)已传递给 IIS 服务器,并且 IIS 绑定到正确的网站。

相关内容