HAProxy可以透過acl的定義來決定request要導向那台Backend,本文就來介紹本站的一些設定吧
在這裡透過path_beg的acl,讓送來的request導向其他的服務,而不是域名所指定的後端。
acl www_url hdr_beg(host) -i www.ccc.tc ccc.tc cn.ccc.tc en.ccc.tc
acl fastapi_rembg path_beg -i www_url /api/rembg
acl全名為Access Control List,這讓我們可以透過一系列的存取控制來決定前端的request應導向那個後端。
acl後面即是此條件的名稱,如果與url相關的條件,我習慣上會補上_url,例如上方我命名為www_url。
不難看出這裡使用了hdr_beg(host),就是網址開頭便會套用到這個條件規則,所以也可以簡單的打www cn en等子域名。
第二條規則我命名為fastapi_rembg,不難看出這裡用的是path_beg,即是路徑開頭符合/api/rembg,另外-i的後面我使用了www_url,也就是說必需預名也符合。
大至上用猜的都猜的出來,讓我們繼續看下去,backend的指定
use_backend fastapi_cv2_server if fastapi_rembg
use_backend ccc_server if www_url
在這裡,很明顯的use_backend後的即是後端主機的規則名稱,我個人的習慣上會透過_server來代表。
在第一行中,您應該就可以猜出了,如果網址路徑是/api/rembg開頭的,便使用fastapi_cv2_server這個後端。
如果網址是www.ccc.tc、cn.ccc.tc或en.ccc.tc就使用ccc_server這個後端,非常清楚。
最後來看看backend的定義吧
backend fastapi_cv2_server
mode http
balance roundrobin
http-request set-path "%[path,regsub(^/api/rembg/,/)]"
server cv2 192.168.99.130:8000 check cookie cv2
backend ccc_server
mode http
balance roundrobin
server ccc 192.168.99.130:1056 check cookie cc
在這裡,基本上我連到相同的主機,當然也可以是不同的主機或是多台主機。
我透過了port來拆分fastapi及nginx主機。
在fastapi_cv2_server的後端設定中,多了一項有趣的設定,set-path。
從語法上應該不難看出,就是把原本request的路徑/api/rembg改為/後再打去後端。
這樣後端的路徑就不需要進行額外的調整了,就FastAPI來說需補上root_path這個設定,這樣docs的路徑才會正確。
root_path可以啟動時透過參數設定,也可採用程式的方式設定,這裡就看看程式中如何設定
app = FastAPI(root_path="/api/rembg")
@app.get("/")
def DemoAPI(request: Request):
return {"message": "Running on Synology Nas phpenv Container", "root_path": request.scope.get("root_path")}
在HAProxy的set-path幫助下,可以看見我這裡get("/")唯持在根目錄,而不需要調整程式成/api/rember/,您可以點這個網址看看
https://www.ccc.tc/api/rembg/
而當路徑非/api/rembg時,則會將request送到port 1056的nginx服務,而不是fastapi。
HAProxy功能真的相當強大,當您細細研究時,就會發現別有一翻天地。
本文僅是拋磚引玉,提供一小部份的功能介紹跟說明。
No Comment
Post your comment