这个路径转给哪个后端
按模型,表 [(/api, api), (/img, cdn)]、访问 /img/logo,route 交回哪个后端名?
贯穿本节的反向代理模型(判题机不联网、也没 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"), ("/img", "cdn")]
print(route("/img/logo", tbl))
全部评论