MPMとは #
MPM(マルチプロセッシングモジュール)は、Apacheでリクエスト処理を制御するモジュールとなります。
このモジュールによって、Apacheがどのようにプロセスやスレッドを利用しリクエストに対応するかといった動作が決まります。
以下は代表的なMPMの種類をまとめた表となります。
MPMの種類 | 処理方式 | 特徴 |
---|---|---|
prefork |
プロセスごとに1リクエスト | 安定しているがメモリ使用量が多い。スレッド非対応モジュールと相性が良い。 |
worker |
プロセス+スレッド | 軽量で高速。スレッドを使って複数のリクエストを同時に処理できる。 |
event |
worker+非同期処理 | keep-alive接続を効率よく処理でき、大量アクセス時にもスケーラブル。 |
詳細につきましては以下の公式ドキュメントをご確認お願いいたします。
MPMの選び方 #
どのMPMを選択するべきかは、Apacheを利用する目的や環境によって異なります。
安定性重視 #
安定した動作を重視する場合や、古いモジュールを使うときは、prefork
が利用されます。
ただし、1つ1つのリクエストに対して別々のプロセスを利用する為、メモリ使用率が高くなる欠点があります。
軽量で高速 #
少ないメモリで効率よく動かしたい場合は、worker
が向いています。
worker
は1つのプロセスの中でたくさんのリクエストを同時に処理する為、prefork
に比べてメモリ使用が抑えられ、パフォーマンスも向上します。
ただし、スレッドに対応していない古いモジュールが利用できない場合などがあります。
大量アクセス向け #
アクセスが多いサイトや、接続を長く保つ(keep-alive
)ような利用を想定する場合は、event
が利用されます。
event
はworker
の改良版となっており、非同期処理によって大量のアクセス時でも効率よく動作するようになっております。
2025年6月時点では多くのLinuxディストリビューションでevent
がデフォルトとして設定されています。
OSとバージョン #
始めに今回使用する環境についてご紹介します。
OSは以下となります。
AlmaLinux release 9.3 (Shamrock Pampas Cat)
Apacheバージョンは以下となります。
httpd -V
Server version: Apache/2.4.57 (AlmaLinux)
利用中のMPMを確認 #
下記コマンドを使用する事で現在使用しているMPMを確認す事が出来ます。
または、一部の古い環境などでは「httpd
」コマンドではなく「apachectl
」となっている場合があります。
httpd -V | grep 'Server MPM'
コマンドの実行結果は以下のように表示されます。
Server MPM: event
この結果から、Apacheは event MPM
を利用している事がわかります。
MPMタイプの変更方法 #
変更方法につては利用しているLinuxディストリビューションにより異なる場合がございます。
本記事はRHEL系(AlmaLinux)OSを基準とした内容となっております。
またrootに相当する権限を保有しておりSELinuxは無効化されている環境を前提としております。
共用レンタルサーバーを利用している場合、一般ユーザーでの設定不可となっております。
1.利用可能なMPMを確認 #
始めに、ApacheにインストールされているMPMモジュールを確認し、目的のMPMが利用可能かどうかをチェックします。
ApacheのMPMモジュールは、Apache本体の一部として .so
ファイルの形式で提供されています。
AlmaLinux環境では、これらのモジュールは通常「/etc/httpd/modules
」に一覧表示されます。
注意点としてこれらは、シンボリックリンクであり、モジュールの実体は「/usr/lib64/httpd/modules/
」に格納されています。
その為、以下のように「ls
」コマンドを実行する事でMPMモジュールを確認する事ができます。
ls /etc/httpd/modules | grep "mod_mpm"
上記実行の結果は以下の通りとなりました。
mod_mpm_event.so
mod_mpm_prefork.so
mod_mpm_worker.so
上記のように表示されている場合、event
、prefork
、worker
の各MPMが利用可能となっております。
2.MPMの指定を変更 #
MPMの指定は以下の設定ファイルにて行われております。
/etc/httpd/conf.modules.d/00-mpm.conf
下記は初期状態の設定ファイル内容となっております。
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines. See the httpd.conf(5) man
# page for more information on changing the MPM.
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so
この結果では「mod_mpm_event.so
」を指定する行のみ有効化されておりその他は無効化されている事が分かります。
今回は例として「Event
」モジュールから「Prefork
」モジュールに変更いたします。
初めに「vim
」コマンドを利用し該当のファイルを開きます。
vim /etc/httpd/conf.modules.d/00-mpm.conf
現在有効化されている「mod_mpm_event.so
」を指定する行を「#
」を利用し無効化します。
LoadModule mpm_event_module modules/mod_mpm_event.so
↓
#LoadModule mpm_event_module modules/mod_mpm_event.so
次に「mod_mpm_prefork.so
」を指定する行から「#
」を削除し有効化します。
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
↓
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
修正後のファイル内容は以下の通りとなります。
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines. See the httpd.conf(5) man
# page for more information on changing the MPM.
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
More than one MPM loaded
」エラーとなるため、必ず1つのみを有効化する必要があります。
3.サービス再起動 #
MPMの設定変更が完了したら、変更を反映させるためにApacheを再起動する必要があります。
まずは設定に問題がないか、以下のコマンドでシンタックスチェックを行いましょう。
httpd -t
正常なら以下のように「Syntax OK」と表示されます。
Syntax OK
もしエラーが表示された場合は、内容に従って設定を修正してください。
エラーのまま再起動すると、Apacheが正常に起動しなくなる恐れがあります。
シンタックスチェックで問題がなければ、以下のコマンドでApacheを再起動します。
systemctl restart httpd
再起動後は、以下のコマンドで起動状況を確認しましょう。
active
(running) と表示されていれば、Apacheは正常に起動しています。
systemctl status httpd
4. 設定変更の反映確認 #
設定変更が正しく反映されているか、以下のコマンドで確認してください。
httpd -V | grep 'Server MPM'
event
から preforkP
に変更した場合は、以下のように表示されれば成功となります。
Server MPM: prefork