treexie
V2EX  ›  程序员

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

By treexie at 2024 年 4 月 7 日 · 2820 次点击

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

  • 支持多 location 配置,可通过请求的路径与域名筛选
  • 支持静态文件目录处理,简单方便的 chunk 的形式响应静态文件
  • 支持 mock 的响应配置,方便测试或应急使用
  • 支持 HTTP1 与 HTTP2 两种协议
  • 无中断请求的配置更新,方便实时更新应用配置
  • 模板式的请求日志输出,可按模板指定各种输出

Pingap 处理流程

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

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

  • Stats: 获取 Server 所对应的性能指标
  • Admin: 根据启动时指定的 admin 地址或者配置的admin path转发至对应的管理后台服务
  • 其它: 常规的反向代理服务,根据域名与路径选择对应的转发节点
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 的处理比较简单,大概如下:

  • 静态目录: 读取对应的静态文件响应,需要注意静态文件是以 chunked 的形式返回
  • Mock 响应: 用于针对部分响应临时 mock 处理,主要用于临时的应急处理或测试
  • 反向代理节点: 根据各节点的健康情况以及选择算法,选择对应的节点转发请求

Upstream 的详细说明

访问日志格式化

日志格式化详细说明

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

4 条回复  •  2024-04-07 18:56:25 +08:00
mightybruce
   1
mightybruce  
   2024 年 4 月 7 日
pingora 众多 bug 还没解决, 出这个太早了吧。
treexie
   2
treexie  
OP
   2024 年 4 月 7 日
我自己在使用时主要是 pingora 很多的方法并没有提供,而部分参数也未允许定制化调整。Cloudflare 已在其云服务上使用,至于以后 pingora 是否可以发展得很好这是未知之数,但我认为可尝试使用其来构建服务。
dummyx
   3
dummyx  
   2024 年 4 月 7 日 via Android
社区有个 river 的项目,不过还只是 almost empty repo
treexie
   4
treexie  
OP
   2024 年 4 月 7 日
是的,在 memorysafety 下的,他们还在做各种调研以及针对需求提出各种 issue 。
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 29ms · 3.9.8.5