web-dev-qa-db-ja.com

使用するApache MPMを選択するにはどうすればよいですか?

これは、正しいApache httpd MPMの選択に関する 標準的な質問 です。

Apacheが提供するさまざまなMPM(「worker」、「event」、「prefork」など)の間で少し混乱しています。

それらの主な違いは何ですか?また、特定の展開に最適なものをどのように決定できますか?

273
Tiffany Walker

多数の MPMモジュール (マルチプロセッシングモジュール)がありますが、(少なくとも* nixプラットフォームで)最も広く使用されているのは、主に3つのものです:preforkworker、およびevent。基本的に、これらはApache Webサーバーの進化と、長い(ソフトウェアの観点から)履歴の時間のコンピューティング制約内でHTTPリクエストを処理するためにサーバーが構築されたさまざまな方法を表しています。


prefork

mpm_preforkは..まあ..それはすべてと互換性があります。要求を処理するために多数の子プロセスをスピンオフし、子プロセスは一度に1つの要求のみを処理します。そこにサーバープロセスがあり、アクションの準備ができており、スレッドマーシャリングを処理する必要がないため、実際に処理するだけの場合は、最新のスレッド化されたMPMよりも高速です。一度に1つのリクエスト-ただし、同時リクエストはサーバープロセスが解放されるまでインラインで待機するため、影響を受けます。さらに、prefork子プロセスの数をスケールアップしようとすると、深刻なRAMを簡単に吸い尽くしてしまいます。

スレッドセーフではないモジュールが必要でない限り、preforkを使用することはお勧めできません。

以下の場合に使用します:mod_phpのように、スレッドが使用されると壊れるモジュールが必要です。それでも、FastCGIとphp-fpmの使用を検討してください。

次の場合は使用しないでください:モジュールがスレッドで壊れない。

worker

mpm_workerはスレッドを使用します-これは同時実行性の大きな助けです。ワーカーはいくつかの子プロセスをスピンオフし、次に子プロセスをスピンオフします。 preforkと同様に、いくつかのスペアスレッドは、可能な場合、着信接続を処理するために準備されています。サーバーカウントがpreforkで行うように、スレッド数はメモリ使用量に直接影響しないため、このアプローチはRAMではるかに優しくなります。また、接続は、プリフォークの予備サーバーではなく、空きスレッド(通常は使用可能)を待つだけでよいため、並行性をはるかに簡単に処理します。

次の場合に使用:Apache 2.2または2.4を使用していて、主にSSLを実行している。

次の場合は使用しないでください:互換性のためにpreforkが必要でない限り、実際に失敗することはありません。

ただし、トレッドは接続にアタッチされ、リクエストにはアタッチされないことに注意してください-つまり、キープアライブ接続は常にホールドを維持しますスレッドが閉じられるまで(構成によっては長時間かかる場合があります)。これが私たちが持っている理由です。

event

mpm_eventは、構造的にはワーカーに非常によく似ています。これは、Apache 2.4で「実験的」状態から「安定」状態に移動しただけです。大きな違いは、キープアライブ接続を処理するために専用のスレッドを使用し、実際にリクエストが行われた場合にのみ子スレッドにリクエストを渡すことです(リクエストが完了した直後にそれらのスレッドが解放できるようにします)。これは、必ずしも一度にすべてがアクティブである必要はないが、時々リクエストを行うクライアントの同時実行性や、クライアントのキープアライブタイムアウトが長い場合に最適です。

ここでの例外はSSL接続の場合です。その場合、ワーカーと同じように動作します(接続が閉じるまで、特定の接続を特定のスレッドに接着します)。

次の場合に使用:Apache 2.4などのスレッドを使用していますが、アイドル接続を待機するスレッドを使用したくない場合。誰もがスレッドが好きです!

次の場合は使用しないでください:Apache 2.4を使用していないか、互換性のためにpreforkが必要です。


slowloris 、AJAX、およびサーバーへの6 TCP(もちろんキープアライブを使用した)接続を多重化するのが好きなブラウザーの今日の世界では、同時実行が重要ですサーバーの規模を適切に調整する上で重要な要素です。Apacheの歴史はこの点でそれを制限しており、リソースの使用状況や規模の点でnginxやlighttpdに匹敵することはできませんが、開発チームはは、今日の要求の多い同時実行の世界で依然として関連性のあるWebサーバーの構築に取り組んでいます。

419
Shane Madden

これがgifでどのように機能するかについての良い説明です:

https://www.datadoghq.com/blog/monitoring-Apache-web-server-performance/

簡単に言うと:2.4を使用していて、httpdがリバースプロキシとして必要な場合 (ディスパッチャー)あなたの選択はEvent MPMです

10
Yura

2018年2月の時点で、イベントMPMのApache 2.4ドキュメントには、Apacheをプロキシとして使用すると、2.4.24以降の「改善された接続処理」が設計どおりに機能しないことが記載されています。 制限 セクションを参照してください。

問題は、プロキシとして、ワーカーが応答の終わりがどこにあるかを知ることができず、リスナーに制御を返す前に、応答全体が確認されるまで待たなければならないことです。

このため、Apacheをプロキシとして使用する場合は、ワーカーモデルを使用するのが最適なようです。プロキシ環境でのイベントモデルに利点があるかどうかは、私にははっきりしていませんが、おそらくあります。

6
AndOr

主に、使用するApacheモジュールに依存します。通常、workerがデフォルトの選択ですが、一部の(古い)モジュールはforkを必要とし、preforkに依存しています。

設定がない場合は、OSディストリビューションの優先依存関係を使用することをお勧めします。たとえばUbuntuは、Apache2をインストールするときにデフォルトでmpm-workerをインストールします。

5
Jeroen