23 个版本 (5 个重大变更)

0.6.2 2024 年 7 月 26 日
0.5.6 2024 年 5 月 29 日
0.1.2 2024 年 3 月 29 日

#129 in HTTP 服务器

Download history 452/week @ 2024-04-25 703/week @ 2024-05-02 108/week @ 2024-05-09 338/week @ 2024-05-16 501/week @ 2024-05-23 72/week @ 2024-05-30 8/week @ 2024-06-06 5/week @ 2024-06-13 17/week @ 2024-07-04 2/week @ 2024-07-11 114/week @ 2024-07-18 121/week @ 2024-07-25 5/week @ 2024-08-01

每月 240 次下载

Apache-2.0

590KB
15K SLoC

pingap

Pingap Logo

什么是 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_encryptbackend_statusdiff_configrestart 等。
  • Http 代理插件:compressionstatic servelimitstatsmock 等。
  • 不同阶段的统计信息:upstream_connect_timeupstream_processing_timecompression_timecache_lookup_timecache_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