← На главную

zeroserve на eBPF без конфигов быстрее nginx

06.06.2026 14:59 · hackernews

Вот подробный пересказ статьи, написанный в соответствии с вашими правилами.

zeroserve — маленький и быстрый HTTPS-сервер без конфигов. Вы отдаёте ему tar-архив с сайтом, и он раздаёт его через HTTP/2 и TLS 1.3, с горячей перезагрузкой и минимальным потреблением памяти. Главная фишка: внутрь tarball можно положить eBPF-программы. Они работают как промежуточное ПО на каждый запрос, прямо в userspace, в песочнице — переписывают заголовки, авторизуют, ограничивают частоту запросов или проксируют на бэкенд.

Идея в том, чтобы заменить декларативные конфиги nginx или Caddy на одну программу. В zeroserve нет конфигурационного файла. eBPF-скрипт и есть вся конфигурация. Он видит каждый запрос и решает, что делать: роутинг, заголовки, аутентификация, лимиты, прокси.

Весь сайт лежит в одном tarball. zeroserve индексирует его при загрузке и раздаёт файлы, читая нужные байты прямо из архива. Ничего не распаковывается на диск. Для деплоя новой версии достаточно заменить tarball и послать SIGHUP — смена сайта, скриптов и TLS-сертификатов происходит атомарно, без разрыва соединений.

Вся работа с сетью и диском идёт через io_uring (через рантайм monoio). Каждый экземпляр — однопоточный event loop. Это сделано намеренно: единицей масштабирования выступает «ещё один процесс».

eBPF-скрипты живут в папке .zeroserve/scripts/. Они компилируются в байт-код eBPF и работают внутри обычного непривилегированного процесса — ядро и CAP_BPF не нужны. async-ebpf JIT-компилирует этот байт-код в нативный машинный код. Безопасность обеспечивает «клетка указателей»: каждый доступ к памяти замаскирован в собственную арену скрипта. Если один скрипт зависает, он не блокирует остальные запросы — рантайм полностью вытесняющий, таймер прерывает выполнение.

У скриптов богатый API. Можно читать метод, путь, заголовки, IP клиента. Можно переписывать URI. Доступны SHA-256, HMAC, base64, JSON, лимиты запросов с token bucket, AWS SigV4 и даже полный OIDC-флоу для входа через Google. Динамический эндпоинт — это просто скрипт, который вызывает zs_respond.

В тестах на одном ядре zeroserve обгоняет nginx на мелких статических файлах: 36 681 запрос/с против 31 226. На крупных файлах (100 КБ) все три сервера близки — около 780 МБ/с, zeroserve чуть впереди. Скриптинг на eBPF с предустановленным интервалом прерывания 10 мс быстрее, чем nginx Lua: 43 709 запросов/с против 28 653 на middleware-задаче, и 46 945 против 41 231 на динамическом JSON. В режиме reverse-proxy на маленьких ответах zeroserve на 22% быстрее nginx (26 486 против 21 761), но на больших телах nginx вырывается вперёд.

В простое один экземпляр zeroserve потребляет ~15 МБ PSS — больше, чем nginx (~6 МБ), но меньше, чем Caddy (~60 МБ). Код открыт на GitHub.

Читать оригинал →