web-dev-qa-db-ja.com

Apache2でkeepAliveをアクティブにする必要がありますか?

デフォルトのインストールでは、Apache 2にはkeepAliveがオフになっていますが、別のサーバーを見ると、keepAliveモジュールがオンになっています。

では、keepAliveが適切かどうかはどうすればわかりますか?これを構成する良い例はどこにありますか?

25
Gabriel Sosa

すでに2つの良い答えがありますが、おそらく最も重要な現実の問題はまだ言及されていません。

まず、OPはキープアライブとは何かを理解するために、前述の2つの回答と この小さなブログ投稿 を読みたいと思うかもしれません。 (著者は、TCPI/IPが接続が開いている時間が長くなるほど「高速」になることについては詳しく説明していません。それは真実です。持続時間が長い接続は IPウィンドウスケーリング の恩恵を受けますが、効果はありませんファイルが大きい場合、またはbandwith-delay製品が異常に大きい場合を除き、重要ではありません。)

Apacheを使用する場合のHTTPキープアライブに対する大きな問題は、Apacheプロセスをブロックすることです。つまりキープアライブを使用するクライアントは、クライアントが接続を閉じるか、タイムアウトに達するまで、「彼の」Apacheプロセスが他のクライアントにサービスを提供することを防ぎます。 同じ期間に、このApacheインスタンスは他の多くの接続にサービスを提供できた可能性があります。

現在、非常に一般的なApache構成は Prefork MPM およびa PHP/Perl/Pythonインタプリタ、およびアプリケーションコードこの場合、各Apacheプロセスは、数メガバイトのRAM(Apacheがインタプリタとアプリケーションコードにリンク)を占めるという意味で「重い」)。これは、それぞれのブロッキングとともにキープアライブのApacheインスタンスは非効率的です。

一般的な回避策は、異なる構成の2つのApacheサーバー(両方とも同じ物理サーバー、または必要に応じて2つのサーバー)を使用することです:

  • キープアライブをオフにして、動的コンテンツ用にmod_php(または使用するプログラミング言語)を1つ「重い」
  • 静的コンテンツ(画像、css、jsなど)を提供するための最小限のモジュールセットを持つ1つの「軽量」、キープアライブをオン

次に、必要に応じて、動的コンテンツと静的コンテンツのこの分離を拡張できます

  • nginx などの静的コンテンツにイベント駆動型サーバーを使用する。
  • 静的コンテンツにCDNを使用する(静的コンテンツの提供はすべて可能です)
  • 静的および/または動的コンテンツのキャッシュの実装

Apacheのブロックを回避するための別のアプローチは、 Perlbal などのよりスマートな接続処理を備えたロードバランサーを使用することです。

..そして、はるかに。 :-)

31
Jesper M

キープアライブは、場合によっては良い場合もあれば、非常に悪い場合もあります。新しい接続をセットアップする時間と労力を削減しますが、キープアライブタイムアウトの間、サーバーリソースを占有します。例:

  • 多くの小さなオブジェクトを含むページ、ダイヤルアップのクライアント-キープアライブをオンにする必要があります。
  • いくつかの大きなオブジェクトを含むページ-キープアライブは利点になりません。
  • ユニークビジター数が非常に多いサーバー-キープアライブをオフにする必要があります(そうしないと、ソケットとスレッドがキープアライブタイムアウトを待機してメモリに留まり、新しいクライアントにサービスを提供しなくなります)。

ご覧のとおり、KeepAliveTimeoutはサーバーのパフォーマンスの最適化にも大きな役割を果たします。

使用パターンを見て、自分で決めてください。

6
Max Alginin

必ずKeepAlive Onを使用してください。

見る:

http://httpd.Apache.org/docs/2.0/mod/core.html#keepalive

このようにして、単一のTCP=接続がブラウザによって複数のクエリを送信するために再利用されます。通常、Webサイトには多くのコンポーネント(HTMLページ、JavaScriptコード、画像)があります。これらのリソースが同じドメイン内にあるため、同じサーバーでサービスを提供できます。ブラウザが新しいTCP接続を確立する必要がないため、KeepAlive接続によりパフォーマンスが大幅に向上します。

ブラウザは通常、ドメインへの並列接続を約3つ開きます。それでは、サイトに18個のオブジェクトがあるとします。ブラウザは3つの接続を開き、KeepAliveモードを使用して、各接続で6つのオブジェクトをダウンロードします。キープアライブがなければ、18 TCP=接続を開く必要があり、非常に低速です。

ほとんど、またはすべての最新のブラウザーはHTTP/1.1に準拠しているため、これで問題なく動作します。

Squidのような特定のHTTPプロキシはHTTP/1.1に準拠していませんが、いずれにしてもKeepAlive接続の使用を要求します。

0
Yves Junqueira