Nginxに関する世界観です。
とてもたくさんのアクセス数のあるWebサイトで、高速かつ少ないメモリ使用量で高い並列性と高性能を誇る、最近流行りのサーバー。
Apacheがプロセス・スレッドベースの並列処理を行うのに対して、Nginxはイベント駆動のアプローチを取る。
第三のWebサーバーとして、注目を集めている。
自分の書いたブログ「神々とともに生きる詩人」2021/02/02より。
Apacheなどのプロセス・スレッドベースのサーバでは、接続の数だけプロセスやスレッドを作成する。
一つ一つの接続のリソース消費は微々たるものでも、ものすごく多い接続になるとメモリを食う。
特に、1万接続ぐらいから、不安定になる(C10K問題)が知られている。
これに対してnginxやNode.jsでは、イベント駆動と非同期処理を上手く使う、ノンブロッキングI/Oを採用し、ひとつのプロセスだけで複数の接続を処理する。
イベント駆動で、必要になった時点で、その接続に必要な処理を行う。
このようにすることで、メモリの消費を抑えることができ、ものすごくたくさんの接続でも安定してサービスを提供することができる。
Apacheは、接続が増えるたびにプロセスやスレッドの数を増やす。それぞれの接続の数だけメモリを大きく消費する。
これに対して、NginxやNode.jsでは、プロセスやスレッドはひとつだけのままで、イベントループで接続相手から要求されるごとに非同期でその相手と処理を行う。
このため、軽量かつ消費するメモリの量が少ない。
スクリプト言語の処理を組み込むためには、プロキシサーバとして動作させれば良い。
(NginxとApache HTTP Serverの違いメモ - Qiitaを参考に執筆しました。)
ノンブロッキングI/Oは非同期でひとつのプロセスが複数の接続を処理する方法。
たとえるならば以下のようになる。
方式 | 説明 |
---|---|
プロセスやスレッドベースのサーバ | それぞれの生徒の数だけ控え教師を用意する ただしどんなに頑張っても一万人が限界 |
1プロセスに1接続のブロッキングI/O | ひとりに専属の教師(家庭教師など) |
1プロセスに複数接続のノンブロッキングI/O | 複数の生徒を同時に見るひとりの教師(塾の教師など) |
ノンブロッキングI/OはNginxの他Node.jsなどで取り入れられている。
(絵で見てわかるITインフラの仕組み (DB SELECTION)を参考に執筆しました。)
データ通信を行う際の用語として、データが受信されるまでプログラムが待機する方式のことを「同期式」あるいは「ブロッキング型」と呼ぶ。
これに対して、データが受信されるまでプログラムが待機せず、別の処理に戻って実行を続ける方式のことを「非同期式」あるいは「ノンブロッキング型」と呼ぶ。
(放送大学「コンピュータの動作と管理 ('17)」を参考に執筆しました。)
2023.05.18
以下の書籍が参考になります。
Nginxの参考リンク集。
Wikipedia
Node.jsを参照のこと。
NginxやNode.jsでは、Apacheのようにプロセス・スレッドベースではなく、ひとつのプロセスが一度にたくさんの相手と接続を行いながら、非同期のイベント駆動で必要な時に必要な相手に必要な処理を行う。メモリの使用量が少なく高速。