web-dev-qa-db-ja.com

Haproxy "use_backend"一致順序

HAProxyに問題があります。これは、以下のhaproxy.cfgのスニペットです。

acl url_a path_beg   /a
acl dom_eye hdr_dom(Host) -i www.mydomin.com
use_backend eye1 if dom_eye
use_backend eye2 if dom_eye url_a
  1. www.mydomin.com/aにアクセスすると、eye2が使用されます
  2. www.mydomin.com/a/bにアクセスすると、eye1が使用されます

しかし、私はすべてのURLが/ aで始まると予想します。eye2を使用してください。

そして、以下のようにse_backendの順序を切り替えると、

acl url_a path_beg   /a
acl dom_eye hdr_dom(Host) -i www.mydomin.com
use_backend eye2 if dom_eye url_a
use_backend eye1 if dom_eye

それは私のために働いた。

しかし、Haproxyの「一致順序ルール」が理解できず、googleからの説明が見つかりません。

これに関するアイデアはありますか?

7
glancesx

なぜ機能しないのかはわかりませんが、HAProxyのドキュメントには次のように記載されています。

「use_backend」ルールは必要な数だけ存在できます。これらのルールはすべて宣言順に評価され、一致した最初のルールがバックエンドを割り当てます。

From: http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#4-use_backend

コードを見る:

acl url_a path_beg /a
acl dom_eye hdr_dom(Host) -i www.mydomin.com
use_backend eye1 if dom_eye
use_backend eye2 if dom_eye url_a

次の結果を期待します。

www.mydomin.com -> eye1
www.mydomin.com/a -> eye1
www.mydomin.com/a/b -> eye1

それらすべてが最初のuse_backendに一致するためです。

設定を次のように変更した場合:

acl url_a path_beg /a
acl dom_eye hdr_dom(Host) -i www.mydomin.com
use_backend eye2 if dom_eye url_a
use_backend eye1 if dom_eye

私はこれらの結果を期待します:

www.mydomin.com -> eye1
www.mydomin.com/a -> eye2
www.mydomin.com/a/b -> eye2

URL 2と3だけが最初のuse_backendに一致するためです。

これはあなたの設定で何が起こっているのではないことを確認できますか?

11