web-dev-qa-db-ja.com

NginxはHTTPリクエストをどのように処理しますか?

Apacheが使用するスレッド駆動型を理解しています。すべての接続でスレッドが開かれ、応答が送信されるとスレッドが閉じられ、他のスレッドのリソースが解放されます。

しかし、Nginxが使用するイベント駆動型のデザインは得られません。イベントドリブンデザインに関するいくつかの基本を読みましたが、nginxがWebリクエストを処理するためにこれをどのように使用するか理解できません。

Nginxがイベント駆動型で接続を処理する方法を読んで理解できるので、スレッド駆動型設計よりもイベントベースの設計を受け入れるだけでなく、なぜそれが優れているのかがわかります。

57

Nginxは Reactor パターンを使用します。基本的に、シングルスレッドです(ただし、複数のコアを利用するために複数のプロセスを分岐できます)。メインイベントループは、OSが準備イベントを通知するのを待ちます。そのデータはソケットから読み取ることができ、その時点でバッファに読み取られて処理されます。単一のスレッドは非常に効率的に数万の同時接続を処理できます(各スレッドに独自のスタックが必要なため、コンテキスト切り替えのオーバーヘッドが非常に大きく、メモリ消費が大きいため、接続ごとのスレッドモデルはこれで失敗します) 。

54
Onestone