23 个版本 (5 个重大变更)
0.6.2 | 2024 年 7 月 26 日 |
---|---|
0.5.6 | 2024 年 5 月 29 日 |
0.1.2 | 2024 年 3 月 29 日 |
#129 in HTTP 服务器
每月 240 次下载
590KB
15K SLoC
pingap
什么是 Pingap
类似于 nginx 的反向代理,基于 pingora,简单高效。
flowchart LR
internet("Internet") -- request --> pingap["Pingap"]
pingap -- proxy:pingap.io/api/* --> apiUpstream["10.1.1.1,10.1.1.2"]
pingap -- proxy:cdn.pingap.io --> cdnUpstream["10.1.2.1,10.1.2.2"]
pingap -- proxy:pingap.io --> upstream["10.1.3.1,10.1.3.2"]
功能
- 服务器支持多个位置,通过主机和路径选择位置
- 使用正则表达式重写路径
- HTTP 1/2 端到端代理,包括 h2c
- TOML 基础配置,文件或 etcd 存储
- 上游和位置更改大约 10 秒内生效,其他配置在优雅重启后生效
- HTTP 访问日志模板,支持超过 30 个属性
- 易于使用的 Admin Web UI 配置
- 从 let's encrypt 生成 TLS 证书
- 服务器支持不同域的多张 TLS 证书
- 通知事件:
lets_encrypt
、backend_status
、diff_config
、restart
等。 - Http 代理插件:
compression
、static serve
、limit
、stats
、mock
等。 - 不同阶段的统计信息:
upstream_connect_time
、upstream_processing_time
、compression_time
、cache_lookup_time
和cache_lock_time
启动
从 /opt/pingap/conf
或文件 /opt/pingap/pingap.toml
加载所有配置并在后台运行。日志追加到 /opt/pingap/pingap.log
。
RUST_LOG=INFO pingap -c=/opt/pingap/conf -d --log=/opt/pingap/pingap.log
优雅重启
验证配置,向 pingap 发送退出信号,然后启动一个新进程来处理所有请求。
RUST_LOG=INFO pingap -c=/opt/pingap/conf -t \
&& pkill -SIGQUIT pingap \
&& RUST_LOG=INFO pingap -c=/opt/pingap/conf -d -u --log=/opt/pingap/pingap.log
自动重启
监视配置,如果其中任何一个更改,则优雅重启 pingap。 autoreload
表示如果仅更新上游和位置配置,则它们将在大约 10 秒内生效,而无需重启。
RUST_LOG=INFO pingap -c=/opt/pingap/conf \
&& -a -d --autoreload --log=/opt/pingap/pingap.log
Docker
cGluZ2FwOjEyMzEyMw==
是 base64("pingap:123123")
docker run -it -d --restart=always \
-v $PWD/pingap:/opt/pingap \
-p 3018:3018 \
vicanso/pingap -c /opt/pingap/conf \
--autoreload \
--admin=[email protected]:3018
开发
make dev
如果您需要网络管理员,应安装nodejs并构建网络资源。
# generate admin web asset
cd web
yarn install
cd ..
make build-web
配置
[upstreams.charts]
addrs = ["127.0.0.1:5000"]
[locations.lo]
upstream = "charts"
path = "/"
[servers.test]
addr = "0.0.0.0:6188"
locations = ["lo"]
所有toml配置如下 pingap.toml。
代理步骤
graph TD;
server["HTTP Server"];
locationA["Location A"];
locationB["Location B"];
locationPluginListA["Proxy Plugin List A"];
locationPluginListB["Proxy Plugin List B"];
upstreamA1["Upstream A1"];
upstreamA2["Upstream A2"];
upstreamB1["Upstream B1"];
upstreamB2["Upstream B2"];
locationResponsePluginListA["Response Plugin List A"];
locationResponsePluginListB["Response Plugin List B"];
start("New Request") --> server
server -- "host:HostA, Path:/api/*" --> locationA
server -- "Path:/rest/*"--> locationB
locationA -- "Exec Proxy Plugins" --> locationPluginListA
locationB -- "Exec Proxy Plugins" --> locationPluginListB
locationPluginListA -- "proxy pass: 10.0.0.1:8001" --> upstreamA1
locationPluginListA -- "proxy pass: 10.0.0.2:8001" --> upstreamA2
locationPluginListA -- "done" --> response
locationPluginListB -- "proxy pass: 10.0.0.1:8002" --> upstreamB1
locationPluginListB -- "proxy pass: 10.0.0.2:8002" --> upstreamB2
locationPluginListB -- "done" --> response
upstreamA1 -- "Exec Response Plugins" --> locationResponsePluginListA
upstreamA2 -- "Exec Response Plugins" --> locationResponsePluginListA
upstreamB1 -- "Exec Response Plugins" --> locationResponsePluginListB
upstreamB2 -- "Exec Response Plugins" --> locationResponsePluginListB
locationResponsePluginListA --> response
locationResponsePluginListB --> response
response["HTTP Response"] --> stop("Logging");
性能
CPU:M2,线程:1
Ping无访问日志
wrk 'http://127.0.0.1:6188/ping' --latency
Running 10s test @ http://127.0.0.1:6188/ping
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 67.10us 67.52us 4.63ms 99.53%
Req/Sec 74.82k 2.57k 85.56k 92.57%
Latency Distribution
50% 69.00us
75% 76.00us
90% 83.00us
99% 105.00us
1504165 requests in 10.10s, 196.52MB read
Requests/sec: 148928.76
Transfer/sec: 19.46MB
Rust版本
我们当前的MSRV是1.74
许可证
本项目受Apache License, Version 2.0许可。
依赖项
~93–135MB
~2.5M SLoC