插件体系
插件系统允许您通过添加各类插件来扩展 Location 的功能,支持鉴权、流控、响应头设置等多种场景。通过插件,您可以灵活地定制请求处理流程。
插件执行时点
插件可以在请求处理的不同阶段执行,目前支持以下三个时点:
-
Request
: 请求最开始阶段- 适用于权限验证等需要早期拦截的场景
-
ProxyUpstream
: 转发至上游节点之前- 在读取缓存之后执行
- 适用于需要限制上游访问但允许缓存访问的场景
- 例如:限制对上游的请求频率,但允许高并发读取缓存
-
Response
: 上游响应之后- 用于处理和修改上游返回的响应数据
#[async_trait]
pub trait Plugin: Sync + Send {
// 返回插件类型,用于分类管理
fn category(&self) -> PluginCategory;
// 指定插件执行时序(Request/ProxyUpstream/Response)
fn step(&self) -> String;
// 处理请求的钩子函数
// 返回 Some(response) 表示请求处理完成,直接返回响应
// 返回 None 表示继续后续处理
async fn handle_request(...) -> Result<Option<HttpResponse>>;
// 处理响应的钩子函数
// 返回 Some(bytes) 表示重写响应体
// 返回 None 表示使用原响应
async fn handle_response(...) -> Result<Option<Bytes>>;
}
主要分三个实现:
category
: 插件类型,用于区分该插件是哪类形式的插件step
: 插件的执行时序,按需选择插件的执行时序,不同的插件可选择的选择不一样handle_request
: 插件的转发前执行逻辑,若返回的是Ok(Some(HttpResponse))
,则表示请求已处理完成,不再转发到上游节点,并将该响应传输至请求端handle_response
: 插件的响应前执逻辑,若返回的是Ok(Some(Bytes))
,则表示要重写响应数据
Stats 性能统计插件
Stats插件用于暴露应用的性能指标数据,方便第三方系统采集监控。可以通过以下两种方式使用:
- 使用内置的
pingap:stats
插件 - 自定义配置新的 Stats 插件
配置示例
[plugins.stats]
category = "stats"
path = "/stats" # 访问路径
remark = "性能指标采集"
配置参数
path
: 指标数据访问路径,如配置为/stats
则可通过该路径获取性能指标step
: 插件执行时机,可选request
或proxy_upstream
使用方式
配置完成后,可以通过访问对应 location 下的 /stats
路径获取性能指标数据。
Ping
Ping插件提供了一个简单的健康检查端点,用于监控服务是否正常运行。当配置了反向代理时,也可以作为 pingap 的健康检查机制。
[plugins.pingpong]
category = "ping"
path = "/ping" # 健康检查路径
配置参数
path
: 健康检查的访问路径,访问该路径时会返回 "pong" 响应step
: 插件执行时机,仅支持request
阶段
使用方式
配置完成后,访问对应的 path 路径(如 /ping
)即可获得 "pong" 响应,用于验证服务是否存活。
Admin
Admin 插件用于为现有 location 添加管理后台功能。配置示例:
[plugins.admin]
authorizations = ["YWRtaW46MTIzMTIz"] # base64(admin:123123)
category = "admin"
ip_fail_limit = 10
max_age = "7d"
path = "/pingap"
remark = "管理后台"
配置参数
authorizations
: Basic 认证的密钥列表,使用 base64 编码的用户名:密码
格式ip_fail_limit
: 单个 IP 允许的最大认证失败次数path
: 管理后台访问路径max_age
: 登录会话有效期,默认为 2 天step
: 插件执行时机,可选request
或proxy_upstream
使用方式
- 将插件配置关联到指定 location
- 访问该 location 下 的配置路径(如
/pingap/
)即可进入管理后台 - 使用配置的账号密码登录(示例中为
admin/123123
)
Directory
Directory 插件提供静态文件服务功能,支持文件浏览和下载。
配置示例
[plugins.downloadsServe]
category = "directory"
path = "~/Downloads"
chunk_size = "4kb"
max_age = "1h"
private = true
index = "index.html"
charset = "utf-8"
autoindex = true
download = true
headers = [
"X-Server:pingap",
]
配置参数
path
: 静态文件目录路径chunk_size
: HTTP 分块传输大小,默认8kb
max_age
: HTTP 缓存时间- 默认不设置缓存
- 对
text/html
类型始终禁用缓存 - 如
1h
表示缓存 1 小时
private
: 是否将缓存设为private
(默认为public
)index
: 默认索引文件名,默认为index.html
charset
: 指定字符集编码,默认不设置autoindex
: 是否启用目录浏览- 启用后
index
参数将失效
- 启用后
download
: 是否启用文件下载- 启用后将设置
Content-Disposition
响应头
- 启用后将设置
headers
: 自定义 HTTP 响应头列表step
: 插件执行时机,可选request
或proxy_upstream
使用方式
在界面中配置静态文件目录路径,根据需要调整其他参数:
Mock
Mock 插件用于模拟 HTTP 响应,可用于测试或临时服务降级。支持自定义响应内容、状态码和响应头。
配置示例
[plugins.errorMock]
category = "mock"
data = '{"error": "error message"}'
delay = "1s"
headers = [
"X-Error:CustomRrror",
"Content-Type:application/json",
]
path = "/"
status = 500
step = "request"
配置参数
data
: 模拟的响应数据- 对于不同类型的数据,需在
headers
中指定对应的Content-Type
- 对于不同类型的数据,需在
headers
: 自定义响应头列表path
: 需要模拟响应的请求路径- 不配置则匹配所有路径
status
: HTTP 响应状态码delay
: 响应延迟时间step
: 插件执行时机,可选request
或proxy_upstream
使用方式
在界面中配置响应数据和相关参数,注意根据响应数据类型设置正确的 Content-Type:
Redirect
Redirect 插件用于 HTTP 请求重定向,支持添加 URL 前缀或将 HTTP 请求重定向至 HTTPS。
配置示例
[plugins.http2https]
category = "redirect"
http_to_https = true
prefix = "/api"
step = "request"
配置参数
http_to_https
: 是否将 HTTP 请求重定向至 HTTPSprefix
: 重定向时要添加的 URL 前缀step
: 插件执行时机,仅支持request
使用方式
在界面中配置重定向参数:
- 启用 HTTPS 重定向:勾选
http_to_https
- 添加 URL 前缀:在
prefix
字段中填写(可选)
Cache
缓存中间件,用于缓存 HTTP 请求。由于缓存模块是全局使用,为避免相同 URL 的冲突,建议每个 location 使用不同的插件并设置不同的 namespace。
配置示例
[plugins.chartsCache]
category = "cache"
eviction = true
headers = ["Accept-Encoding"]
lock = "3s"
max_file_size = "100kb"
max_ttl = "1h"
namespace = "charts"
predictor = true
purge_ip_list = [
"127.0.0.1",
"192.168.1.1/24"
]
配置参数
lock
: 缓存不存在时,相同请求的等待时长,默认为 1 秒- 用于避免缓存击穿
max_file_size
: 单个缓存文件的最大长度,默认为 1MB- 建议设置合理的值,避免过大的响应占用过多内存
namespace
: 缓存命名空间- 缓存键基于 path + querystring 生成
- 多域名场景建议使用不同的命名空间
- 文件缓存时对应单独的文件目录
max_ttl
: 缓存的最长有效期- 当上游响应的
Cache-Control
的max-age
较长时,建议设置较短的s-maxage
- 当上游未设置
s-maxage
时,可通过此配置限制缓存时间
- 当上游响应的
eviction
: 是否启用缓存清除机制- 当缓存超限时触发清除
- 文件缓存会自动清除长期未访问的缓存,可不设置
predictor
: 是否记录无法缓存的请求- 避免重复判断请求是否可缓存
headers
: 作为缓存键一部分的请求头列表- 当响应依赖某些请求头时配置
- 例如:上游支持不同压缩算法时,需包含
Accept-Encoding
purge_ip_list
: 允许执行 purge 请求的 IP 列表,默认为空skip
: 跳过缓存的正则表达式,默认为空- 用于快速跳过某些请求的缓存判断
step
: 插件执行时机,仅支持request
界面配置
RequestId
为每个请求添加唯一标识符。默认添加到 X-Request-Id
请求头中(可自定义请求头名称)。如果请求中已存在该请求头,则保留原值不做修改。
配置示例
[plugins.customReqId]
algorithm = "nanoid" # 可选: uuid 或 nanoid
category = "request_id"
size = 8 # nanoid 长度,仅在 algorithm=nanoid 时有效
header = "X-Request-Id" # 可选:自定义请求头名称
step = "request" # 可选: request 或 proxy_upstream
配置参数
algorithm
: 生成请求 ID 的算法uuid
: 使用 UUID v4 格式nanoid
: 使用 NanoID 格式(更短、URL 安全)
size
: NanoID 长度,仅当 algorithm=nanoid 时有效header
: 自定义请求头名称,默认为X-Request-Id
step
: 插件执行时机,可选request
或proxy_upstream
使用场景
- 请求追踪:方便在分布式系统中追踪请求链路
- 日志关联:通过请求 ID 关联不同服务的日志
- 问题排查:使用请求 ID 快速定位问题
Compression
HTTP 响应压缩插件,用于处理上游返回数据的压缩。支持 gzip、brotli(br) 和 zstd 三种压缩算法。
工作原理
由于 Pingora 默认的压缩算法匹配顺序为 gzip --> br --> zstd
,而现代浏览器对这些算法的支持情况为:
- gzip: 基本全部支持
- br(brotli): 大部分支持
- zstd: 部分支持
为了优化压缩效果,该插件会调整请求的 Accept-Encoding
头,将算法优先级调整为 zstd --> br --> gzip
。