Necesito equilibrar la carga entre varios servidores en ejecución con diferentes nombres de host. No puedo configurar el mismo host virtual en cada uno.
¿Es posible tener una sola configuración de escucha con varios servidores y hacer que los controles de estado apliquen la http-send-name-header Host
directiva? Estoy usando HAProxy 1.5.
Se me ocurrió este haproxy.cfg funcional, como puede ver, tuve que configurar un nombre de host diferente para cada verificación de estado, ya que la verificación de estado ignora el archivo http-send-name-header Host
. Hubiera preferido usar variables u otros métodos y mantener las cosas más concisas.
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
Respuesta1
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
Respuesta2
Actualizar: En el caso que describió, necesita comprobaciones HTTP/1.1 que requieren el nombre de host codificado. Dada la documentación de la versión 1.5, no parece haber una manera de evitar esto a menos que pueda permitirse el lujo de eliminar las comprobaciones http (lo cual, por supuesto, generalmente no se recomienda).
Respuesta original: Si bien no estoy familiarizado con los cambios de haproxy en la versión 1.5, lo que haría en 1.4 (y estoy bastante seguro de que todavía se aplica en 1.5) es lo siguiente. Tenga en cuenta que la separación entre frontend y backend es solo una conveniencia personal y puede usar listening.
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
Y el resultado:
$ 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>
$