Pingap v0.2.0,基于 Pingora 的反向代理软件
Pingap是基于pingora开发的,基于 Apache-2.0 license协议开源,源代码可查阅https://github.com/vicanso/pingap。pingora提供了各类模块便于rust开发者使用,但并不方便非rust开发者使用,因此pingap提供了以toml的形式配置简单易用的反向代理,实现支持多location代理转发,通过插件的形式支持更多的需求场景。特性如下:
- 支持多location配置,可通过请求的路径与域名筛选
- 支持HTTP1与HTTP2两种协议
- 无中断请求的配置更新,方便实时更新应用配置
- 模板式的请求日志输出,可按模板指定各种输出
- 提供Web界面式的配置,简化操作
- 支持各种插件形式,根据需要灵活配置各种特性:如静态文件目录、服务性能指标、WEB后台配置应用等
Location的处理逻辑
该Server下的所有location在初始化时根据权重按高至低排序,接受到请求时按顺序一个个匹配到符合的location为止,若无符合的则返回出错。在选择对应的location之后,判断是否有配置重写pathh(若无则不需要),添加请求头(若无则不需要),成功响应时添加响应头(若无则不需要)。
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))?; if let Some(mut new_path) = lo.rewrite(path) { if let Some(query) = header.uri.query() { new_path = format!("{new_path}?{query}"); } // TODO parse error let _ = new_path.parse::().map(|uri| header.set_uri(uri)); }
Location主要配置请求的匹配、请求头响应头的插入,以及各种插件的关联,是整个流程中的最重要组成部分。下面是相关参数的详细说明:
upstream
: 配置该location对应的upstream,若该location所有的处理均由插件完成,则可不配置host
: 匹配的域名,如果是多个域名则使用,
分隔path
: 匹配的路径,具体使用后续细说proxy_headers
: 转发至upstream时添加的请求头headers
: 响应至downstream时添加的响应头rewrite
: 请求路径的重写规则proxy_plugins
: 添加至该location的插件列表,按顺序执行
Location支持配置对应host(支持多个)与path规则,path支持以下的规则,权重由高至低:
- 全等模式,配置以
=
开始,如=/api
表示匹配path等于/api
的请求 - 正则模式,配置以
~
开始,如~^/(api|rest)
表示匹配path以/api
或/rest
开始请求 - 前缀模式,如
/api
表示匹配path为/api
开始的请求 - 空模式,若未指定path则表示所有的path均匹配,一般建议配置一个
/
的前缀模式即可,无需使用空模式
插件体系
Pingap中通过Locaton添加各种插件支持更多的应用场景,如鉴权、流控等。现在插件支持在request_filter
与proxy_upstream_filter
阶段执行,均为转发到上游节点前的处理。下面介绍一下proxy plunin
的具体逻辑,trait如下:
#[async_trait] pub trait ProxyPlugin: Sync + Send { fn category(&self) -> ProxyPluginCategory; fn step(&self) -> ProxyPluginStep; async fn handle(&self, _session: &mut Session, _ctx: &mut State) -> pingora::Result { Ok(false) } }
主要分三个实现:
category
: 插件类型,用于区分该插件是哪类形式的插件step
: 插件的执行阶段,现只支持在request_filter
与proxy_upstream_filter
阶段执行handle
: 插件的执行逻辑,若返回的是Ok(true)
,则表示请求已处理完成,不再转发到上游节点
Upstream的处理逻辑
Upstream的逻辑比较简单,在匹配location后,根据该location配置的upstream节点列表,按算法选择可用节点,并将请求转发至该节点即可。虽然注意,插件也可配置在proxy_upstream_filter
转发至upstream之前执行,可按需配置对应的插件。
Upstream配置为节点地址列表,配置为域名则会根据解析后的IP添加所有节点地址(之后并不会再次刷新域名解析),需要注意节点会使用默认的tcp health check的形式检测节点是否可用,建议配置为http health chech。下面针对相关参数详细说明:
addrs
: 节点地址列表,地址为ip:port weight
的形式,weight
权重可不指定,默认为1algo
: 节点的选择算法,支持hash
与round_robin
两种形式,如hash:ip
表示按ip hash选择节点。默认为round_robin
sni
: 若配置的是https,需要设置对应的SNIverify_cert
: 若配置的是http,是否需要校验证书有效性health_check
: 节点健康检测配置,支持http与tcp形式ipv4_only
: 若配置为域名时,是否仅添加解析的ipv4节点alpn
: 在tls握手时,alpn的配置,默认为H1connection_timeout
: tcp连接超时,默认为无total_connection_timeout
: 连接超时,对于https包括tls握手部分,默认为无read_timeout
: 读取超时,默认为无write_timeout
: 写超时,默认为无idle_timeout
: 空闲超时,指定连接空闲多久后会自动回收,如果设置为0,则连接不复用,需要注意有些网络设备对于无数据的tcp连接会过期自动关闭,因此可根据需要设置对应的值。默认为无
WEB管理后台

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
周鸿祎:闭源比开源好?Llama 3 已经给出最好答案
周鸿祎在微博回应了近日被指“攻击李厂长”(百度CEO李彦宏)的报道: 这两天有人挑事儿,说我攻击李厂长。我一直是开源的信徒,但是我说开源好,是13号在哈佛讲的,李厂长说闭源好,是16号在北京讲的。 所以我不是针对李厂长,我还是从产业发展的角度来看开源和闭源。本想详细论证为什么开源一定会超过闭源,Llama已经给出了最好的答案。 周鸿祎说道: 没有开源就没有Linux,没有PHP,没有MySQL,甚至没有互联网。包括在人工智能发展上,如果没有当初谷歌开源Transformer,就不会有OpenAI和GPT。我们都是受益于开源成长起来的个人和公司。 昨天半夜Meta开源了Llama3,一个80亿版本,一个700亿版本,性能都很强,超过了谷歌闭源的Gemini。据说还有一个4000亿参数的版本在路上,性能应该会超越GPT-4。 开源到底行不行,Llama已经给了最好的答案。 来源:https://weibo.com/1708942053/OaBT4BXgZ
- 下一篇
用户行为分析模型实践(四)—— 留存分析模型
作者:vivo 互联网大数据团队- Wu Yonggang、Li Xiong 本文是vivo互联网大数据团队《用户行为分析模型实践》系列文章第4篇 -留存分析模型。 本文详细介绍了留存分析模型的概念及基本原理,并阐述了其在产品中具体实现。针对在实际使用过程问题,探索了基于ClickHouse留存分析模型实践方案。 一、背景需求 根据CNNIC的统计数据显示,中国互联网用户已达10.79亿人,互联网普及率达到79.4%。互联网虽然仍然在快速增长,但是用户规模逐渐饱和,互联网事实上已经进入了存量用户时代,整体的流量竞争也越来越激烈,用户的留存的重要性也越来越高于拉新。因此,如何识别忠实用户,了解目标用户群的留存表现?如何分析用户流失情况,优化产品?如何分析目标用户是否完成了期望的行为等等就是我们数据分析的重要课题,而留存分析模型就是我们解决这些问题的重要工具。 二、概述 2.1 概念介绍 留存分析模型主要用于分析触发了起始事件的用户在后续时间周期内触发了后续事件(即回访事件)的比率,该模型可以较好的反映出用户的忠实度或者说是用户的粘性。对于留存分析模型有几个重要的概念要了解: 留存分析一般...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G