这个请求转给哪台
按模型,表 [(/api, api)]、访问 /api/x,forward 交回哪个地址?
贯穿本节的反向代理模型(判题机不联网、也没 nginx,这是它的确定模型):route(路径, 表) 按前缀把路径转给对应后端(表是 [(前缀, 后端名)],先到先匹配,都不中走 web);strip_prefix(路径, 前缀) 把命中的前缀去掉再转(空了给 /);forward(路径, 表, 后端) 交回选中后端的地址;is_reverse(部署方)=服务端部署的才是反向代理;backend_count/upstream_list 数后端个数 / 列后端名。
# 反向代理坐在后端前面,替客户端把请求转发给后端、再把响应带回来;客户端只认代理
def is_reverse(deployed_by):
# 反向代理由服务端部署(正向代理由客户端一侧部署)
return deployed_by == "server"
def route(path, table):
# 按前缀把路径转发到对应后端(table: [(前缀, 后端名)],先到先匹配);都不匹配走 "web"
for prefix, name in table:
if path.startswith(prefix):
return name
return "web"
def strip_prefix(path, prefix):
# proxy_pass 常把匹配到的前缀去掉再转给后端;去不掉就原样
if path.startswith(prefix):
return path[len(prefix):] or "/"
return path
def forward(path, table, backends):
# 转发:先按路径选后端名,再交回该后端地址
return backends[route(path, table)]
def backend_count(backends):
return len(backends)
def upstream_list(backends):
# upstream 里配了哪些后端名(按加入序)
return list(backends.keys())
tbl = [("/api", "api")]
be = {"web": "127.0.0.1:8001", "api": "127.0.0.1:8002"}
print(forward("/api/x", tbl, be))
全部评论