HAProxy, kiểm tra sức khỏe nhiều máy chủ với các tên máy chủ khác nhau


11

Tôi cần tải cân bằng giữa nhiều máy chủ đang chạy với các tên máy chủ khác nhau. Tôi không thể thiết lập cùng một máy chủ ảo trên mỗi máy chủ.

Có thể chỉ có một cấu hình nghe với nhiều máy chủ và làm cho Kiểm tra sức khỏe áp dụng http-send-name-header Hostchỉ thị? Tôi đang sử dụng HAProxy 1.5.

Tôi đã nghĩ ra haproxy.cfg này, như bạn thấy, tôi phải đặt một tên máy chủ khác nhau cho mỗi lần kiểm tra sức khỏe vì kiểm tra sức khỏe bỏ qua http-send-name-header Host. Tôi sẽ thích sử dụng các biến hoặc các phương pháp khác và giữ cho mọi thứ ngắn gọn hơn.

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

Câu trả lời:


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

Cập nhật : Trong trường hợp bạn mô tả, bạn cần kiểm tra HTTP / 1.1 yêu cầu tên máy chủ được mã hóa cứng. Với tài liệu của phiên bản 1.5, dường như không có cách nào để tránh điều này trừ khi bạn có thể bỏ các kiểm tra http (tất nhiên thường không được khuyến nghị).

Câu trả lời gốc : Mặc dù tôi không quen với 1,5 thay đổi của haproxy, nhưng những gì tôi sẽ làm trong 1.4 (và tôi khá chắc chắn rằng nó vẫn áp dụng trong 1.5) là như sau. Lưu ý rằng phân tách frontend / backend chỉ là một tiện lợi cá nhân và bạn chỉ có thể sử dụng nghe.

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

Và kết quả:

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

Tôi nghĩ rằng phương pháp của bạn sẽ không hoạt động vì nó không đặt tiêu đề Máy chủ. Nếu không có tiêu đề máy chủ, yêu cầu sẽ không bao giờ đến được máy chủ web dự định. Bạn có thể kiểm tra điều này vớiexample.heroku.com
Marco Bettiolo

Bạn đã đúng, httpchk yêu cầu tiêu đề Máy chủ trong ví dụ heroku và không có cách giải quyết nào cho nó. Việc bỏ chỉ thị kiểm tra sẽ cho phép proxy hoạt động như dự định, nhưng bạn sẽ không thể phát hiện ra trước một thất bại.
dùng76776

đó chính xác là vấn đề của tôi, đảm bảo kiểm tra sức khỏe cho các trường hợp đám mây yêu cầu tiêu đề máy chủ chính xác.
Marco Bettiolo

Tôi không thể bỏ kiểm tra HTTP / 1.1. Tôi sẽ gắn bó với việc thực hiện của tôi bây giờ.
Marco Bettiolo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.