Linux
HAProxy 似乎是負載平衡而不是遵循 ACL 規則
我看到 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
標頭。