V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
treexie
V2EX  ›  程序员

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

  •  
  •   treexie · 265 天前 · 1262 次点击
    这是一个创建于 265 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       265 天前
    pingora 众多 bug 还没解决, 出这个太早了吧。
    treexie
        2
    treexie  
    OP
       265 天前
    我自己在使用时主要是 pingora 很多的方法并没有提供,而部分参数也未允许定制化调整。Cloudflare 已在其云服务上使用,至于以后 pingora 是否可以发展得很好这是未知之数,但我认为可尝试使用其来构建服务。
    fengxsong
        3
    fengxsong  
       265 天前 via Android
    社区有个 river 的项目,不过还只是 almost empty repo
    treexie
        4
    treexie  
    OP
       265 天前
    是的,在 memorysafety 下的,他们还在做各种调研以及针对需求提出各种 issue 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:51 · PVG 20:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.