Apache 2.2系の動作モードについて書きます。
■ Prefork と Worker
Apache 2.2系には動作モードが2種類あります。
Apache にはマルチプロセッシングモジュール(MPM)というものがあって、これを切り替えることで動作モードを切り替えます。
MPM には Prefork と Worker があります。
Preforkモード
これがデフォルト。
マルチプロセス、シングルスレッドモードです。
1接続=1プロセスです。
1人の1アクセスがサーバー上でApacheプロセスを1つ起動します。
もう1回アクセスすると別のApacheプロセスをもう1つ起動します。
Workerモード
マルチプロセス、マルチスレッドモードです。
1接続=1スレッドです。
1プロセスのスレッド数は ThreadsPerChild(デフォルト 25)で指定します。
1人の1アクセスがサーバー上のApacheプロセス内のスレッドを1つ起動します。
もう1回アクセスすると同Apacheプロセスのスレッド上限に余裕があればスレッドをもう1つ起動します。
こちらのほうが圧倒的にメモリ消費は少なくレスポンスのスピードが速いです。
★ただし、マルチスレッドに対応していないApache拡張モジュール(mod_xxxxx)が使えません。
(アクセス数が少ないと正常に使えるように見えますが、アクセス数が増えると誤動作します)
★致命的なのが mod_php で、PHPの php-mbstring や php-mysql がだめです。
★要するに WordPress や EC-CUBE が動かないということです。
(一見動いているように見えるかもしれませんが、そのうち誤動作でデータが消えたりします)
■ Prefork と Worker 切替方法
/etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
デフォルトでは上記の HTTPD がコメントアウトされています。
これをコメント解除すると Workerモードになります。
またコメントアウトすると Preforkモードになります。
設定ファイルを変更したらApacheを再起動します。
/etc/init.d/httpd restart
■ Prefork と Worker 性能比較
PreforkモードとWorkerモードでどのくらいの性能差があるのでしょうか?
客観的な数値データはありません。
経験上、大体のざっくりした話です。
★Preforkモードは1つの基準として同時接続数 100 というのがあります。
Preforkモードだと、CPU2コア メモリ2GBくらいのスペックだと、1サーバーに1ホームページのみの運営で、アクセスが同時に100接続来るとCPU負荷やディスクの遅延がひどくなり大体限界が来ると思います。
同じサーバーで、Workerモードに切り替えると、同時接続数 300~400 くらい大丈夫になります。(もちろんホームページのつくりによります)
ただし mod_php を使う限り、WordPress など PHP を使うブログは運営できません。これが落とし穴です。
では、mod_php を使わず別の方法で PHP を使えば・・・、それはまた別の機会に。