Pingap 是基于pingora开发的,pingora 提供了各类模块便于 rust 开发者使用,但并不方便非 rust 开发者使用,因此 pingap 提供了以 toml 的形式配置简单易用的反向代理,实现支持多 location 代理转发。特性如下:
Pingap 支持两种特别的服务类型,以及常规的反向代理服,具体如下:
Stats
: 获取 Server 所对应的性能指标Admin
: 根据启动时指定的 admin 地址或者配置的admin path
转发至对应的管理后台服务其它
: 常规的反向代理服务,根据域名与路径选择对应的转发节点graph TD;
start("新的请求")-->ServiceFilter{{请求服务筛选}};
ServiceFilter--是否匹配 stats-->stats 的处理;
ServiceFilter--是否匹配 admin-->admin 的处理;
ServiceFilter--根据 host 与 path 选择对应的 Location-->Location 筛选处理;
该 Server 下的所有 location 在初始化时根据权重按高至低排序,接受到请求时按顺序一个个匹配到符合的 location 为止,若无符合的则返回出错。根据符合的 location 重写 path(若无则不需要),添加请求头(若无则不需要),成功响应时添加响应头(若无则不需要)。
let header = session.req_header_mut();
let path = header.uri.path();
let host = header.uri.host().unwrap_or_default();
let (location_index, lo) = self
.locations
.iter()
.enumerate()
.find(|(_, item)| item.matched(host, path))
.ok_or_else(|| pingora::Error::new_str(LOCATION_NOT_FOUND))?;
Upstream 现支持三种类型,包括静态目录
,Mock 响应
以及常规的反向代理节点
。upstream 的处理比较简单,大概如下:
静态目录
: 读取对应的静态文件响应,需要注意静态文件是以 chunked 的形式返回Mock 响应
: 用于针对部分响应临时 mock 处理,主要用于临时的应急处理或测试反向代理节点
: 根据各节点的健康情况以及选择算法,选择对应的节点转发请求 1
mightybruce 237 天前
pingora 众多 bug 还没解决, 出这个太早了吧。
|
2
treexie OP 我自己在使用时主要是 pingora 很多的方法并没有提供,而部分参数也未允许定制化调整。Cloudflare 已在其云服务上使用,至于以后 pingora 是否可以发展得很好这是未知之数,但我认为可尝试使用其来构建服务。
|
3
fengxsong 237 天前 via Android
社区有个 river 的项目,不过还只是 almost empty repo
|
4
treexie OP 是的,在 memorysafety 下的,他们还在做各种调研以及针对需求提出各种 issue 。
|