HAProxy - 同じ URL だがポートが異なるサービスを区別するために、ACL に URL パラメータを追加する必要があります

HAProxy - 同じ URL だがポートが異なるサービスを区別するために、ACL に URL パラメータを追加する必要があります

異なるポートで実行される複数のサービスがあり、それぞれが同じ URI パスを使用します。例:

New York Housing Service
127.0.0.1:8080/homes
127.0.0.1:8080/prices

Las Vegas Housing Service
127.0.0.1:8081/homes
127.0.0.1:8081/prices

ここまでは問題ありませんでしたが、サービスの負荷分散を行うために haproxy を設定する必要があります。そのため、当然、コンテンツ切り替えのためにそれらを区別できる必要があります。私が行うことは、ACL のパスにパラメータを追加して 2 つのバックエンドを区別することです。この場合、ACL に url パラメータを追加し、その後にアプリケーションの実際のパス パラメータを追加します。


frontend http
  maxconn 2000
  bind 0.0.0.0:5000  

  acl new-york path_reg -i /newyork.*
  use_backend nyc-server if new-york

  acl las-vegas path_reg -i /lasvegas.*
  use_backend lv-server if las-vegas

backend nyc-server
  server www.test.com 127.0.0.1:8080 maxconn 100

backend lv-server
  server www.test.com 127.0.0.1:8081 maxconn 100

この設定では、127.0.0.1:5000/newyork/home にアクセスすると 127.0.0.1 に移動します。8080/home ですが、127.0.0.1:5000/lasvegas/home は 127.0.0.1 に移動します。8081/home です。これまでのところ、単に 404 エラーが返されました。ドキュメントを確認しましたが、私のユースケースに完全に一致するものは見つかりませんでした。そのため、ご助力いただければ幸いです。

編集: haproxy 1.5.18 を使用していることを忘れていました

答え1

HAPROXY 構成で URL のパスが現在そのまま転送されているため、バックエンド サービスは HTTP 404 エラーで応答しています。たとえば、 の HTTP 要求はとしてバックエンドhttp://127.0.0.1:5000/newyork/home/wtc.pngに転送されています。nyc-serverhttp://127.0.0.1:8000/newyork/home/wtc.png

$ wget -4O /dev/null http://localhost:5000/newyork/homes/wtc.png
--2020-02-01 13:00:09--  http://localhost:5000/newyork/homes/wtc.png
Resolving localhost (localhost)... 127.0.0.1, 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 404 File not found
2020-02-01 13:00:09 ERROR 404: File not found.
$ python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [01/Feb/2020 13:00:09] code 404, message File not found
127.0.0.1 - - [01/Feb/2020 13:00:09] "GET /newyork/homes/wtc.png HTTP/1.1" 404 -

HAproxy は、バックエンドからリソースを取得する際に最初のパス コンポーネントを削除して URL のパスを変換するように設定する必要があります。フロントエンドの定義にディレクティブを追加することをお勧めします。これは、HTTP リクエスト ヘッダーの最初の行を操作して、次のようなものを にreqrep 変換するためのものです。GET /newyork/homes/wtc.png HTTP/1.1GET /homes/wtc.png HTTP/1.1

frontend http
  reqrep ^([A-Z]+)\ /+[^/]+(/+.*)?$  \1\ \2

reqrepただし、HAproxy はディレクティブをuse-backend1 つ前に評価するため、バックエンドの評価が壊れ、機能しません。

$ wget -4O /dev/null http://localhost:5000/newyork/homes/wtc.png
--2020-02-01 13:54:55--  http://localhost:5000/newyork/homes/wtc.png
Resolving localhost (localhost)... 127.0.0.1, 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 503 Service Unavailable
2020-02-01 13:54:55 ERROR 503: Service Unavailable.

2 番目の実用的なアプローチは、バックエンド定義で URL パスを書き換えることです。ただし、サービス内のバックエンドの数によっては、reqrepディレクティブを記述して各バックエンドが URL 書き換えを実行するように構成すると、エラーが発生しやすくなります。

backend nyc-server
  server www.test.com 127.0.0.1:8080 maxconn 100
  reqrep ^([A-Z]+)\ /+[^/]+(/+.*)?$  \1\ \2

backend lv-server
  server www.test.com 127.0.0.1:8081 maxconn 100
  reqrep ^([A-Z]+)\ /+[^/]+(/+.*)?$  \1\ \2
$ wget -4O /dev/null http://localhost:5000/newyork/homes/wtc.png
--2020-02-01 14:02:29--  http://localhost:5000/newyork/homes/wtc.png
Resolving localhost (localhost)... 127.0.0.1, 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 456892 (446K) [image/png]
Saving to: ‘/dev/null’

/dev/null        100%[===============>] 446.18K  --.-KB/s    in 0s      

2020-02-01 14:02:29 (1.83 GB/s) - ‘/dev/null’ saved [456892/456892]

$ python -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
127.0.0.1 - - [01/Feb/2020 14:02:29] "GET /homes/wtc.png HTTP/1.1" 200 -

関連情報