Мне нужно сбалансировать нагрузку между несколькими запущенными серверами с разными именами хостов. Я не могу настроить один и тот же виртуальный хост на каждом из них.
Возможно ли иметь только одну конфигурацию прослушивания с несколькими серверами и заставить проверки работоспособности применять http-send-name-header Host
директива? Я использую HAProxy 1.5.
Я придумал этот рабочий haproxy.cfg, как видите, мне пришлось установить другое имя хоста для каждой проверки работоспособности, так как проверка работоспособности игнорирует http-send-name-header Host
. Я бы предпочел использовать переменные или другие методы и сделать вещи более краткими.
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>
$