
異なるポートで実行される複数のサービスがあり、それぞれが同じ 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-server
http://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.1
GET /homes/wtc.png HTTP/1.1
frontend http
reqrep ^([A-Z]+)\ /+[^/]+(/+.*)?$ \1\ \2
reqrep
ただし、HAproxy はディレクティブをuse-backend
1 つ前に評価するため、バックエンドの評価が壊れ、機能しません。
$ 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 -