CentOS7 のデフォルト構成で Apache 2.4 を起動すると、MPM module は prefork で構成されています。
event の方がパフォーマンスが良いようなので、切り替えてみました。
必要なサービスのインストールと常駐
prefork 構成の場合、php を入れればとりあえずは動作しますが、event の場合は、php-fpm(PHP FastCGI Process Manager)を使って PHP を実行しますので、必要なソフトをインストールし、常駐させます。
1 2 3 |
sudo yum install -y php-fpm sudo systemctl start php-fpm sudo systemctl enable php-fpm |
prefork 構成用の設定に適用条件を付加
prefork 構成を全く使う予定がないのであれば、削除しても差し支えないのですが、いつでも切り替えられるように、設定に条件を付けます。
条件を付ける必要があるセクションは、/etc/httpd/conf.d/php.conf の以下の通りです。
1 |
sudo vi /etc/httpd/conf.d/php.conf |
1 2 3 |
<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> |
1 2 |
php_value session.save_handler "files" php_value session.save_path "/var/lib/php/session" |
この二つのセクションに適用条件を付けます。
1 2 3 4 5 |
<IfModule prefork.c> <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> </IfModule> |
1 2 3 4 |
<IfModule prefork.c> php_value session.save_handler "files" php_value session.save_path "/var/lib/php/session" </IfModule> |
あるいは、全体に条件を付けます。どちらでも良いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<IfModule prefork.c> # # Cause the PHP interpreter to handle files with a .php extension. # <FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch> # # Allow php to handle Multiviews # AddType text/html .php # # Add index.php to the list of files that will be served as directory # indexes. # DirectoryIndex index.php # # Uncomment the following lines to allow PHP to pretty-print .phps # files as PHP source code: # #<FilesMatch \.phps$> # SetHandler application/x-httpd-php-source #</FilesMatch> # # Apache specific PHP configuration options # those can be override in each configured vhost # php_value session.save_handler "files" php_value session.save_path "/var/lib/php/session" </IfModule> |
event 構成用の設定ファイルの作成
event 構成用の設定ファイルを作成します。
1 |
sudo vi /etc/httpd/conf.d/mpm_event.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# event MPM setting <IfModule mpm_event_module> AddType text/html .php DirectoryIndex index.php StartServers 2 MinSpareThreads 5 MaxSpareThreads 10 ThreadsPerChild 10 MaxRequestWorkers 10 MaxConnectionsPerChild 0 <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </IfModule> |
各パラメータでチューニングを行うことができます。サーバ性能や環境に応じて適切に設定する必要があります。
各パラメータについては、こちらのサイトが詳しく書かれています。
Apache HTTP Server: MPMパラメータ チートシート
prefork から event へ切り替え
/etc/httpd/conf.modules.d/00-mpm.conf を編集して、prefork から event へ切り替えます。
1 |
sudo vi /etc/httpd/conf.modules.d/00-mpm.conf |
以下の行をコメントアウトします。
1 |
##LoadModule mpm_prefork_module modules/mod_mpm_prefork.so |
以下の行をアンコメントします。
1 2 |
#LoadModule mpm_event_module modules/mod_mpm_event.so LoadModule mpm_event_module modules/mod_mpm_event.so |
Apache の再起動と確認
現在の設定を確認します。
1 2 |
sudo httpd -M |grep mpm_ mpm_prefork_module (shared) |
Apache を再起動します。
1 |
sudo systemctl restart httpd |
設定が反映されたか確認します。
1 2 |
sudo httpd -M |grep mpm_ mpm_event_module (shared) |
依存関係の設定
このままでも問題はないと思いますが、php-fpm がこけたときに httpd もこけるように依存関係を設定します。
1 |
sudo vi /etc/systemd/system/multi-user.target.wants/httpd.service |
Requires=php-fpm.service を追加します。
1 2 3 4 5 6 |
[Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Requires=php-fpm.service Documentation=man:httpd(8) Documentation=man:apachectl(8) |
同じく httpd がこけたときに、php-fpm もこけるように設定します。
1 |
sudo vi /etc/systemd/system/multi-user.target.wants/php-fpm.service |
Requires=httpd.service を追加します。
1 2 3 4 |
[Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target Requires=httpd.service |