Apacheがリクエスト(アクセス)を処理する際、裏側でどのようにプロセスやスレッドを管理するかを決める仕組みをMPM(マルチプロセッシングモジュール)と呼びます。
このMPMの選択を誤ると、アクセスが集中した際にサーバーの物理メモリが枯渇し、最悪の場合はサーバー全体がダウンしてしまう原因になります。
まずは、それぞれの仕組みとメモリ使用量の違いを一覧表で比較してみましょう。
📊 3大MPMのメモリ使用量・特徴比較
| MPMモデル | 管理モデル | メモリ使用量 | 最大の特徴 |
| prefork |
マルチプロセス (シングルスレッド) |
📈 多い | 各接続用に完全に独立したプロセスを生成するため、オーバーヘッドが大きくメモリを大量に消費する。 |
| worker |
マルチプロセス (マルチスレッド) |
⚖️ 中程度 | 1つのプロセス内で複数の「スレッド」を共有して処理するため、preforkより大幅にメモリ効率が良い。 |
| event |
マルチプロセス (イベント駆動スレッド) |
📉 少ない | workerをさらに改良。Keep-Alive(接続維持)時のスレッド無駄遣いを防ぎ、リソース消費を最小化する。 |
🔍 各MPMの詳細メリット・デメリット
それぞれのMPMが、具体的にどのように動き、どのような長所・短所があるのかを深掘りします。
1. prefork(伝統と抜群の安定性)
「1リクエスト=1プロセス」で処理する、最も伝統的なスタイルです。
-
Pros(メリット):
-
高い安全・安定性: 各プロセスが完全に独立しているため、仮に1つのリクエスト処理で不具合(プログラムのクラッシュなど)が起きても、他のプロセスや接続に一切影響を与えません。
-
スレッドセーフ(複数スレッドから同時に触っても安全な設計)になっていない古いPHPモジュール(
mod_phpなど)を動かす場合は、このpreforkが必須になります。
-
-
Cons(デメリット):
-
メモリ消費が非常に大きい: アクセスごとに「重たいプロセス」を丸ごと立ち上げるため、同時アクセスが増えると一気にメモリを食いつぶします。高トラフィックサイトには不向きです。
-
2. worker(軽量なスレッド活用型)
1つの大きな「プロセス」の中で、軽量な「スレッド」をたくさん立ち上げて処理する方式です。
-
Pros(メリット):
-
高いメモリ効率: メモリ空間の大部分をプロセス内で共有できるため、preforkに比べてメモリ消費量を劇的に抑えられます。
-
静的コンテンツ(画像やHTMLファイルなど)がメインのサイトであれば、非常に高速に処理できます。
-
-
Cons(デメリット):
-
Keep-Aliveによるスレッド占有: 通信を高速化するための「Keep-Alive(接続を維持する仕組み)」が有効な場合、何もデータを送受信していない待機時間中もスレッドが占有されたままになり、リソースが無駄になりやすいです。
-
3. event(高トラフィック対応の最新版)
workerをベースに、Keep-Aliveの無駄を徹底的に排除した現代のデフォルト方式です。
-
Pros(メリット):
-
極めて高いメモリ・リソース効率: Keep-Aliveによる接続維持(待機状態)を「専用の監視スレッド」が非同期で一括管理します。実際にデータのやり取り(イベント)が発生した時だけスレッドを割り当てるため、スレッドを無駄に遊ばせることがありません。
-
大量の同時アクセスが集中する高トラフィックサイトでも、省メモリで軽快に動作します。
-
-
Cons(デメリット):
-
workerと同様にマルチスレッド動作であるため、スレッドセーフではないPHPモジュールなどを直接動作させるのには不向きです(※現在主流の「PHP-FPM」などを組み合わせれば何の問題もなく動作します)。
-
💡 あなたのサーバーにはどれを導入すべき?(選択のヒント)
どのMPMを採用するかは、サーバーの目的や構成によってシンプルに選ぶことができます。
安定性を最優先し、昔ながらの方式でPHPモジュール(
mod_php)を直に動かしたい👉
preforkが最適(ただし、メモリ容量は潤沢に用意してください)静的なコンテンツが多く、メモリ効率を重視したい
👉
workerがおすすめアクセス数が非常に多く、今風の高速で省メモリな環境(PHP-FPM構成など)を作りたい
👉
eventがベスト(現代のLinuxサーバー構築における最適解です)
お使いのシステム構成に合わせて最適なMPMを選択し、無駄のないサクサク動くWebサーバーを目指しましょう!
