1. 概要
「MPM」の設定をデフォルトの「prefork」から、「worker」へ切り替える方法について。
「event」への設定は、基本的に同様の手順になります。
2. 現在の状態
現在の設定状態を見るには、「httpd.conf」を見るのが手っ取り早いのですが、コマンドで見るには・・・。
httpd -V
デフォルトの状態で、下記のように表示されました。
Server version: Apache/2.4.51 (FreeBSD)
Server built: unknown
Server's Module Magic Number: 20120211:118
Server loaded: APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
・・・ 略 ・・・
「Server MPM」の値で「prefork」だと確認できます。
当然、「threaded」が「no」になっているわけです。
3. prefork → worker
vi /usr/local/etc/apache24/httpd.conf
67行目をコメントアウトして、68行目を有効化します。
#LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
#LoadModule mpm_worker_module libexec/apache24/mod_mpm_worker.so
ついでに、まだいじりませんが、495行目を有効化しておきます。
# Server-pool management (MPM specific)
#Include etc/apache24/extra/httpd-mpm.conf
チェックして再起動しようとしたら、チェックの時点で・・・
$ service apache24 configtest
Performing sanity check on apache24 configuration:
[Fri Oct 29 08:33:51.925547 2021] [php:crit] [pid 2354:tid 34374492160] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
AH00013: Pre-configuration failed
うぁ、そうか、「PHP80」にした時点で、何故か、「ZTS」を有効にすると「make」でエラーになったために、「ZTS」を無効にしていましたわ。
(もしや、「Opcache JIT」を有効化したら、こけたのもこれが理由だったのか?)
困ったな・・・ちゅうことで、下記の「ports」の「ZTS」オプションをつけなおして、「make clean」「make」「make reinstall」しなおしました。
/usr/ports/lang/php80
/usr/ports/www/mod_php80
その上で、チェックして再起動。
service apache24 configtest
service apache24 restart
プロセスの状態をみてみますと
$ pgrep -lfa httpd
11178 /usr/local/sbin/httpd -DNOHTTPACCEPT
11179 /usr/local/sbin/httpd -DNOHTTPACCEPT
11180 /usr/local/sbin/httpd -DNOHTTPACCEPT
11181 /usr/local/sbin/httpd -DNOHTTPACCEPT
「prefork」のときより、デフォルトで起動するプロセス数が少し少ないのですね。
親一人、子だくさんの構成は同じです。
設定状態を確認します。
Server version: Apache/2.4.51 (FreeBSD)
Server built: unknown
Server's Module Magic Number: 20120211:118
Server loaded: APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
・・・ 略 ・・・
「Server MPM」「threaded」の値が変わったことが確認できました。
後で、「event」へも切り替えてみましたが、予定通りの結果になりました。
これ、テストマシンでの結果です。
運用マシンで、この設定を変えたときにどうなるか・・・。
パフォーマンスが変わるのか?乞うご期待。
でまぁ、「Apache Bench」で、比べてみると、スピードは、「prefork」とさほど変わらないというか、誤差の範囲で、いささか遅いような気がする・・・。
リソースの消費は抑えられているかもしれないのですが、スピードには、あまり影響がないというか。
ターゲットにしている環境の場合、マシンのスペックや、回線速度の方に問題があって、「MPM」の設定は、あまり影響しないように思われます。