一份现成的 Caddyfile,现在可以直接交给 zeroserve 跑。
有意思的地方不只是“兼容了一个配置格式”。zeroserve 的做法更激进:把 Caddyfile JIT 编译成用户态 eBPF,再编译成 x86_64 或 ARM64 原生机器码,最后放进 io_uring 事件循环执行。
这就把问题变得很具体:能不能保留 Caddyfile 的使用习惯,同时把 HTTPS 反向代理性能拉到接近 nginx 的档位?
目前看,作者提供的 CI 跑分给了一个肯定但有限的答案。它值得试,但还不到“生产环境通吃”的程度。
Caddyfile 没变,真正变的是执行路径
zeroserve 的 Caddy 兼容模式,不是简单把 Caddyfile 翻译成另一份静态配置。
按作者说明,它会把 Caddyfile JIT 编译为用户态 eBPF,再转成原生机器码执行。这里要特别区分:这不是把 eBPF 程序丢进内核跑,而是在 zeroserve 自己的用户态执行链路里使用 eBPF 作为中间表示。
使用方式贴近 Caddy 用户习惯。下载 v0.2.11 版本二进制后,可以这样启动:
./zeroserve --caddy /etc/caddy/Caddyfile
这对已经沉淀了 Caddyfile 的团队很关键。迁移成本不再是“重写一套 nginx 配置”,而是先拿现有 Caddyfile 做一次兼容性和性能验证。
但边界也要说清。材料只说明了 Caddyfile 兼容模式和示例用法,没有声称 zeroserve 完整兼容 Caddy 的全部生态。比如依赖复杂 Caddy 插件、自动化 TLS 细节或特殊中间件的团队,不能默认无缝切换。
我的判断是:zeroserve 现在切的不是“替代整个 Caddy”,而是“借用 Caddyfile 这层习惯,换掉底层执行模型”。这比做一个新配置语言聪明,也更容易被基础设施团队拿来试。
CI 跑分很强,但只能说明这个场景很强
作者提供的基准场景是:HTTPS reverse proxy、2 线程、AMD Ryzen 7 3700X。结果来自作者 CI。
| 服务器 | 吞吐 | p50 / p99 | 峰值 RSS |
|---|---|---|---|
| zeroserve-clang | 38,948 req/s | 1.45ms / 3.91ms | 30.9 MiB |
| Caddy | 12,529 req/s | 4.74ms / 13.11ms | 67.4 MiB |
| nginx | 37,424 req/s | 1.57ms / 4.24ms | 25.7 MiB |
这个表的信号很直接。
在该测试条件下,zeroserve-clang 的吞吐略高于 nginx,p50 和 p99 延迟也略低。相较 Caddy,吞吐约为 3.1 倍,p50 从 4.74ms 降到 1.45ms,p99 从 13.11ms 降到 3.91ms。
内存也有差异。zeroserve-clang 峰值 RSS 是 30.9 MiB,低于 Caddy 的 67.4 MiB,但高于 nginx 的 25.7 MiB。
这足以说明一件事:在这个 HTTPS 反向代理压测里,zeroserve 已经不是“比 Caddy 快一点”,而是进入了 nginx 的性能区间。
限制也同样明确。HTTPS 反向代理性能会受证书算法、上游延迟、连接复用、请求体大小、内核版本、CPU 架构和线程数影响。CI 单点结果不能写成“所有生产场景固定 3 倍吞吐、70% 延迟下降”。
所以更稳妥的结论是:如果你的瓶颈接近这个测试场景,zeroserve 值得进入候选名单;如果你的线上流量依赖长连接、多租户、复杂中间件和大量插件,跑分只能当入口,不能当结论。
最该受影响的,是两类团队
第一类是已经大量使用 Caddyfile 的运维开发者。
他们最现实的动作不是立刻替换 Caddy,而是把采购或迁移决策延后一步:先用现有 Caddyfile 在预发环境跑 zeroserve,重点看兼容项、TLS 行为、日志、错误定位和资源曲线。
如果结果稳定,再考虑把高压的 HTTPS 反向代理入口单独切出来。这样收益最大,风险也相对可控。
第二类是需要在代理层插入自定义逻辑的后端或基础设施团队。
zeroserve 支持在 Caddyfile 中调用自定义 eBPF 插件。作者给的例子是通过 io.su3.aws-sigv4.c 插件,为指向 S3 兼容存储桶的反向代理请求增加 AWS SigV4 签名。
这说明它不只是“更快地解析 Caddyfile”。它还想把鉴权、签名、改写这类逻辑放到更靠近网络入口的位置执行。
但这里也最容易踩坑。插件越灵活,调试、安全边界和线上可观测性越重要。高性能服务器不是只看峰值,出问题时能不能定位,才决定它能不能进核心链路。
接下来最该盯的不是下一张跑分图,而是四个硬变量:
- Caddyfile 兼容范围能覆盖到什么程度;
- 复杂 TLS、日志、错误处理和可观测性是否够用;
- eBPF 插件的安全边界、调试体验和发布流程是否成熟;
- 从 Caddy 或 nginx 迁移时,哪些配置能直接复用,哪些必须改写。
如果这些问题过不了,跑分再漂亮也只能留在边缘场景。若这些问题逐步补齐,zeroserve 才有机会成为 Caddyfile 用户在高性能反向代理上的真实替代项。
