我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 绑定到正确的网站。