Uriパスで識別されるいくつかのバックエンドでリクエストの負荷を分散するようにHaproxyをセットアップしようとしています。例えば:
「catalog-v1」バックエンドにつながるはずです。
各アプリは異なるパスで応答するため、アプリを識別するだけでなく、URLパスを書き換える必要があります。例えば。
に
書き換えの目的でHaproxyを使用するべきではないことは知っていますが、今のところこれは避けられません。
Regex101で機能する次の正規表現を試しました。
([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*)
置換:
\1/\3-\2/\4
そして最後にhaproxy.configがあります:
global
daemon
user root
group root
maxconn 256000
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
stats socket /run/haproxy/stats.sock mode 777 level admin
defaults
log global
option dontlognull
maxconn 4000
retries 3
timeout connect 5s
timeout client 1m
timeout server 1m
option redispatch
balance roundrobin
listen stats :8088
mode http
stats enable
stats uri /haproxy
stats refresh 5s
backend catalog-v1
mode http
option httpchk GET /catalog-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4
server 127.0.0.1:8280_catalog-v1-node01 127.0.0.1:8280 check inter 2s rise 3 fall 2
backend checkout-v1
mode http
option httpchk GET /checkout-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4
server 127.0.0.1:8180_checkout-v1-node01 127.0.0.1:8180 check inter 2s rise 3 fall 2
frontend shared-frontend
mode http
bind localhost:80
acl is-catalog-v1-path path_dir /v1/catalog
acl is-checkout-v1-path path_dir /v1/checkout
use_backend catalog-v1 if is-catalog-v1-path
use_backend checkout-v1 if is-checkout-v1-path
何か不足していますか?
私はこれにかなりの時間苦労しましたが、成功しませんでした。バックエンドのHaproxyの統計ページに「UP」と表示されますが、「non rewrited url」を呼び出すたびに400 Bad Requestエラーが表示されます。
よろしくお願いします!
正しく理解できたら、以下の例を置き換えます。
reqrep ^([^\ ]\*)\ /([-.0-9A-Za-z]\*)/([a-zA-Z]\*)/(.\*) \1\ /\3-\2/\4
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#reqrep
reqrep search string [{if | unless} cond]
スペースがありません。
上記の答えは、問題の根本原因を説明していない単一の修正です。問題は、実際にHTTPヘッダーを解析/書き換えしているときに、完全なURLまたはPATHコンポーネントのみを解析していると想定している人が多いことです。
例えば:
_curl -iv https://stackoverflow.com/questions/24784517/haproxy-route-and-rewrite-based-on-uri-path
* Trying 151.101.65.69...
> GET /questions/24784517/haproxy-route-and-rewrite-based-on-uri-path HTTP/1.1
> Host: stackoverflow.com
> User-Agent: curl/7.54.0
> Accept: */*
_
目標は、_GET /some_path HTTP/1.1
_を_GET /some_other_path HTTP/1.1
_に書き換えることです。
上記のソリューションは、一致と置換のHTTP動詞を考慮に入れるため、機能することを明確にしたいと思います。 ^([^\ ]\*)\ (.*)
を使用して、動詞をキャプチャし、置換パターンで使用します。 _\1 \2
_