
基本的な質問であれば事前にお詫びしますが、Apache のドキュメントやその他のチュートリアルを読んでもかなり混乱しています。
単一の Apache プリフォーク プロセスが、特定のクライアントのすべての HTTP リクエストを処理するのでしょうか? そう考えていましたが、maxclients を低い数値に減らすと、ページの読み込み時間が極端に遅くなります。これは、問題のサーバー上の唯一のクライアントであるにもかかわらずです。これは、各プロセスが、タイムアウト ウィンドウ内ですべてのリクエストを処理するのではなく、一度に 1 つの HTTP リクエストを処理することを示唆しています。
では、1 つの Web ページを完全に読み込むために 15 個の HTTP リクエストが必要な場合、それを最適に処理するには 15 個の prefork Apache プロセスが必要ですか?
答え1
HTTP プロトコルについて通常考えると、これは問題にならないはずです。
最新のブラウザでは生き続ける接続では、一度に 1 つのリクエストしか伝送できません。その意味では、MaxClients 1
これらの接続内の各リクエストは次のリクエストが開始される前に完了するため、を使用しても影響はありません。
しかし、これは現代のブラウザの別の特徴です。現代のブラウザは複数の接続を使用します。最近では、画像、JavaScript、CSS など 40 個の他のリソースの読み込みを必要とする HTML ページが表示されることがあります。効率の観点から、これらすべてを 1 つのファイルにまとめて 1 つの接続で送信することはあまり意味がありません。代わりに、それらをいくつかの接続 (それぞれが 1 つのファイルのまま) に分割して同時に取得します。
各ブラウザの動作に関する信頼できる情報源を見つけることができませんが、私が見つけられるもの6 つの接続がほぼ正常であることを示しています。ここでサーバーの同時実行性が重要になります。6 つの接続のそれぞれが同時にリソースを要求し、サーバーの観点からは 6 つの異なるクライアントとして機能します。
答え2
mpm_prefork
は 1 つの接続にのみ応答します。Apache がプロセスごとに複数の接続を処理するようにしたい場合は、のようなマルチスレッド MPM を使用する必要がありますmpm_worker
。
現代のブラウザは、パイプライン(複数の同時接続)とキープアライブ(同じ接続上のシリアル化されたリクエスト)を使用して、スループットとネットワーク効率を向上させ、遅延を短縮します。たとえば、Mozilla Firefoxnetwork.http.pipelining
ではnetwork.http.pipelining.maxrequests
、about:config