返回更新列表
新发布Sep 1, 2026

pingap v0.13.10

一个类似 nginx 的反向代理,基于 pingora 构建,简单高效。

分享

Pingap

Pingap在发布稳定版本之前,暂时不接受 pull requests,如果有问题可以先提issue,会及时处理。

Pingap 是一款由 Cloudflare Pingora 框架驱动的高性能反向代理。它通过简洁的 TOML 文件和直观的 Web 管理界面,实现了动态、零停机的配置热更新,极大地简化了运维管理。

其核心优势在于强大的插件体系,提供了二十多种开箱即用的功能,涵盖认证 (JWT, Key Auth)、安全 (CSRF, IP/Referer/UA 限制)、流量控制 (限流、缓存)、内容修改 (重定向、内容替换) 和可观测性 (请求 ID)。

这使得 Pingap 不仅仅是一个代理,更是一个灵活且可扩展的应用网关,旨在轻松应对从 API 保护到现代化 Web 应用部署的各类复杂场景。

使用示例 | 详细文档

flowchart LR
  internet("互联网") -- 客户端请求 --> pingap["Pingap"]
  pingap -- 转发:pingap.io/api/* --> apiUpstream["10.1.1.1,10.1.1.2"]
  pingap -- 转发:cdn.pingap.io --> cdnUpstream["10.1.2.1,10.1.2.2"]
  pingap -- 转发:/* --> upstream["10.1.3.1,10.1.3.2"]

核心特性

  • 🚀 高性能与高可靠性

    • 基于 Rust 构建,确保内存安全与顶尖性能。
    • Cloudflare Pingora 驱动,一个经过实战考验的异步网络库。
    • 支持 HTTP/1.1、HTTP/2 和 gRPC-web 代理。
  • 🔧 动态化与易用性

    • 通过热更新实现零停机的配置变更。
    • 简单且人类可读的 TOML 配置文件。
    • 功能齐全的 Web UI,提供直观的实时管理。
    • 同时支持文件和 etcd 作为配置后端。
    • 支持配置变更历史记录功能,可一键恢复到历史版本。
  • 🧩 强大的可扩展性

    • 丰富的插件体系,用于处理常见的网关任务。
    • 支持基于主机、路径和正则表达式的高级路由。
    • 内置通过静态列表、DNS 或 Docker 标签的服务发现机制。
    • 通过 Let's Encrypt 实现自动化 HTTPS(支持 HTTP-01 和 DNS-01 两种质询方式)。
  • 📊 现代化的可观测性

    • 原生的 Prometheus 指标监控(支持 pull 和 push 模式)。
    • 集成 OpenTelemetry,支持分布式追踪。
    • 超过 30 种变量的高度可定制的访问日志。
    • 包含上游连接、处理时间等详细的性能指标。

🚀 快速入门

上手 Pingap 最简单的方式是使用 Docker Compose

  1. 创建一个 docker-compose.yml 文件:
# docker-compose.yml
version: '3.8'

services:
  pingap:
    image: vicanso/pingap:latest # 生产环境建议使用具体的版本号,如 vicanso/pingap:0.12.1-full
    container_name: pingap-instance
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 挂载本地目录以持久化所有配置和数据
      - ./pingap_data:/opt/pingap
    environment:
      # 使用环境变量进行配置
      - PINGAP_CONF=/opt/pingap/conf
      - PINGAP_ADMIN_ADDR=0.0.0.0:80/pingap
      - PINGAP_ADMIN_USER=pingap
      - PINGAP_ADMIN_PASSWORD=<YourSecurePassword> # 修改此密码!
    command:
      # 启动 pingap 并启用热更新
      - pingap
      - --autoreload
  1. 创建一个数据目录并运行:
mkdir pingap_data
docker-compose up -d
  1. 访问管理后台:

您的 Pingap 实例现已运行!您可以使用您设置的凭证,通过 http://localhost/pingap 访问 Web 管理界面。

通过 curl 安装二进制

Linux 与 macOS 用户可以用一条命令将最新的预编译二进制安装到 /usr/local/bin/pingap

curl -sSL https://raw.githubusercontent.com/vicanso/pingap/main/install.sh | sh

可选环境变量:

  • PINGAP_FULL=1 —— 安装 -full 构建(启用所有可选特性)
  • PINGAP_LIBC=gnu —— Linux 上使用 glibc 构建(默认是静态链接的 musl 构建)
# 安装完整特性版本
curl -sSL https://raw.githubusercontent.com/vicanso/pingap/main/install.sh | PINGAP_FULL=1 sh

支持的平台:Linux x86_64/arm64Darwin x86_64/arm64。所有可用的构建产物见 releases 页面

要了解更多详细说明,包括如何通过二进制文件运行,请查阅我们的文档

动态配置

Pingap 的设计旨在无需停机即可适应配置变更。

热更新 (--autoreload):对于大多数变更——如更新上游服务、路由或插件——Pingap 会在10秒内应用新配置,无需重启。这是容器化环境的推荐模式。

平滑重启 (-a 或 --autorestart):对于基础性变更(如修改服务器监听端口),此模式会执行一次完整的、零停机的重启,确保不丢失任何请求。

🔧 开发

make dev

如果需要 Web 管理界面,需要安装 nodejs 并构建 Web 资产。

# 生成 Web 管理界面资产
cd web
npm i 
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 配置可以查阅:https://pingap.io/pingap-zh/docs/config

🔄 请求处理流程

graph TD;
    server["HTTP服务"];
    locationA["Location A"];
    locationB["Location B"];
    locationPluginListA["转发插件列表A"];
    locationPluginListB["转发插件列表B"];
    upstreamA1["上游服务A1"];
    upstreamA2["上游服务A2"];
    upstreamB1["上游服务B1"];
    upstreamB2["上游服务B2"];
    locationResponsePluginListA["响应插件列表A"];
    locationResponsePluginListB["响应插件列表B"];

    start("新的请求") --> server

    server -- "host:HostA, Path:/api/*" --> locationA

    server -- "Path:/rest/*"--> locationB

    locationA -- "顺序执行转发插件" --> locationPluginListA

    locationB -- "顺序执行转发插件" --> locationPluginListB

    locationPluginListA -- "转发至: 10.0.0.1:8001" --> upstreamA1

    locationPluginListA -- "转发至: 10.0.0.2:8001" --> upstreamA2

    locationPluginListA -- "处理完成" --> response

    locationPluginListB -- "转发至: 10.0.0.1:8002" --> upstreamB1

    locationPluginListB -- "转发至: 10.0.0.2:8002" --> upstreamB2

    locationPluginListB -- "处理完成" --> response

    upstreamA1 -- "顺序执行响应插件" --> locationResponsePluginListA
    upstreamA2 -- "顺序执行响应插件" --> locationResponsePluginListA

    upstreamB1 -- "顺序执行响应插件" --> locationResponsePluginListB
    upstreamB2 -- "顺序执行响应插件" --> locationResponsePluginListB

    locationResponsePluginListA --> response
    locationResponsePluginListB --> response

    response["HTTP响应"] --> stop("日志记录");

📊 性能测试

CPU: M4 Pro, Thread: 1

Ping (无访问日志)

wrk 'http://127.0.0.1:6118/ping' --latency

Running 10s test @ http://127.0.0.1:6118/ping
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    66.41us   23.67us   1.11ms   76.54%
    Req/Sec    73.99k     2.88k   79.77k    68.81%
  Latency Distribution
     50%   67.00us
     75%   80.00us
     90%   91.00us
     99%  116.00us
  1487330 requests in 10.10s, 194.32MB read
Requests/sec: 147260.15
Transfer/sec:     19.24MB
Pingap qrcode

📦 最低支持rust版本

最低支持的rust版本为1.83

📄 开源协议

本项目采用 Apache License, Version 2.0 开源协议。

分类