# nginx **nginx**(エンジンエックス)は、[[C10K問題]] の解法を体現したイベント駆動型 Web サーバ・リバースプロキシ・ロードバランサである。Igor Sysoev が 2004 年にリリース。 ## 設計の核心 - OS が提供する**最高効率のイベント通知機構を自動選択**する — Linux では [[epoll]]、BSD/macOS では [[kqueue]]、Solaris では `/dev/poll`。 - シングルスレッドのイベントループで数万の同時接続を処理。スレッドコンテキストスイッチコストを排除。 - **マスター/ワーカープロセスモデル** — マスターが設定・ソケット管理、複数ワーカーが接続処理を担当。ワーカー数は通常 CPU コア数に一致。 ## [[C10K問題]] との関係 [[C10K-Problem]] に「イベント駆動型の実用実装例」として登場する(記事ではシンプルに言及されている)。nginx は [[C10K問題]] が示した I/O 戦略2(エッジトリガ非ブロッキング I/O)を完全に実装し、Apache の process-per-connection モデルに代わって大規模サービスのデファクト Web サーバとなった。 ## 拡張フレームワークとしての評価 [[@2025__OSDI__Extending Applications Safely and Efficiently]] は、Nginx をリバースプロキシとして用い、ファイアウォール拡張を [[Lua]]、[[WebAssembly]]、[[ERIM]]、[[RLBox]]、[[bpftime]] の各拡張フレームワークで実装して比較した。bpftime はネイティブ Nginx に対して 2% のスループットオーバーヘッドにとどまり、Lua/WebAssembly の 11-12% や ERIM/RLBox の 9-11% と比較して最大 5.5× 低いオーバーヘッドを達成した。Nginx はもともと拡張性を意識して設計されているため、開発時 EIM 仕様の作成が比較的容易であったと報告されている。(Source: [[@2025__OSDI__Extending Applications Safely and Efficiently]]) ## スクリプタブルロードバランサーとしての拡張 [[OpenResty]] は LuaJIT を組み込んだ nginx の C モジュールであり、[[スクリプタブルロードバランサー]] の主要プロジェクトの1つとして、Lua スクリプトによるリクエスト/レスポンス処理フローの変更を可能にする。競合の nginScript(Nginx Inc. による JavaScript 実装)と並び、nginx の宣言型設定言語では表現しづらいアプリケーション認識型ロジック(シャードルーティング・リクエストの一時停止・WAF 等)を高水準言語で追加する手段になっている。(Source: [[@2021__OReillyJapan__SREの探求 - Chapter 25 スクリプタブルロードバランサー]] ch.25 §25.1) ## Unikraft における評価 [[Unikraft]] は nginx を POSIX 互換層から動かす構成と、アロケータ・ネットワークスタックなどを選択する構成の両方で評価した。QEMU/KVM 上の Unikraft は Linux VM より 70〜170%、ネイティブ Linux より 10〜60% 高速で、OSv より約 25%、Lupine より約 50% 高速だった。アロケータ別のゲスト起動時間は bootalloc の 0.49 ms から buddy の 3.07 ms まで変化した。(Source: [[@2021__EuroSys__Unikraft - Fast, Specialized Unikernels the Easy Way]]) ## Fastsocket による短命接続評価 [[@2016__ASPLOS__Scalable Kernel TCP Design and Implementation for Short-Lived Connections]] は nginx を、HTTP Keep-Alive を無効にした短命接続ベンチマークの実アプリケーションとして使った。64 バイト静的ファイルを CPU コア数の 500 倍の同時実行数で要求し、24 コアでは Fastsocket が 475K connections per second、Base Linux 2.6.32 が 178K、Linux 3.13 が 283K となった。(Source: [[@2016__ASPLOS__Scalable Kernel TCP Design and Implementation for Short-Lived Connections]] §4.2.2) Fastsocket の評価は、nginx のイベント駆動モデルだけでなく、その下のカーネル TCP スタックにおける listen table の共有競合と VFS オーバーヘッドが短命接続のスケーラビリティを制限することを示す。(Source: [[@2016__ASPLOS__Scalable Kernel TCP Design and Implementation for Short-Lived Connections]]) ## 関連 - [[C10K問題]] — nginx の設計思想の背景 - [[epoll]] — Linux 上でのバックエンド - [[kqueue]] — BSD/macOS 上でのバックエンド - [[OpenResty]] — LuaJIT を組み込んだスクリプタブルロードバランサー実装 - [[スクリプタブルロードバランサー]] - [[@2021__EuroSys__Unikraft - Fast, Specialized Unikernels the Easy Way]] — ユニカーネル上の nginx 性能評価