zeroserve: 可通过用户态 eBPF 进行脚本化配置的零配置 Web 服务器
zeroserve 是一个高性能、零配置的 HTTPS 服务器,它使用运行在用户态的沙箱化 eBPF 程序取代了传统的声明式配置。通过将路由、身份验证和速率限制合并到单个可脚本化的路径中,它旨在为 Nginx 和 Caddy 中常见的配置层提供一个更透明、更灵活的替代方案。
通过用户态 eBPF 实现“程序即配置"
zeroserve 消除了传统的配置文件。相反,服务器使用 eBPF 程序作为主要的配置手段。任何放置在 .zeroserve/scripts/ 目录下的 .c 文件都会被编译为 eBPF 对象并在每次请求时执行。
为了在不需要内核权限的情况下确保安全性和稳定性,zeroserve 实现了以下架构:
- 用户态执行:脚本通过
async-ebpf运行时(该运行时提供uBPF)运行,这意味着它们在非特权进程中运行,不需要CAP_BPF或内核 BPF 子系统访问权限。 - 内存沙箱:一个“指针笼”(pointer cage)将每次内存访问掩码化到程序自身的区域内,防止脚本读取或写入未授权的内存。
- 可抢占式运行时:为了防止单个缓慢的脚本阻塞事件循环,该运行时是完全可抢占的。一个定时器(默认为 2ms)可以中断 JIT 编译的本地代码并返回控制权给服务器。
- 执行流:脚本按文件名排序顺序执行。它们共享一个每个请求的元数据映射(metadata map),如果脚本调用了
zs_respond或zs_reverse_proxy,则可以短路执行链。
高性能 I/O 与部署
zeroserve 构建在 monoio 运行时之上,利用 io_uring 进行所有网络和磁盘操作。它作为一个单线程事件循环运行,旨在通过在多个 CPU 核心上运行多个进程来实现扩展。
原子 Tarball 部署
服务器直接从单个 tar 文件中提供网站服务。在加载时,zeroserve 会构建一个 path -> byte-range 映射,并针对 tarball 进行字节范围读取,而无需将文件解压到磁盘。这种方法确保了:
- 原子更新:部署新版本只需简单的文件替换,随后发送一个
SIGHUP信号。 - 安全性:文件系统中不存在文档根目录,消除了由于零散的配置规则导致敏感文件泄露的风险。
- 热重载:
SIGHUP会原子地交换网站内容、eBPF 脚本和 TLS 材质,而不会中断连接。
传输安全
服务器通过 BoringSSL 提供全面的 TLS 1.3 实现,具有以下特性:
- 加密客户端问候 (ECH):防止真实的 SNI 在明文中显示。
- JA4 指纹识别:客户端指纹会暴露给 eBPF 脚本以供分析。
- SNI 证书选择:证书从目录中动态选择。
性能基准测试
在 8 核 Ryzen 7 3700X(固定在单个核心)上与 Nginx 1.26 和 Caddy 2.11 进行基准测试,zeroserve 在特定工作负载下表现出显著优势。
静态文件服务
对于小型静态文件 (174 B),zeroserve 实现了 36,681 req/s,优于 Nginx (31,226 req/s) 和 Caddy (12,830 req/s)。对于大文件 (100 KB),zeroserve 和 Nginx 表现相似,吞吐量均达到约 780 MB/s。
脚本化吞吐量 (eBPF vs. Lua)
与使用 LuaJIT 的 Nginx 相比,zeroserve 的 eBPF 脚本(调整为 10ms 抢占间隔)在中间件和动态响应场景下均优于 Lua:
- Header 注入:zeroserve (43,709 req/s) vs. Nginx Lua (28,653 req/s)。
- 动态 JSON 响应:zeroserve (46,945 req/s) vs. Nginx Lua (41,231 req/s)。
反向代理性能
对于小型代理响应 (174 B),zeroserve 实现了 26,486 req/s,比 Nginx (21,761 req/s) 快约 22%。然而,对于大型代理主体 (100 KB),Nginx 仍然表现更优,实现了 585 MB/s,而 zeroserve 为 359 MB/s。
社区洞察与批评
技术用户之间的讨论突出了关于该项目设计和可行性的几个争议点:
"我认为这个赌注下错了——人们更倾向于使用配置而非代码,而且长期以来一直如此。内置功能已经完全满足了大多数人的需求,他们不需要编写 C 代码。"
其他贡献者建议了潜在的改进和技术补充,例如支持 Rust (.rs) 文件作为 eBPF 脚本而非使用 C,以及集成 kTLS 以避免在用户态进行 SSL 泵送。一些用户对该项目的“氛围感编程”(vibe coded)性质以及在公告中使用了 AI 生成的内容表示怀疑,并质疑其软件加固和质量保证的水平。