Pingap-基于 pingora 开发的反向代理

2024-04-07 13:51:04 +08:00
 treexie

Pingap 是基于pingora开发的,pingora 提供了各类模块便于 rust 开发者使用,但并不方便非 rust 开发者使用,因此 pingap 提供了以 toml 的形式配置简单易用的反向代理,实现支持多 location 代理转发。特性如下:

Pingap 处理流程

根据请求的路径选择对应的服务

Pingap 支持两种特别的服务类型,以及常规的反向代理服,具体如下:

graph TD;
    start("新的请求")-->ServiceFilter{{请求服务筛选}};
    ServiceFilter--是否匹配 stats-->stats 的处理;
    ServiceFilter--是否匹配 admin-->admin 的处理;
    ServiceFilter--根据 host 与 path 选择对应的 Location-->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))?;

Location 的详细说明

Upstream 的处理逻辑

Upstream 现支持三种类型,包括静态目录Mock 响应以及常规的反向代理节点。upstream 的处理比较简单,大概如下:

Upstream 的详细说明

访问日志格式化

日志格式化详细说明

源代码可查阅https://github.com/vicanso/pingap

1454 次点击
所在节点    程序员
4 条回复
mightybruce
2024-04-07 15:08:01 +08:00
pingora 众多 bug 还没解决, 出这个太早了吧。
treexie
2024-04-07 18:27:03 +08:00
我自己在使用时主要是 pingora 很多的方法并没有提供,而部分参数也未允许定制化调整。Cloudflare 已在其云服务上使用,至于以后 pingora 是否可以发展得很好这是未知之数,但我认为可尝试使用其来构建服务。
fengxsong
2024-04-07 18:48:49 +08:00
社区有个 river 的项目,不过还只是 almost empty repo
treexie
2024-04-07 18:56:25 +08:00
是的,在 memorysafety 下的,他们还在做各种调研以及针对需求提出各种 issue 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1030242

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX