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