HAProxy - 需要向 ACL 添加 URL 參數以區分具有相同 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 中的路徑添加一個參數以區分兩個後端,在這種情況下,通過在 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
後端服務以 HTTP 404 錯誤進行響應,因為您的 HAPROXY 配置目前正在按原樣轉發 URL 的路徑。例如,一個 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 的路徑。我建議您在
reqrep
前端的定義中添加一個指令,該指令旨在操縱 HTTP 請求標頭的第一行並將類似的內容GET /newyork/homes/wtc.png HTTP/1.1
轉換為GET /homes/wtc.png HTTP/1.1
.frontend http reqrep ^([A-Z]+)\ /+[^/]+(/+.*)?$ \1\ \2
但是,它不起作用,因為 HAproxy
reqrep
在指令之前評估指令use-backend
,從而破壞了後端評估:$ 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.
第二種工作方法是在後端定義中重寫 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 -