HAProxy, memeriksa kesehatan beberapa server dengan nama host yang berbeda


11

Saya perlu memuat keseimbangan antara beberapa server yang berjalan dengan nama host yang berbeda. Saya tidak dapat mengatur host virtual yang sama pada masing-masing server.

Apakah mungkin hanya memiliki satu konfigurasi mendengarkan dengan beberapa server dan membuat Pemeriksaan Kesehatan menerapkan http-send-name-header Hostarahan? Saya menggunakan HAProxy 1.5.

Saya datang dengan haproxy.cfg yang berfungsi ini, seperti yang Anda lihat, saya harus menetapkan nama host yang berbeda untuk setiap pemeriksaan kesehatan karena pemeriksaan kesehatan mengabaikan http-send-name-header Host. Saya lebih suka menggunakan variabel atau metode lain dan membuat semuanya lebih ringkas.

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

Jawaban:


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

1

Pembaruan : Dalam kasus yang Anda jelaskan, Anda memerlukan pemeriksaan HTTP / 1.1 yang mengharuskan nama host di-hardcode. Mengingat dokumentasi versi 1.5, sepertinya tidak ada cara untuk menghindari hal ini kecuali Anda mampu menjatuhkan cek http (yang tentu saja umumnya tidak disarankan).

Jawaban asli : Meskipun saya tidak terbiasa dengan 1,5 perubahan haproxy, apa yang akan saya lakukan di 1.4 (dan saya cukup yakin itu masih berlaku di 1.5) adalah sebagai berikut. Perhatikan bahwa pemisahan frontend / backend hanya kenyamanan pribadi dan Anda bisa menggunakan mendengarkan.

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

Dan hasilnya:

$ 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>
$

Saya pikir metode Anda tidak akan berfungsi karena tidak mengatur header Host. Tanpa header host permintaan tidak akan pernah mencapai server web yang dimaksud. Anda dapat menguji ini denganexample.heroku.com
Marco Bettiolo

Anda benar, httpchk memerlukan header Host dalam contoh heroku, dan tidak ada solusi untuk itu. Menjatuhkan arahan cek akan membiarkan proksi berfungsi sebagaimana dimaksud, tetapi Anda tidak akan dapat mendeteksi terlebih dahulu kegagalan.
user76776

itulah masalah saya, memastikan pemeriksaan kesehatan terhadap instance cloud yang memerlukan header host yang benar.
Marco Bettiolo

Saya tidak bisa membatalkan cek HTTP / 1.1. Saya akan tetap dengan implementasi saya untuk saat ini.
Marco Bettiolo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.