HAProxyで非常に奇妙な動作が見られます。以下の設定は、example.com/wikiが1つのサーバーに移動し、example.com /が別のサーバーに移動できるように設計されています。問題は、/ wikiが半分の時間しか機能せず、/ webserverも半分の時間しか機能しないように見えることです。よく調べてみると、2つのバックエンドが切り替わっているようです。 ACLルールに基づいて特定のバックエンドに移動する代わりに、それらの負荷を分散する可能性があります。
もう1つの奇妙な点は、services-staging.example.com/greenovenとstaging.example.comの両方がキンカンに移動することです。ただし、ルールでは、services-stagingホストのみがそのバックエンドに移動する必要があると具体的に規定されています。
HAProxyの設定に問題がありますか? ACLまたはバックエンドを誤って使用していますか?
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 documentation を読むと、次の段落が見つかります。
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
ヘッダーを使用してリクエストを実際に取得していることを確認する必要があります。
Host
ヘッダーをチェックする代わりに、宛先IP、名前、またはURLを使用できると思います。