Apacheには、mpmと呼ばれる動作モードがあります。
最近のApacheでは、デフォルトで”prefork”が指定されているかと思います。
このモードでは、1アクセスごとに1つのApacheプロセスを立ち上げ、ブラウザからサイトへの要求にこたえます。
この方式では、アクセスが増えれば増えるほどApacheのプロセスが増えていくため、大量のアクセスが来るとOSの負荷が増えてしまい、サーバー全体の動作が重くなってしまいます。
一方、MPM動作モードには workerとeventとよばれるものもあります。
これらのモードを使用すると、使用されるプロセス数を節約することができるため、サーバー全体への負荷を少なくすることができます。
ただし、ノンスレッドセーフなモジュールを使用している場合などはそのモジュールは使用できなくなるとのことで、注意が必要です。
さて、このMPMの切り替えですが、OSによっては設定ファイルが分散化されていることがあります。
CentOS 7 の場合は
/etc/httpd/conf.modules.d/00-mpm.conf
にMPMの切り替えが行える記述があるので、ここを変更します。
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
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
内容としては非常に親切で、コメントアウトの付け替え後、Apacheを再起動するだけでMPMの切り替えを行うことができます。
上記の例では、6行目のmpm_prefork(Preforkモード)が有効になっています。
例えば、もしworkerモードを有効にしたい場合は、12行目の
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
の先頭のコメントアウト(#)を外し、先程の6行目の
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
の先頭に#をつければOKです。
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#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
この状態で
sudo apachectl configtest #設定が間違っていないかチェック
sudo systemctl restart httpd #Apache再起動
とすればMPMを切り替えることができます。
・変更前
$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork
threaded: yes (fixed thread count)
forked: yes (variable process count)
...
・変更後
$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
...
Server MPMの部分が切り替わっていることが確認できるかと思います。
素のApacheの場合は元の設定ファイルであるhttpd.confに統合されていたりするので、あらかじめわかりやすく別ファイルに準備されているのはありがたいですね。