Linux

HAProxy 似乎是負載平衡而不是遵循 ACL 規則

  • September 12, 2011

我看到 HAProxy 的一些非常奇怪的行為。我有以下設置,旨在允許 example.com/wiki 轉到一台伺服器,而 example.com/ 轉到另一台伺服器。問題是 /wiki 似乎只工作了一半,而 / 網路伺服器也只工作了一半。經過仔細檢查,它似乎在兩個後端之間切換;可能對它們進行負載平衡,而不是根據 ACL 規則轉到特定的後端!

另一個奇怪的是,services-staging.example.com/greenoven 和 staging.example.com 都將進入 kumquat,儘管規則明確規定只有 services-staging 主機應該進入該後端。

我的 HAProxy 配置有問題嗎?我是否錯誤地使用了 acls 或後端?

global
       log 127.0.0.1   local1 debug
       maxconn 200000
       chroot /var/lib/haproxy
       user haproxy
       group haproxy
       daemon
       #debug
       #quiet

defaults
       log     global
       mode    http
       option  httplog
       option  dontlognull
       retries 3
       option redispatch
       maxconn 200000
       contimeout      5000
       clitimeout      50000
       srvtimeout      50000

       stats uri /monitor
       stats auth admin:GS01
       stats refresh 5s
       stats enable


frontend http-in
       bind *:80

       option forwardfor

       #Staging Hosts

       acl host_staging hdr(host) -i staging.example.com
       acl host_staging_services hdr(host) -i staging-services.example.com

       #Production Hosts

       acl host_prod hdr(host) -i example.com www.example.com
       acl host_prod_services hdr(host) -i services.urbanatla.com

       #URL Paths

       acl url_wiki url_beg /wiki
       acl url_go   url_beg /greenoven
       acl url_arcgis url_beg /ArcGIS

       #Staging Backends

       use_backend pluto if host_staging_services url_arcgis
       use_backend kumquat if host_staging_services url_go
       use_backend kumquat if host_staging url_wiki
       use_backend cumberland if host_staging

       #Production Backends

       use_backend saturn if host_prod_services url_arcgis
       use_backend willow if host_prod_services url_go
       use_backend willow if host_prod url_wiki
       use_backend ganges if host_prod


backend kumquat
       server kumquat kumquat.example.com:8080 maxconn 5000

backend cumberland
       server cumberland cumberland.example.com:80 maxconn 5000

backend ganges
       server ganges ganges.example.com:80 maxconn 5000

backend articdata
       server articdata  articdata.example.com:80 maxconn  5000

backend saturn
       server saturn saturn.example.com:80 maxconn 5000

backend willow
       server willow willow.example.com:8080 maxconn 5000

backend pluto
       server pluto pluto.example.com:80 maxconn 5000        

看起來它正在重用連接,在進行上下文切換時不應該這樣做。我添加了以下內容:

option httpclose

根據這篇文章:為什麼我的 HAProxy 內容切換配置中出現錯誤?.

所有 URL 和域現在都可以正常工作。

如果您閱讀 haproxy文件,您可以找到以下段落:

hdr(name)   The HTTP header <name> will be looked up in each HTTP request.
           Just as with the equivalent ACL 'hdr()' function, the header
           name in parenthesis is not case sensitive. If the header is
           absent or if it does not contain any value, the roundrobin
           algorithm is applied instead.

這可以解釋為什麼 haproxy 在不遵循 ACL 的伺服器之間進行負載平衡。為了確保,您需要檢查您是否真的收到帶有host標頭的請求。

我認為您可以使用目標 IP、名稱或 URL 而不是檢查host標頭。

引用自:https://serverfault.com/questions/310338