Nginx は、複数のクライアントを処理するために epoll またはその他の多重化手法 (選択) を使用します。つまり、apache とは異なり、リクエストごとに新しいスレッドを生成しません。
selectを使用して、自分のテストプログラムで同じことを複製しようとしました。ノンブロッキング ソケットを作成し、select を使用してサービスを提供するクライアントを決定することで、複数のクライアントからの接続を受け入れることができました。私のプログラムは、単にデータをエコーバックするだけです。小さなデータ転送(クライアントごとに数バイト)では問題なく動作します。
この問題は、クライアントへの接続を介して大きなファイルを送信する必要があるときに発生します。ファイルの読み取りとソケットへの書き込みが完了するまで、すべてのクライアントにサービスを提供するスレッドが1つしかないため、他のクライアントのサービスを再開できません。
この問題に対する既知の解決策はありますか、それともそのようなリクエストごとにスレッドを作成するのが最善ですか?