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

256 天前
 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

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

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

https://www.v2ex.com/t/1030242

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

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

© 2021 V2EX