Zeroserve:eBPF を用いてスクリプト可能なゼロ設定 Web サーバー

2026/06/06 23:59

Zeroserve:eBPF を用いてスクリプト可能なゼロ設定 Web サーバー

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

ゼロサーブ(Zeroserve)は、最小限のセットアップで静的ファイルを配信できる軽量かつ高性能な HTTPS サーバーです。各サイトごとに単一のタールアーカイブのみを用いて動作を開始できます。改行・認証・レート制限・リバースプロキシなどの機能を実装するサンドボックス化されたミドルウェアとしてユーザー空間で動作する eBPF プログラムをサポートしています。パフォーマンスの主な特徴は、io_uring I/O インターフェースと即時コンパイル(Just-In-Time コンパイル)された eBPF スクリプトによる卓越したシングルスレッド速度です。Ryzen 7 3700X ベンチマークでは、小規模ファイルにおいて nginx を約 17% 上回り、Caddy よりも大幅に高性能であることが示されました。そのアーキテクチャはバイナリコードを共有する複数プロセスの並列実行によりスケールし、各インスタンスはシングルスレッドモデルの monoio ランタイムを使用します。BoringSSL を用いた高度な TLS 機能もサポートしており、TLS 1.3、暗号化された ClientHello(ECH)、SNI サーティフィケート選択、JA4 フィンガープリント、および ECH リレーモードを含みます。運用上の利点として、原子スワップ(SIGHUP)によるホットリロードやダウンタイムなしの瞬時の構成更新が可能です。eBPF プログラミングモデルは、ヘッダー操作やテンプレート置換を行うために共有されるパーリクエストメタデータマップを持つ、ファイル名順ソートされたスクリプトチェーンを使用します。ヘルパー関数はリクエスト検査・変異、暗号処理(SHA-256、HMAC、base64)、JSON 処理、トークンバケット方式のレート制限、AWS SigV4、および XChaCha20-Poly1305 クッキーを用いた OIDC ログインをカバーします。デフォルト設定では eBPF インスタンスあたりのメモリ使用量の上限が 256 KB で、他の接続を止めることを防ぐためにプリエンプト間隔は 2 ms に設定されています。この間隔を増やすことで動的レスポンスのスループットをさらに向上させることが可能です。リバースプロキシとしての性能では、プーリングされた io_uring コネクションを用いて小規模応答において最先端の速度を発揮し、大規模ボディにおいては nginx と競合するレベルのパフォーマンスを示します。全体として、このサーバーは Lua や Perl などの遅いインタプリターに依存せず、ユーザー空間内で直接低レイテンシーとより細かいセキュリティ制御を提供します。

本文

zeroserve:設定不要の高速 HTTPS サーバーとは?

zeroserve は、小さな高速かつ設定不要な HTTPS サーバー です。ウェブサイトのアーカイブファイル(tarball)を渡すだけで動作し、HTTP/2 および TLS 1.3 で提供されます。さらに、ホットリロード機能と極めて軽量なメモリフットプリントを備えています。

本稿の核心となる特徴は、アーカイブに eBPF プログラム を追加できる点です。このプログラムはすべてのリクエストごとに、ユーザー空間内でサンドボックス化されたミドルウェアとして実行され、以下の処理が可能になります。

  • リクエストの改ざん・認証・レート制限
  • 必要に応じてアップストリームアプリケーションへの逆プロキシ(ゲートウェイ)

✨ 主要な特徴

zeroserve は Nginx や Caddy の代替手段として設計されていますが、従来の設定言語による複雑さを排した独自の設計思想を持っています。

高速性と効率性

  • 高速: 単一コアにおいて、ほとんどのワークロード(静的ファイル・スクリプト化ミドルウェア・小型代理レスポンス)で Nginx を上回ります。すべて HTTPS 経由です。
  • 効率的な eBPF スクリプティング: スクリプトは JIT コンパイル によりネイティブコードに変換され、ユーザー空間でのサンドボックス化により、各リクエストあたりの実行コストが非常に安価です。
  • プログラム即設定: eBPF プログラムそのものが設定となり、リクエストごとの処理フローを決定します。設定ファイルは存在しません。
  • 通気 io_uring による I/O: ネットワークおよびディスクのすべての操作は高速な io_uring を介して実行されます。
  • 内蔵モダン TLS: TLS 1.3、HTTP/2、Encrypted Client Hello (ECH)、SNI セルティフィケート選択、JA4 フィンガープリントなどを標準搭載しています。
  • 運用のシンプルさ: 単一の tarball から提供でき、
    SIGHUP
    信号でサイト内容や TLS 材料をホットリロードできます。

📌 設計思想の違い 従来のサーバー(Nginx/Caddy)は宣言型設定言語とスクリプト実行環境(Lua など)の 2 層に制御が分割され、追跡が難しくなります。 zeroserve はこれを統合し、eBPF プログラムのみでリクエストライフサイクルを一元管理するアプローチをとっています。


📦 単一の tarball で場所そのまま提供

ウェブサイト全体は単一の

tar
ファイルです。ゼロースERV は読み込み時にこれをインデックス化し、パスとバイト範囲のマッピングを構築します。ディスク展開を行わずにアーカイブそのものからファイルを配信するため、ドキュメントルートが誤って暴露されるリスクがありません。

デプロイは単一の原子的なファイル置換で完了します。

パッケージと起動コマンド

ディレクトリをパッケージ化するには以下のコマンドを使用します。

# 静的ファイルを tarball へパッケージ化
zeroserve --pack ./public > site.tar

# パッケージ化したサイトをサービス開始(0.0.0.0:8080)
zeroserve --addr 0.0.0.0:8080 site.tar

ホットリロードの仕組み

新しいバージョンをデプロイする際は、「tarball を入れ替えて SIGHUP を送信する」という手順のみで済みます。

  • サイト内容、スクリプト、TLS 材料が同じプロセス内で原子的に入れ替えられます。
  • 接続の中断はありません
# プロセスに再読み込みを促す
killall -SIGHUP zeroserve

アーキテクチャと並行性

  • すべての I/O は
    monoio
    ランタイムを介して io_uring を通じて処理されます。
  • 各インスタンスは単一スレッドのエベントループです。
  • 「単一スレッド=制限」というわけではありません。複数のインスタンスが 1 つのサーバーボックス上で心地よく共存できる形状(スケールアウト)に最適です。

💻 ユーザー空間で eBPF を使ってスクリプト化

zeroserve/scripts/
ディレクトリ下の
.c
ファイルは、パッケージ時に
clang
および
llc
によって eBPF オブジェクトに変換され、すべてのリクエストで実行されます。

セキュリティとパフォーマンスの担保

  • ユーザー空間での動作: カーネルの BPF サブシステムや
    CAP_BPF
    の権限は関与しません (
    async-ebpf
    ランタイムが管理)。
  • 厳格なメモリ制約: ポインタケージにより、プログラムがアクセスすべきでないメモリへの読み書きを防ぎます。メモリアクセスはプログラムの専用アリーナに対してマスク処理されます。
  • プリエンプタブル設計: 1 つのスクリプトが遅すぎるのを防ぐため、ランタイムは完全に割り込み可能です。タイマーが実行中に介入し、制御をエベントループに戻します。

プログラミングモデル

  • ソート済みファイル名の順序で実行されるスクリプトのチェーンです。
  • スクリプト内で
    zs_respond
    または
    zs_reverse_proxy
    を呼び出すと、チェーンが短絡(早送り)されます。

例:ヘッダー注入と元データ公開

#include <zeroserve.h>

ZS_ENTRY
zs_u64 entry(void) {
  char peer[64];
  
  // ピアアドレスを取得(失敗時は "unknown")
  if (zs_req_peer(peer, sizeof(peer)) <= 0) zs_strcpy(peer, "unknown");

  // テンプレートパス公開:<zs-meta>visitor</zs-meta> に置換
  zs_meta_set(ZS_STR("visitor"), ZS_STR(peer));
  
  // レスポンスヘッダー(静的ファイル、zs_respond、proxied のすべてに適用)
  zs_meta_set(ZS_STR("zs.response.header.x-served-by"), ZS_STR("zeroserve-ebpf"));
  
  return 0;
}

ヘルパー関数の活用範囲

  • リクエスト検査と変異: メソッド、パス、クエリパラメータ、ヘッダー、ピアアドレスの読み取り・改ざん。
  • 暗号化と符号化: SHA-256、HMAC-SHA256、base64、hex、
    getrandom
    など。
  • JSON 処理: ボディ解析、ドキュメントツリー作成・変異、
    zs_json_respond
    によるレスポンス送信。
  • レート制限: ピア IP や API キーなどをキーとしたトークンバケット(ホットリロード状態維持)。
  • AWS SigV4: S3 などへの署名付き Authorization ヘッダー、プレサイン URL。
  • OIDC ログイン: Authorization Code + PKCE フロー。サーバーステートレスで「Google でログイン」機能を実現可能(セッションは XChaCha20-Poly1305 クッキーにシール)。

動的エンドポイントの作成

ZS_ENTRY
zs_u64 entry(void) {
  char path[64];
  
  // パス "/health" のみ処理対象
  zs_req_path(path, sizeof(path));
  if (zs_strcmp(path, "/health") != 0) return 0;

  // Content-Type 設定と JSON レスポンス送信
  zs_meta_set(ZS_STR("zs.response.header.content-type"), ZS_STR("application/json"));
  zs_respond(200, ZS_STR("{\"status\":\"ok\"}\n"));
  
  return 0;
}

スクリプト実行の制限と制御

  • メモリ制限: デフォルト 256 KB(超過は実行不可)。
  • 時間スライシング: 長時間走るスクリプトをエグゼキュータから時間分割し、迷走を抑制。
  • 無限ループ対策:自身のリクエストのみ停止しますが、プリエンプションタイマーによりサーバー全体への影響を最小化します。

🔒 TLS の完全性

単なる設定不要以上の機能を含みます:

  • TLS 1.3 専用
  • BoringSSL で終端
  • ネイティブ Encrypted Client Hello (ECH) サポート(実際の SNI が平文として出現しない)
  • ディレクトリからの SNI セルティフィケート選択
  • スクリプト公開の JA4 クライアントフィンガープリント
  • 透明な ECH リレーモード(未暗号化ハンドシェイクをアップストリームへ転送)

これほど多くのトランスポートセキュリティ機能を単一のバイナリに搭載するのは画期的です。


⚡ パフォーマンスベンチマーク

環境: Ryzen 7 3700X (8 コア) 条件:

  • zeroserve は設計上単一スレッドのため、公平な比較としてコアあたりパフォーマンスで測定。
  • taskset
    で CPU 固定(Nginx:
    worker_processes 1
    , Caddy:
    GOMAXPROCS=1
    )。
  • wrk -t4 -c100
    を残りのコアから使用し、3 回実行の中央値を取得。
  • HTTP/2ではなく**HTTP/1.1 (TLS 1.3)**での測定(ハンドシェイクコストは Keep-alive で相殺)。

1. 小さな静的ファイル (174 B)

静的サイトの主食に対する比較です。zeroserve は約 17% 高速、p99(尾部遅延)でも優れています。

サーバーリクエスト/秒p99
zeroserve36,6815.4 ms
nginx31,2267.8 ms
Caddy12,83022 ms

2. 大きな静的ファイル (100 KB)

すべて近づくが、zeroserve は io_uring の読み書きパスにより約 780 MB/s で僅かに優れています。TLS による暗号化コストがボトルネックとなり、その分だけ zeroserve が有利になります。

サーバーリクエスト/秒スループットp99
zeroserve8,000782 MB/s22 ms
nginx7,600773 MB/s28 ms
Caddy6,084590 MB/s44 ms

🆚 eBPF vs Lua(Nginx + LuaJIT)との比較

Nginx で一般的な

ngx_http_lua_module
と同等の Lua スクリプトで再実装し、比較を行いました。 zeroserve のデフォルト設定ではスクリプトプリエンプションタイマーが 2 ミリ秒ですが、これを 10 ミリ秒に上げて調整すると eBPF は優位になります。

ヘッダー注入ミドルウェアケース

(静的ファイル配信は継続しつつ、ヘッダー追加のみを行う)

エンジンリクエスト/秒p99
zeroserve eBPF (10 ms)43,7095.1 ms
zeroserve eBPF (2 ms デフォルト)31,3346.7 ms
nginx Lua28,6538.4 ms

全動的 JSON レスポンスケース

(レスポンス全体をスクリプトが生成)

エンジンリクエスト/秒p99
zeroserve eBPF (10 ms)46,9454.5 ms
nginx Lua41,2316.4 ms
zeroserve eBPF (2 ms デフォルト)32,3936.7 ms

結論: 10ms の間隔では、チューニングされた eBPF は両ケースで勝利します。特にミドルウェアケースでは Nginx Lua より約 50% 高速 です。 注釈: デフォルト設定 (2ms) ではスループットが劣化するため、本番環境では

--preempt-timer-interval-ms
を調整(推奨 10ms)して使用します。


🔄 逆プロキシとしての性能

アップストリームへのリクエスト転送における比較です。zeroserve は

zs_reverse_proxy()
でスクリプト層で処理し、プール化された接続を維持します。

公平な比較のため、Nginx も明示的に keep-alive を有効化しました。

1. 小さなレスポンス (174 B) のプロキシ

(API 呼び出しなど) zeroserve はプールの活用によりリードしており、Nginx より約 22% 高速、Caddy は約 3.4 倍です。

プロキシリクエスト/秒p50p99
zeroserve26,4863.3 ms8 ms
nginx21,7614.2 ms10.5 ms
Caddy7,68310.3 ms33 ms

2. 大きなレスポンス (100 KB) のプロキシ

(静的ファイルのキャッシュミスや大型 API レスポンスなど) ここで Nginx のバッファリング性能が光り、リードが逆転します。大規模なデータ転送では Nginx が適していると言えます。

プロキシリクエスト/秒スループット
nginx5,882585 MB/s
Caddy4,285406 MB/s
zeroserve3,631359 MB/s

💾 メモリ効率性

アイドル状態でのメモリ使用量(PSS)は以下の通りです。

  • zeroserve: 約 15 MB
  • Nginx: 約 6 MB
  • Caddy: 約 60 MB

単一インスタンスでは Nginx より多少大きいですが、重要な点は**「スケーラビリティ」**です。 zeroserve はコードページを共有するため、追加プロセスごとに必要な追加メモリはワーキングセット以上に僅かです。複数コアでスケーリングする際のコスト効率は極めて高くなります。


🚀 まとめ

  • ゼロ設定: tarball 1 つで HTTPS サーバーを起動可能。
  • eBPF パワー: ユーザー空間での高速スクリプティングと厳格なセキュリティ。
  • 高速性: 単一コアでも Nginx を凌駕する処理能力。
  • オープンソース: GitHub で公開されており、誰でも試せる。

GitHub でコードをチェックし、実際に環境へ導入することを強くお勧めします!

同じ日のほかのニュース

一覧に戻る →

2026/06/07 4:17

Ntsc-rs ~アナログテレビおよびVHS のアーティファクトを模倣するオープンソースのビデオエミュレーター~

## 日本語翻訳: ntsc-rs は、単純なカラーフィルターではなく、実際の送信符号化の原理に基づいた高度なアルゴリズムを使用して、ヴィンテージ NTSC テレビと VHS テープのアートファクトを本物らしく再現する無料のオープンソースツールです。マルチスレッドおよび SIMD 加速を実現した Rust で構築されており、超標準解像度でもリアルタイムで動画を処理し、ntscQT といった旧来のツールよりも優れたパフォーマンスを発揮します。そのアルゴリズムは composite-video-simulator、zhuker/ntsc、および ntscQT で開発されたものを採用しています。独立したアプリケーション、ウェブプラットフォーム、または Adobe After Effects、Premiere Pro、DaVinci Resolve、Hitfilm、Vegas(すべての OpenFX ソフトウェアと互換性あり)用のプラグインとして利用可能であり、歴史的正确性と現代の効率性を兼ね備えており、クリエイターがリアルなアナログの美学を現代的なワークフローに直接統合できるよう支援します。

2026/06/07 3:35

Meta、AI チャットボットの悪用によるInstagramアカウントの乗っ取りが数千件あったと確認

## Japanese Translation: Metaは、ハッカーがAIチャットボットのバグを悪用し、Instagramのアカウント20,000個以上を乗っ取ったという重大なセキュリティ不備を公表しました。このシステムは、パスワードリセット用として設計されたものの、誤って認証コードを受け取るメールアドレスを登録済みのアカウント所有者に限定せず、任意のメールアドレスに入力した者に送信してしまっていました。これにより、無許可ユーザーが数日以内にして完全なアクセス権を引き渡すことができました。脆弱性は二段階認証を行っていないアカウントを狙い、4月中旬から最近まで活性していました。 この侵害事件は、人工知能(AI)に対する大幅な投資が行われている時期に発生しており、人員削減を踏まえ、イノベーションとセキュリティのバランスに関する懸念が浮上しています。Metaはこの乗っ取られたボットを停止し、コードを修正済みですが、同社は直接メッセージやプロフィール情報など機密データの暴露があったことを認めています。メイン州在住の30人が直接通知を受けたものの、同社は犯罪者がアクセスした個人データ総量について現在把握していないと確認しています。専門家は、この事件がAIの急速な展開に伴う重大なリスクを浮き彫りにしているとし、ユーザーに対して即時にパスワードのリセットと、認証済みチャネル経由での再認証を行ってアカウントのセキュリティを回復するよう求めており、またMetaは同様の再発を防ぐため、現在自社プラットフォーム上の他のチャットボットの調査を進めています。

2026/06/07 0:55

走ることができます

## Japanese 訳文: The Atavist Magazine(第 176 号)のために発行されたバーリー・マイヤーによるこの調査報告書は、ジョン・H・マクキャン三世の犯罪界への生活を開示している。ニュージャージー州サマースポイント市の元市長であり裁判官であった彼は、連邦捜査官が 1984 年 9 月に提示した令状に応じる形で家族と共に米国を脱出し、母であるリーアは娘のエリン(当時 13 歳)とメレディス(当時 10 歳)を学校で下ろして逃亡し、偽名の元にグローバルな流亡を開始させた。マクキャンとそのビジネスパートナーのスティーブ・ヘイグマンは、南米からメキシコを経由して米国へと数トンのコカインを輸送するために、現金での賄賂、プライベートジェット機、チャシードア部の隠されたコンパートメントが装備された改装 Chevrolet ピックアップトラック、そして偽造文書を駆使して大規模なコカイン密輸-ring を運営していた。家族はマヨルカの別荘(「犯罪の海岸」)、ロンドンのホテル、ブリティッシュコロンビア州の牧場、後にワシントン州メアビルスの住宅などを含む豪華な隠れ家に住み続けたが、1986 年頭、サマス、ワシントン州にある国境 crossing で偽造されたカナダ運転免許証所持時に逮捕されるまでであった。連邦陪審団はジョン、リーア、スティーブ・ヘイグマン、サリー・ヘイグマン=マーチンに薬物関連の犯罪で起訴した。妻に対する起訴を回避するために税務犯罪に対して有罪判決を受け入れたマクキャンは、無期懲役(釈放なし)プラス 100 年の刑を受けた。エリンとメレディスは偽造文書の使用により別名の下、イングランドの王立海軍学校で通学した一方、密輸活動は続いていた。スティーブ・ヘイグマンは 1985 年末にカナダのウイストラーで偽造パスポート所持時に逮捕されたが、その真の氏名は天井板の中に埋め込まれていた彼は 1991 年に演出された擬似血出し事象によって拘束から脱出し、その後再捕獲され米国に引渡された。マクキャンはイラン・コントラ問題と中将マヌエル・ノリーガとのつながりを議会に対して証言し、早期釈放を試みた後、1996 年 9 歳でミネアポリスの連邦刑務所病院において白血病により 54 歳の生涯を閉じた。2024 年にエリンは母親リーアのゴミ捨て場から政府文書、陪審団記録、IRS(米国内税务局)面接ノートを含む二つの使用済み銀行箱を救出した。それらの資料には、妻が夫の犯罪について知り、 allegedly コカイン shipments の警護に従事していたことが明らかにされ、またマクキャンを家族の逃亡を組織して自身のイメージを守るためのキャリアの詐欺師として暴露し、娘たちに対して流亡の性質について欺いていたことも浮き彫りになった。リーアの死後、エリンは母親の記憶と和解し、トラウマある幼年期に対する憎悪ではなく感謝を選び取った一方、メレディスは父親の「冒険」叙事に背後にある完全な真実を理解するためにファイルをより深く掘り下げることを決断した。