web-dev-qa-db-ja.com

HAProxyは、ACLルールに従う代わりに負荷分散しているようです

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        
2
djsumdog

接続を再利用していたようですが、コンテキストの切り替えを行っているときには実行しないでください。私は以下を追加しました:

option httpclose

この投稿によると: HAProxyコンテンツ切り替え設定でエラーが発生するのはなぜですか?

すべてのURLとドメインが正しく機能するようになりました。

3
djsumdog

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を使用できると思います。

1
Khaled