开源项目 zeroserve 近日发布,定位是一款零配置 HTTPS 静态/代理服务器。

它最反常的地方,是站点不用解包。整个站点、脚本和 TLS 材料被打成一个 tar 包,服务器原地索引,再按 byte-range 读取。替换 tar 包后发一个 SIGHUP,就能原子热重载站点、脚本和证书材料。

这不是“nginx 被全面替代”的故事。更准确地说,zeroserve 在试一条更窄的路:把配置文件变成每个请求都会运行的一段程序。

我更在意的是这个变化对工程师的影响。负责静态站点、边缘网关、小 API 入口的人,可以把发布单元收得更小;但负责大文件下载、视频片段、批量导出的团队,不该因为一个新项目就急着迁移。

zeroserve 做了什么:把部署单元压成一个 tar 包

zeroserve 的部署模型很直接:站点是一个 tar 包,不是一个展开后的 document root。服务器启动后建立路径到 tar 内字节范围的映射,文件仍留在 tar 包里读。

这个设计有两个好处。

一是发布更像替换一个不可变包。站点文件、脚本、证书材料在同一个包里,减少了“文件换了、配置没换”“证书路径错了”这类碎片化问题。

二是误暴露文件的风险会变小。传统目录服务里,临时文件、备份文件、隐藏文件如果放错位置,可能被一起端出去。tar 包索引模型至少把入口收窄了。

它支持 TLS 1.3、HTTP/2、ECH、基于 SNI 的证书选择,还会把 JA4 客户端指纹暴露给脚本。对边缘入口来说,这些不是装饰。它们关系到多证书站点、客户端识别和请求级策略。

但“零配置”不要理解成“零代码”。复杂行为仍然要写 eBPF C 脚本。zeroserve 省掉的是 nginx.conf 或 Caddyfile 这类配置文件,不是省掉所有工程判断。

问题nginx/Caddy 常见做法zeroserve 做法更适合谁
站点发布目录、配置、证书分开管理单 tar 包承载站点、脚本、TLS 材料文档站、小型静态站、边缘节点
路由与鉴权配置指令、插件、Lua 或外部服务用户态 eBPF 程序统一处理想把入口逻辑收进一个包的小团队
热重载重载配置,再处理资源一致性替换 tar 包加 SIGHUP 原子切换发布频繁但运维人手少的团队
复杂逻辑依赖既有生态和模块写 eBPF C 脚本能接受新工具链的基础设施工程师

对后端和基础设施工程师来说,最实际的动作不是马上替换 nginx,而是挑一个边界清楚的入口试点:文档站、内部工具、小 JSON API 代理、登录保护、限流。别从大流量下载入口开始。

它和 nginx/Caddy 的差异:用户态 eBPF 是中间件,不是内核魔法

zeroserve 最容易被误读的点,是 eBPF。

这里的 eBPF 不进入 Linux 内核 BPF 子系统,也不需要 CAP_BPF。它运行在普通用户态进程里,由 async-ebpf/uBPF JIT 编译成本机代码。

所以它更像“用 eBPF 指令集做高性能沙箱脚本”,不是 XDP、内核观测、BPF verifier 那套语境。

安全边界也在用户态运行时里。项目使用 JIT、指针隔离、抢占计时器和内存上限来约束脚本。指针隔离限制内存访问范围,抢占计时器避免单个脚本拖死事件循环,默认每个脚本有 256KB 内存上限。

这条路线的吸引力很清楚:一个脚本可以处理路由、鉴权、限流、响应头改写和反向代理。它还能读请求头、改 URI、做 HMAC、解析 JSON、跑 token bucket,甚至用 OIDC 把静态站点挡在 Google 登录之后。

对关注 nginx/Caddy 替代方案的人,这意味着一个选择:如果你现在靠 nginx 配置、Lua、插件和外部鉴权服务拼入口逻辑,zeroserve 可能把链路收短。

对关注 eBPF 沙箱运行时的人,它的意义不在内核能力,而在用户态脚本沙箱。这个方向很有工程味,但也有现实门槛:团队要能写、审、调 eBPF C。不会写脚本的人,拿到的就不是“零配置”,而是另一套学习成本。

目前还看不清的部分,也不能装作已经解决。比如许可证、维护节奏、社区成熟度、调试体验、日志格式、崩溃恢复、多进程编排,这些都需要看项目后续材料和真实部署反馈。生产系统从来不是只跑通请求就算完。

性能要分场景看:小响应强,大响应别硬上

项目给出的基准测试有明确边界。

测试在 Ryzen 7 3700X 上进行,nginx 1.26、Caddy 2.11 和 zeroserve 都绑定单核。wrk 使用 HTTP/1.1 over TLS 长连接,自签证书,结果取三次 10 秒运行的中位数。

这是一组有参考价值的单核对比。它不能外推成“所有生产环境绝对领先”。硬件、连接模型、证书、响应大小、缓冲策略、日志开销、进程模型都会改变结果。

场景zeroserve对照判断
174B 小静态文件36,681 req/snginx 31,226;Caddy 12,830zeroserve 领先
eBPF 动态 JSON 响应46,945 req/snginx Lua 41,231调优后领先
174B 小响应反代26,486 req/snginx 21,761;Caddy 7,683小 API 入口有优势
100KB 大响应反代3,631 req/snginx 5,882;Caddy 4,285nginx 更快

这个表已经把边界说得很明白。

如果你的主要负载是小文件、小 JSON、小响应代理,zeroserve 值得放进试点清单。它的优势来自部署单元更整、每请求脚本更近、单核小响应路径更短。

如果你的网关主要负责搬大响应,nginx 仍是更稳的选择。100KB 大响应反代里,zeroserve 没有赢。大吞吐、缓冲、成熟运维体系,正是 nginx 这类老工具的护城河。

所以迁移动作应该很克制。

负责静态站点和边缘入口的团队,可以先做旁路验证:拿一个低风险站点,把站点 tar 包、TLS 材料和 eBPF 脚本放在一起发布,看热重载、日志、回滚和告警能不能接入现有流程。

负责核心反向代理的团队,更适合观望或只做压测。除非现有痛点正好是配置碎片、插件链路复杂、脚本中间件成本高,否则没必要为了新架构动稳定入口。

接下来最该看的不是跑分还能不能再涨,而是四件事:脚本怎么调试,故障怎么隔离,日志和指标怎么接进现有系统,多实例部署怎么管理。小而利,利在边界;边界不清,就会伤手。