HAProxy,健康检查具有不同主机名的多个服务器

我需要在具有不同主机名的多个运行服务器之间进行负载平衡。 我无法在每个虚拟主机上设置相同的虚拟主机。

是否有可能只有一个侦听configuration多个服务器,并使运行状况检查应用http-send-name-header Host指令? 我正在使用HAProxy 1.5。

我想出了这个工作haproxy.cfg,你可以看到,我不得不为每个运行状况检查设置一个不同的主机名,因为运行状况检查忽略了http-send-name-header Host 。 我会更喜欢使用variables或其他方法,并保持事情更简洁。

 global log 127.0.0.1 local0 notice maxconn 2000 user haproxy group haproxy defaults log global mode http option httplog option dontlognull retries 3 option redispatch timeout connect 5000 timeout client 10000 timeout server 10000 stats enable stats uri /haproxy?stats stats refresh 5s balance roundrobin option httpclose listen inbound :80 option httpchk HEAD / HTTP/1.1\r\n server instance1 127.0.0.101 check inter 3000 fall 1 rise 1 server instance2 127.0.0.102 check inter 3000 fall 1 rise 1 listen instance1 127.0.0.101:80 option forwardfor http-send-name-header Host option httpchk HEAD / HTTP/1.1\r\nHost:\ www.example.com server www.example.com www.example.com:80 check inter 5000 fall 3 rise 2 listen instance2 127.0.0.102:80 option forwardfor http-send-name-header Host option httpchk HEAD / HTTP/1.1\r\nHost:\ www.bing.com server www.bing.com www.bing.com:80 check inter 5000 fall 3 rise 2 

 defaults log global retries 2 timeout connect 3000 timeout server 5000 timeout client 5000 listen any-name-1 bind IP-Address:port mode tcp or http option user-check user haproxy_check balance roundrobin server hostname IpAddress:port check server hostname IpAddress:port check listen any-name-2 bind IP-Address:port mode tcp or http option user-check user haproxy_check balance roundrobin server hostname IpAddress:port check server hostanme IpAddress:port check listen any-name-3 bind IP-Address:port mode tcp or http option user-check user haproxy_check balance roundrobin server hostname IpAddress:port check server hostname IpAddress:port check listen any-name-4 bind IP-Address:port mode tcp or http option user-check user haproxy_check balance roundrobin server hostname IpAddress:port check server hostname IpAddress:port check listen any-name-5 bind IP-Address:port mode tcp or http option user-check user haproxy_check balance roundrobin server hostname IpAddress:port check server hostname IpAddress:port check listen haproxyadmin bind HAproxyServerIP:HaproxyPort mode http stats enable stats uri /haproxy stats realm Strictly\ Private stats auth username:password 

更新 :在你描述的情况下,你需要HTTP / 1.1检查,它需要硬编码的主机名。 鉴于版本1.5的文档,似乎没有办法避免这种情况,除非你有能力放弃http检查(当然这通常不被推荐)。

原来的回答 :虽然我不熟悉haproxy的1.5版本的变化,但我会在1.4版本中做什么(我相当肯定它仍然适用于1.5版本)如下。 请注意,前端/后端分离只是个人的便利,您可以使用listen。

 defaults mode http option httplog timeout connect 5000 timeout client 10000 timeout server 10000 frontend inbound bind 127.0.0.1:8000 default_backend webservers backend webservers option forwardfor option httpchk HEAD / HTTP/1.0 http-send-name-header Host server google www.google.com:80 check inter 5000 fall 3 rise 2 server bing www.bing.com:80 check inter 5000 fall 3 rise 2 

结果是:

 $ curl -i localhost:8000 HTTP/1.1 301 Moved Permanently Cache-Control: no-cache Content-Length: 0 Location: http://www.bing.com/ Server: Microsoft-IIS/8.0 P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND" Set-Cookie: _HOP=I=1&TS=1399981378; path=/ Edge-control: no-store X-MSEdge-Ref: Ref A: 26CEE14531BF45EFAC91FAC3D1945EDF Ref B: 42CE8D142D427C30F7851B56F38837A6 Ref C: Tue May 13 04:42:58 2014 PST Date: Tue, 13 May 2014 11:42:57 GMT $ curl -i localhost:8000 HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=UTF-8 X-Content-Type-Options: nosniff Date: Tue, 13 May 2014 11:43:00 GMT Expires: Thu, 12 Jun 2014 11:43:00 GMT Cache-Control: public, max-age=2592000 Server: sffe Content-Length: 219 X-XSS-Protection: 1; mode=block Alternate-Protocol: 80:quic <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>301 Moved</TITLE></HEAD><BODY> <H1>301 Moved</H1> The document has moved <A HREF="http://www.google.com/">here</A>. </BODY></HTML> $