Nginxのアーキテクチャ、動作、および基本設定
Nginx(Engine X)は、Igor Sysoevによって2004年に開発されたオープンソースのHTTPウェブサーバーで、C10k問題(10,000の同時接続を処理する問題)を解決するために作られました。現在、Nginxは単なるウェブサーバーではなく、強力なリバースプロキシ、ロードバランサー、HTTPキャッシュとしても利用されています。
1. Nginxの概要
- Nginxは、HTTPウェブサーバー、リバースプロキシ、ロードバランサー、コンテンツキャッシュ、TCP/UDPプロキシサーバー、メールプロキシサーバーです。
- 柔軟性、優れたパフォーマンス、安定性、リソース消費の低さ、シンプルな設定が特徴です。
- イベント駆動型とノンブロッキングI/Oのメカニズムにより、同時に何千もの接続を効率的に処理します。
2. Nginxアーキテクチャの主要コンポーネント
Nginxアーキテクチャの主要コンポーネント
Masterプロセス:
- Nginxのライフサイクル全体を管理します。
- 設定ファイル(nginx.conf)を読み取り、検証します。
- ワーカープロセスを作成し、起動します。
- システムからのシグナル(再起動、リロード、停止など)を処理します。
- クライアントからのリクエストは直接処理しません。
ワーカープロセス:
- クライアントからのリクエストを処理し、静的コンテンツを提供するか、バックエンドにリクエストを転送します。
- 独立して動作し、イベント駆動型で複数の接続を同時に処理します。
- worker_processesの数は、通常CPUコアの数と一致させてリソースを最大限に活用します。
キャッシュローダープロセス(オプション):
- 再起動時にディスクからメモリにキャッシュコンテンツをロードします。
キャッシュマネージャープロセス(オプション):
- キャッシュのサイズ管理と定期的なクリーンアップを行います。
3. ワーカープロセスの動作
ワーカープロセスはイベント駆動型モデルに従い、epoll(Linux)などのメカニズムを使用して、単一のスレッドで複数の接続を同時に処理します。
A. 初期化とイベント待機
初期化:Masterプロセスによって作成された後、ワーカープロセスはNginxの設定ファイルから情報を読み取り、イベントループを設定して新しい接続、I/Oリクエスト、または処理が必要なタスクを監視します。
イベント待機:ワーカープロセスは、(新しい接続、データの受信、データの書き込み完了など)監視すべきイベントをepoll
メカニズムを使ってシステムに登録します。
B. 接続の処理
epollからのイベント受信:新しいリクエストがクライアントから送信されると、epollはワーカープロセスに通知し、ワーカープロセスはそのイベントを即座に処理します。
接続はブロックしない:ワーカープロセスは、データまたはリソースを待っているときにブロックしません。もしデータがまだ準備できていない場合(例:リクエストのボディが完全に読み込まれていない場合)、ワーカープロセスは一時停止し、他の接続を処理します。
並列処理:各ワーカープロセスは1つのスレッドで実行されますが、イベントループ内でイベントを切り替えながら、何千もの接続を同時に処理することができます。
C. リクエストの処理
リクエスト解析:HTTPリクエストの解析(ヘッダー、メソッド、URLなど)を行い、設定ファイルに基づいて適切な処理を実行します。
タスクの実行:静的コンテンツの提供、バックエンドサーバーへのリクエストプロキシ、またはSSL/TLSの処理を行います。
D. レスポンスの送信
レスポンスの準備:HTTPレスポンスを作成し、ステータスコード、ヘッダー、ボディを設定します。
レスポンスの送信:データをソケット経由で書き込むか、データが大きい場合はチャンク化して送信します。
E. 接続の終了または保持
処理が完了した後、ワーカープロセスは次のリクエストがない場合接続を閉じるか、HTTP keep-aliveが有効であれば接続を保持します。
4. ワーカープロセスの設定
A. ワーカープロセスの設定
設定ファイル:/etc/nginx/nginx.conf(通常、このファイルは/usr/local/nginx/confや/etc/nginx、または/usr/local/etc/nginxにあります)。
worker_processesディレクティブを使って設定(デフォルトはauto = CPUコア数)。
例:
worker_processes auto;
B. ワーカー接続数
各ワーカープロセスは複数の接続を同時に処理できます。
最大同時接続数はworker_connectionsディレクティブで設定します。
例:
worker_connections 1024;
最大接続数の計算式:
最大接続数 = worker_processes × worker_connections
例:
- worker_processes 4;
- worker_connections 1024;
- 最大接続数 = 4 × 1024 = 4096接続。
C. epollの使用(Linux特有)
Linuxシステムでは、イベント処理のパフォーマンスを最適化するためにepollメカニズムを有効にすることをお勧めします。
例:
use epoll;
D. CPUアフィニティ
各ワーカープロセスが特定のCPUコアを使用するように指定して、コンテキストスイッチのコストを削減します。
例:
worker_cpu_affinity auto;
5. 結論
Nginxは、イベント駆動型アーキテクチャと優れた同時接続処理能力を持ち、以下に適しています:
- ウェブサーバー(静的コンテンツ)。
- リバースプロキシサーバー。
- ロードバランサーとキャッシュ管理。
- マイクロサービスアーキテクチャのゲートウェイ。
Nginxのアーキテクチャを理解し、設定を最適化することで、パフォーマンスを向上させ、リソースを削減し、大規模なウェブアプリケーションにおけるシステムの安定性を確保できます。
アドバイス: Nginxを使用している場合、パフォーマンスの監視とチューニングは重要です。Nginx Amplifyや、Prometheus + Grafanaなどのツールが役立ちます。
参考文献:
![]() | Nguyễn Thị Mỹ Phương Developer |