httpdの設定
HHVMはFastCGIの環境で動作させるので、httpdの設定を変更し、event_mpmの構成に変更します。
従来、Apacheの主流となるマルチプロセッシングモジュールは「prefork MPM」でしたが、Apache 2.4から「event MPM」が選択できるようになりました。event MPMは、FastCGI方式のphp-fpmと組み合わせることによって、従来のprefork MPM+mod_phpの組み合わせに比べて、メモリ使用量を大きく減らし、同時接続数増加時のパフォーマンス劣化も抑えられるメリットを得られるようになります。
イメージとしては、軽量高速で近年シェアを伸ばしているWebサーバのnginxに近いものです。Apacheがもともと持っている豊富なモジュールや.htaccessによる柔軟な設定制御などのメリットはそのままに、パフォーマンスが大幅に向上するので、この構成は「新しいApache」といっても過言ではないと思います。
「/etc/httpd/conf.modules.d/00-mpm.conf」の編集
mpm_prefork_moduleの行をコメントアウトし、mpm_event_moduleの行のコメントアウトを外します。
[root@CodeZine-CentOS ~]# egrep -e '^#?LoadModule' /etc/httpd/conf.modules.d/00-mpm.conf 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 [root@CodeZine-CentOS ~]# sed -i.orig -e 's/^\(LoadModule mpm_prefork_module\)/#\1/' -e 's/^#\(LoadModule mpm_event_module\)/\1/' /etc/httpd/conf.modules.d/00-mpm.conf [root@CodeZine-CentOS ~]# diff -u /etc/httpd/conf.modules.d/00-mpm.conf.orig /etc/httpd/conf.modules.d/00-mpm.conf --- /etc/httpd/conf.modules.d/00-mpm.conf.orig 2016-04-29 04:10:10.232973523 +0000 +++ /etc/httpd/conf.modules.d/00-mpm.conf 2016-04-29 04:10:22.910061876 +0000 @@ -3,7 +3,7 @@ # 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 +#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server @@ -15,5 +15,5 @@ # 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 +LoadModule mpm_event_module modules/mod_mpm_event.so
「/etc/httpd/conf.d/php.conf」の編集
ファイルの前後を「<ifmodule prefork.c>」「</ifmodule>」で囲みます。
[root@CodeZine-CentOS ~]# mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf.orig [root@CodeZine-CentOS ~]# (echo "<IfModule prefork.c>"; cat /etc/httpd/conf.d/php.conf.orig ; echo "</IfModule>") > /etc/httpd/conf.d/php.conf [root@CodeZine-CentOS ~]# diff -u /etc/httpd/conf.d/php.conf.orig /etc/httpd/conf.d/php.conf --- /etc/httpd/conf.d/php.conf.orig 2015-06-23 21:20:23.000000000 +0000 +++ /etc/httpd/conf.d/php.conf 2016-04-29 04:13:23.856322985 +0000 @@ -1,3 +1,4 @@ +<IfModule prefork.c> # # Cause the PHP interpreter to handle files with a .php extension. # @@ -30,3 +31,4 @@ # php_value session.save_handler "files" php_value session.save_path "/var/lib/php/session" +</IfModule>
「/etc/httpd/conf/httpd.conf」の編集
DirectoryIndexに、index.phpを追加します。
[root@CodeZine-CentOS ~]# sed -i.orig 's/DirectoryIndex index.html/DirectoryIndex index.php index.html/' /etc/httpd/conf/httpd.conf
末尾に、以下のエントリを追加します。
補足
<<EOFのような書き方をヒアドキュメントといいます。Bashでは「> 」のようなプロンプトが表示されます。
[root@CodeZine-CentOS ~]# cat >> /etc/httpd/conf/httpd.conf<<EOF > <IfModule mpm_event_module> > StartServers 2 > MinSpareThreads 25 > MaxSpareThreads 50 > ThreadsPerChild 50 > MaxRequestWorkers 50 > MaxConnectionsPerChild 0 > <FilesMatch \.php$> > SetHandler "proxy:fcgi://127.0.0.1:9000" > </FilesMatch> > </IfModule> > EOF [root@CodeZine-CentOS ~]# diff -u /etc/httpd/conf/httpd.conf.orig /etc/httpd/conf/httpd.conf --- /etc/httpd/conf/httpd.conf.orig 2015-11-19 21:35:27.000000000 +0000 +++ /etc/httpd/conf/httpd.conf 2016-04-29 04:18:45.905569576 +0000 @@ -161,7 +161,7 @@ # is requested. # <IfModule dir_module> - DirectoryIndex index.html + DirectoryIndex index.php index.html </IfModule> # @@ -351,3 +351,14 @@ # # Load config files in the "/etc/httpd/conf.d" directory, if any. IncludeOptional conf.d/*.conf +<IfModule mpm_event_module> + StartServers 2 + MinSpareThreads 25 + MaxSpareThreads 50 + ThreadsPerChild 50 + MaxRequestWorkers 50 + MaxConnectionsPerChild 0 + <FilesMatch \.php$> + SetHandler "proxy:fcgi://127.0.0.1:9000" + </FilesMatch> +</IfModule>
HTTPサーバの再起動による設定の反映
httpd -tで設定が正しいことを確認し、再起動します。
[root@CodeZine-CentOS ~]# httpd -t Syntax OK [root@CodeZine-CentOS ~]# systemctl restart httpd
ベンチマークの取得
Firebugで確認します。25msでした。PHP5.6+APCu/OPCacheにくらべ、ロード時間が33%になりました。
続いて、コンソールからabコマンドでベンチマークをとります。パラメータを変更して、より負荷が高い状態でベンチマークをとることで、値の揺らぎをなくします。
[root@CodeZine-CentOS ~]# ab -n 1000 -c 100 http://localhost/
筆者の環境では51.25でした。PHP 5.6+APCu/OPCacheと比較して2.86倍の値になります。
ベンチマークまとめ
PHPの各バージョンでのベンチマーク結果をまとめました。
1秒当たりの同時アクセス数 | ページのロード時間 | |
---|---|---|
PHP 5.4 | 6.17 | 168ms |
PHP 5.6 | 6.38 | 176ms |
PHP 5.6+APCu/OPCache | 17.86 | 74ms |
PHP 7+APCu/OPCache | 42.18 | 29ms |
HHVM | 51.25 | 25ms |
今回は、KUSANAGIの要素技術の一つであるPHPに焦点を絞って解説しました。次回は、HTTPサーバについて解説していきますので、お楽しみに。
プライム・ストラテジー株式会社では人材を募集しています。KUSANAGIの国内外の主要クラウドプラットフォームでの開発・展開、エンタープライズ案件のPHPなどでのシステム開発やKUSANAGIの導入、運用などに興味のあるかたはぜひご応募ください。