🔖
nginxとは何なのか
この記事は何?
「nginx実践入門」の第1章「nginxの概要とアーキテクチャ」を読んで、nginxとは何者で何の問題をどのように解決したのかについてまとめたメモです。
私の理解が間違っており誤った内容の記事になっている場合は、その旨を本記事のコメントにて指摘してください。
結論
nginxとは、C10K問題をイベント駆動型のアーキテクチャ、I/O処理の効率化、およびマルチプロセス構成を駆使して解決するために開発されたHTTPサーバである。
従来のHTTPサーバよりも少ないプロセス数で大量の接続を同時に処理できる特徴を持ち、静的コンテンツの配信やWebアプリケーションサーバへのリバースプロキシとして使われる。
C10K問題とは?
- 1台のサーバが同時に1万のクライアント接続を処理する際のスケーラビリティの問題である。
具体的には?
- クライアントの接続要求から始まる一連の処理を各プロセスで1接続ずつ処理する必要があるため大量の接続を同時に処理するためには、大量のプロセスやスレッドを起動する必要がある。
- 例: preforkモデル
- 大量のプロセスを起動することによって、プロセス間コンテキストスイッチのオーバーヘッドが大きくなり、性能が劣化する。
イベント駆動型のアーキテクチャとは?
- イベントが発生するまで待機し、発生したイベントの種類に応じてコールバック関数を実行する
- イベント駆動型HTTPサーバでは複数のクライアントディスクリプタとの出力を発生したイベントごとに並行して行う
- イベント駆動型HTTPサーバは、少ないプロセス数で大量の同時接続をさばける
- つまり、プロセス間コンテキストスイッチのオーバーヘッドが小さくなる
- ただし、発生するイベントにはプログラムがブロックされる可能性があるI/Oが絡むため、I/Oをノンブロッキングまたは非同期で行う工夫が必要
I/O処理の効率化の手法とは?
I/O処理の効率化の手法として、I/O Multiplexing・ノンブロッキングI/O・非同期I/Oがある
I/O Multiplexing
- 複数のファイルディスクリプタを監視し、それらのうちどれが入出力可能になるまでプログラムを待機させる手法
- これによって、複数のクライアントディスクリプタとの入出力を並行して行うことができる
ノンブロッキングI/O
ブロッキングI/O
- プログラム中で実行されるファイルディスクリプタへの入出力処理は、I/O関連のシステムコールがその処理を完了するまでプログラムをブロックすること
ノンブロッキングI/O
- I/O関連のシステうコールによってプログラムがブロックされる見込みの場合やまだ処理できるデータがない場合は即座にエラーを返す。
- つまり、すぐに処理できないディスクリプタとの入出力処理は中断して別のディスクリプタとの入出力処理に映ることでプログラムの並行性を高める
非同期I/O
- 入出力処理が開始されてもプログラムをブロックせず、入出力処理とそれ以外の処理を並行して実行するしくみ
- 先に実行した入出力のエラーや完了をプログラムに通知するためのインターフェースが提供されている
- これを使って、入出力処理でプログラムをブロックせず、それ以外の処理を並行して実行することでプログラムの並行性を高めることができる
マルチプロセス構成(nginxの動作モデル)とは?
nginxはマスタプロセスとワーカプロセスのマルチプロセス構成で稼働する
マスタプロセス
- 1つだけ起動可能で、ワーカプロセスの制御と管理を担う。
- nginxの終了や再起動、設定ファイルの再読み込み時にシグナルを送る。
- マスタプロセスはワーカプロセスのPIDを保持しているため、これに対してシグナルを通して命令するだけで、nginx全体のプロセスを制御できる
ワーカプロセス
- 複数個起動可能で、クライアントからの接続要求に始まる一連の処理をイベント駆動で実行する。
- シングルスレッドで動作するが、I/O MultiplexingやノンブロッキングI/Oを利用して複数のクライアントとの入出力を並行して行う。
Discussion