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

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

 
  •   treexie 2024-04-07 13:51:04 +08:00 1786 次点击
    这是一个创建于 554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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-04-07 15:08:01 +08:00
    pingora 众多 bug 还没解决, 出这个太早了吧。
    treexie
        2
    treexie  
    OP
       2024-04-07 18:27:03 +08:00
    我自己在使用时主要是 pingora 很多的方法并没有提供,而部分参数也未允许定制化调整。Cloudflare 已在其云服务上使用,至于以后 pingora 是否可以发展得很好这是未知之数,但我认为可尝试使用其来构建服务。
    fengxsong
        3
    fengxsong  
       2024-04-07 18:48:49 +08:00 via Android
    社区有个 river 的项目,不过还只是 almost empty repo
    treexie
        4
    treexie  
    OP
       2024-04-07 18:56:25 +08:00
    是的,在 memorysafety 下的,他们还在做各种调研以及针对需求提出各种 issue 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5833 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:35 PVG 09:35 LAX 18:35 JFK 21:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86