HAProxy, Integritätsprüfung mehrerer Server mit unterschiedlichen Hostnamen

11

Ich muss den Lastausgleich zwischen mehreren laufenden Servern mit unterschiedlichen Hostnamen durchführen. Ich kann nicht auf jedem den gleichen virtuellen Host einrichten.

Ist es möglich, nur eine Listen-Konfiguration mit mehreren Servern zu haben und die Integritätsprüfungen die http-send-name-header HostAnweisung anwenden zu lassen ? Ich benutze HAProxy 1.5.

Ich habe mir diese funktionierende haproxy.cfg ausgedacht, wie Sie sehen können, musste ich für jede Integritätsprüfung einen anderen Hostnamen festlegen, da die Integritätsprüfung die ignoriert http-send-name-header Host. Ich hätte es vorgezogen, Variablen oder andere Methoden zu verwenden und die Dinge präziser zu halten.

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
Marco Bettiolo
quelle

Antworten:

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
Mohit Singh
quelle
1

Update : In dem von Ihnen beschriebenen Fall benötigen Sie HTTP / 1.1-Prüfungen, bei denen der Hostname fest codiert sein muss. Angesichts der Dokumentation von Version 1.5 scheint es keine Möglichkeit zu geben, dies zu vermeiden, es sei denn, Sie können es sich leisten, die http-Prüfungen fallen zu lassen (was natürlich im Allgemeinen nicht empfohlen wird).

Ursprüngliche Antwort : Obwohl ich mit den 1.5-Änderungen von Haproxy nicht vertraut bin, würde ich in 1.4 (und ich bin mir ziemlich sicher, dass es in 1.5 immer noch gilt) Folgendes tun. Beachten Sie, dass die Trennung von Frontend und Backend nur eine persönliche Annehmlichkeit ist und Sie einfach Listen verwenden können.

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

Und das Ergebnis:

$ 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>
$
user76776
quelle
Ich denke, dass Ihre Methode nicht funktionieren würde, da sie den Host-Header nicht setzt. Ohne einen Host-Header erreicht die Anforderung niemals den beabsichtigten Webserver. Sie können dies mitexample.heroku.com
Marco Bettiolo
Sie haben Recht, für httpchk ist der Host-Header im Heroku-Beispiel erforderlich, und es gibt keine Problemumgehung dafür. Wenn Sie die Prüfanweisung löschen, funktioniert der Proxy wie vorgesehen, Sie können jedoch einen Fehler nicht im Voraus erkennen.
user76776
Das ist genau mein Problem, die Integritätsprüfung für Cloud-Instanzen sicherzustellen, für die die richtigen Host-Header erforderlich sind.
Marco Bettiolo
Ich kann keine HTTP / 1.1-Prüfungen ablegen. Ich werde vorerst bei meiner Implementierung bleiben.
Marco Bettiolo