2026年5月24日
2026年5月24日
ApacheのWorker/Prefork/Eventの違いと選び方|判断の順番と環境別の確認・切り替え手順
Apache の MPM(マルチプロセッシングモジュール)は、PHP の実行方式で選択肢がほぼ決まります。mod_php を使い続けるなら prefork、PHP-FPM に切り替えられるなら event、というのが現在の WordPress サーバーでの基本線です。この記事では、3つの MPM の違いを「選ぶときに効いてくる点」に絞って整理したうえで、判断の順番、Ubuntu・RHEL系・コンテナ・レンタルサーバーといった環境ごとの確認方法と切り替えの注意点を説明します。
MPM ごとの設定値(プロセス数やスレッド数)の具体的な計算は、別の記事で扱っています。
3つのMPMの違いを一言でいうと
MPM は「Apache が接続を受け付けて処理する担当をどう用意するか」を決める部品で、同時に有効にできるのは1つだけです。
- prefork: 1つの接続を1つのプロセスが担当します。スレッドを使わないため、スレッドに対応していないモジュール(代表例が mod_php)でも安全に動きます。代わりにプロセスごとにメモリを消費するので、同時接続が増えるとメモリが先に尽きやすくなります。
- worker: 少数のプロセスの中で多数のスレッドが接続を担当します。prefork よりメモリ効率は良いものの、Keep-Alive で次のリクエストを待っている接続にもスレッドが1つ張り付きます。
- event: worker を土台に、待機中の接続を専用のリスナースレッドへ預け、処理が必要になったときだけ作業用スレッドを割り当てます。Keep-Alive の接続が多いときに、少ないスレッドで多くの接続をさばけます。
worker と event の違いは「待っている接続にスレッドを張り付けるかどうか」です。現在の Apache 2.4 では event が安定しており、worker をあえて選ぶ場面は少なくなっています。
選ぶときの判断の順番
迷ったら、次の順に条件を確認すると結論が出ます。
- PHP をどう動かしているか: mod_php(Apache のプロセス内で PHP を実行する方式)なら、PHP がスレッド安全な形でビルドされていないことが多いため prefork 一択です。PHP-FPM(Apache とは別プロセスで PHP を実行し、FastCGI で受け渡す方式)なら、event を選べます。
- スレッドに対応していないモジュールを使っていないか: mod_php 以外にも、独自のモジュールや古いモジュールにはスレッド対応を前提としないものがあります。
apachectl -Mで読み込んでいるモジュールを一覧し、提供元のドキュメントでスレッド MPM への対応を確認します。 - HTTP/2 を使いたいか: HTTP/2 を提供する mod_http2 は、prefork では実質的に使えません(Apache のバージョンによっては、prefork のとき HTTP/2 を無効にして警告を出す動作になっています)。HTTP/2 を有効にしたいなら event が前提になります。
- メモリに余裕があるか: 小さな VPS で同時接続が多いなら、prefork + mod_php より event + PHP-FPM のほうがメモリの見積もりを立てやすくなります。
逆に、MPM を変えても速くならない場面もあります。WordPress の応答時間の大半は PHP とデータベースの処理で、そこが詰まっているなら MPM を変えても体感はあまり変わりません。MPM の変更が効くのは、主に「同時接続が増えたときにメモリや待ち行列で詰まる」状況です。ページキャッシュやオブジェクトキャッシュの導入と合わせて考えてください。
いま動いているMPMを確かめる
切り替えを考える前に、現在の構成を確認します。
# 組み込まれている、または読み込まれている MPM を表示する
apachectl -V | grep -i mpm
# 読み込まれているモジュールの一覧から MPM と PHP 関連を探す
apachectl -M 2>/dev/null | grep -Ei "mpm|php|proxy_fcgi"
Ubuntu・Debian では apachectl の代わりに apache2ctl でも同じ結果が得られ、a2query -M で有効な MPM を直接表示できます。php_module が出ていれば mod_php、proxy_fcgi_module が出ていて PHP-FPM のサービスが動いていれば PHP-FPM 経由で PHP を実行している可能性が高いです。どちらで動いているかは、WordPress の管理画面の「サイトヘルス」の情報タブで表示される項目からも手がかりが得られます(表示項目は WordPress のバージョンによって異なります)。
環境ごとの確認と切り替えの注意点
切り替えは本番でいきなり行わず、ステージング環境で試してから、アクセスの少ない時間帯に行ってください。作業前に Apache と PHP の設定ディレクトリをバックアップしておきます。
Ubuntu・Debian
Debian 系のパッケージでは、mod_php(libapache2-mod-php 系のパッケージ)を入れると、依存関係で MPM が prefork に切り替わります。PHP-FPM へ移る場合の流れは次のとおりです。パッケージ名とモジュール名に含まれる PHP のバージョンは、環境に合わせて読み替えてください。
sudo apt install php8.3-fpm
sudo a2dismod php8.3 mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo apache2ctl configtest && sudo systemctl restart apache2
MPM の変更は reload ではなく restart が必要です。.htaccess に php_value や php_flag を書いている場合、PHP-FPM に切り替えると 500 エラーになるので、事前に .user.ini か PHP-FPM のプール設定へ移しておきます。
RHEL系(AlmaLinux・Rocky Linux など)
MPM は /etc/httpd/conf.modules.d/00-mpm.conf の LoadModule 行で選びます。使いたい MPM の行だけを有効にし、他はコメントアウトします。RHEL 8 以降の系統では、標準のパッケージ構成で event と PHP-FPM の組み合わせになっていることが多いですが、過去に手動で mod_php を入れた環境もあるため、上の確認コマンドで実際の状態を見てから判断してください。
# /etc/httpd/conf.modules.d/00-mpm.conf(有効にするのは1行だけ)
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
Docker などのコンテナ
PHP の公式イメージのうち Apache 同梱のもの(タグに apache が付くもの)は、mod_php と prefork の組み合わせで作られています。event に変えたい場合は、Apache と PHP-FPM を別コンテナに分ける構成のほうが素直です。同じコンテナ内で MPM だけを変えると mod_php が動かなくなるので注意してください。イメージの構成は更新で変わることがあるため、使うタグのドキュメントと Dockerfile を確認してください。
レンタルサーバー・マネージドホスティング
共用のレンタルサーバーでは、MPM を利用者が選べないのが一般的です。そもそも Apache ではなく LiteSpeed や Nginx を使っている事業者もあります。この場合は MPM ではなく、ホスティング側が提供する PHP のバージョン選択やキャッシュ機能を調整するのが現実的です。
切り替えた後に確認すること
切り替え直後は、次の順に確認します。
apachectl -Vとapachectl -Mで、意図した MPM と PHP の実行方式になっているか- トップページ、投稿ページ、管理画面、ログイン、メディアのアップロードが動くか
- Apache と PHP-FPM のエラーログに新しいエラーが出ていないか(特に 503 は PHP-FPM のソケットや権限の不一致が原因であることが多い)
- ステージングで負荷試験ツール(
abやwrkなど)を使い、切り替え前と同じ条件で応答時間とメモリ使用量を比べる
event に切り替えた後は、Apache 側の MaxRequestWorkers と PHP-FPM 側の pm.max_children の両方が同時処理数の上限になります。Apache だけ増やしても、PHP-FPM の子プロセスが足りなければ待ちが発生するので、両者のバランスを見ながら調整します。mod_status を有効にしておくと、空きワーカーの数を見ながら判断できます。
まとめ
- prefork は1接続1プロセス、worker はスレッドで処理、event は待機中の接続をスレッドから切り離して扱う。
- 判断の順番は「PHP の実行方式 → スレッド非対応モジュールの有無 → HTTP/2 の要否 → メモリ」。mod_php なら prefork、PHP-FPM なら event が基本。
- MPM を変えても PHP やデータベースが遅い場合は速くならない。キャッシュと合わせて考える。
- Debian 系は mod_php を入れると prefork に切り替わる。RHEL系は
00-mpm.confで選ぶ。コンテナとレンタルサーバーは構成の前提が違う。 - 切り替えは restart が必要で、
php_valueの移行と PHP-FPM 側の上限も合わせて見直す。パッケージやイメージの構成は変わることがあるため、記載は目安です(2026年10月現在)。