NodeJSグーグルグループからのクロスポスト:
さて、私はあなたの質問に答えるために最善を尽くします:
Nginxは、リクエストのみをプロキシするWebサーバーです。ここで、Nginx + php+fpmまたはNginx+wsgi + rubyを例にとると、同期的に実行されているWebサーバーの前に非同期のイベントWebサーバーがあります。したがって、Nginxは可能な限り多くの接続をaccept()し、それらすべてがキューに入れられます。Nginxからバックエンド同期サーバーへのリクエストは非同期になります。ただし、accept()も実行するバックエンド同期サーバーは接続をキューに入れていません。一度に1つのリクエストのみを処理でき(シングルスレッドであると見なす)、一度に複数のリクエストを処理できます(prefork / fork(slow)/ multithreaded->スレッド作成時間などの独自の欠点があります(スレッドプールで回避できますが、実装するPITA)、コンテキストスイッチ、スレッドデッドロック、
Nginxがヒットしているバックエンドサーバーへのルートが2つあるとします。
/ 404、/login。
/loginルートが多くのI/Oを実行していて、/404に対して別の要求が行われた場合、/ 404ページのレンダリングは、/ loginの要求の完了に依存します(プロセスがブロックされているため)。したがって、基本的に、リクエストへの応答は、I/Oを実行するのに最も時間がかかるリクエストに依存します。そのため、Nginxが非同期でイベントが発生した場合でも、リクエストの応答時間は、終了までに最も時間がかかる1つのリクエストに完全に依存します(原因:同期バックエンドサーバー)。
ここで、NodeJSを例にとると、すべてが非同期でイベントが発生します。ファイル/ネットワークI/Oなどです。したがって、プロセスを妨げるものは何もありません。したがって、前の例では、/loginrouteが多くのI/Oを実行している場合でも、すべて非同期で/404ページがすぐにレンダリングされます。
私の説明は非常に初歩的なものです。しかし、私はそれがあなたにもっと明確さを与えるべきだと思います。