web-dev-qa-db-ja.com

HAProxy reqrepがバックエンドリクエストのURIを削除する

hAProxy reqrepに関する簡単な質問。バックエンドに送信されるリクエストを書き換え/置換しようとしています。

次のドメインとURIの例は、どちらも同じドメイン名を共有していますが、バックエンドWebサーバープールが異なります。

http://domain/web1
http://domain/web2

Web1をバックエンドwebfarm1に移動させ、web2をwebfarm2に移動させたい。現在、これは起こります。ただし、リクエストがバックエンドに送信されるときにweb1またはweb2 URIを削除したいと思います。

これが私のhaproxy.cfgです

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

http://domain/web1またはhttp://domain/web2エラーログに、各バックエンドのサーバーでのリクエストがリソース/ web1または/ web2に対するリクエストであることが示されています。したがって、ドキュメントからコピーして貼り付けたにもかかわらず、正規表現に問題があると思います。 http://code.google.com/p/haproxy-docs/wiki/reqrep

概要:URIに基づいてトラフィックをルーティングしようとしていますが、HAProxyがリクエストをバックエンドプールに送信するときにURIを取り除いてほしいです。

ありがとうございました!

-ジム

29
Jim

あなたはこれを持っています:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

あなたはこれが欲しいと思います:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

違いは、webNの後の/を省略した場合、2番目の方法が機能することです。

以下のあなたのコメントに答えて、上記の表現がどのように機能するかについて詳しく説明することは、私が与えることができる以上の努力です。しかし、多分これは役立つでしょう。

/ web1の前のすべてが、リクエスト文字列でweb1の前にあるすべてを「キャプチャ」しています。したがって、通常はGETまたはPOSTになります。 (。*)は、web1の後のすべてを「キャプチャ」します。

次の部分(\1\2)は、キャプチャされたこれらの部分をどうするかを示しています。これは、\1(最初にキャプチャされた部分)と\2(次に2番目にキャプチャされた部分)で構成される文字列を形成することを示しています。 web1はキャプチャされないため、最終出力に組み込まれません。

29
longneck

これをフロントエンドに置きます

reqirep  ^([^\ :]*)\ /(.*) \1\ /web1/\2

文字列を取り除くことを学ぶ良いレッスン: https://Gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5

0
Edwin Yulianto