Apache eventMPMとPHP-FPMでWordPressのパフォーマンスをアップする

apache-fpm-mpm-top

以前の記事で作成したphpとApacheの環境を利用してパフォーマンスを向上するための構成であるApacheのMPMをデフォルトのpreforkMPMからeventMPMへ変更する設定と、PHPをモジュールではなくCGIとして動作させるためのphp-fpmパッケージの導入を説明します。

Open Source
centos-apache-wordpress-install-top2
CentOSに構築したApache環境へ最短でWordPressをインストールする手順

こんにちは、ITエンジニアの小村(@system_kom)です。 昨今のウェブサイトはLAMP(Linux、Apache、MySQL、PHPの頭文字をとってLAMP)で構成されていることが殆どです。 今回は、以前の記事で構築したLAMP環境 ...

MPMはマルチプロセッシングモジュールの略で、簡単に言うとApacheの並列処理に関する挙動の方式になります。MPMはその名の通り、Apacheのモジュールとして提供されており、設定ファイルを変更することで、MPMの変更が可能です。

MPMは主に以下の三つのモジュールがあります。

  • prefork MPM ...安定した通信が可能だが、アクセスが多い場合CPUとメモリを多く使う
  • worker MPM ... マルチスレッドとマルチプロセスのハイブリッド型。preforkに比べてメモリとCPU使用量が少ない
  • event MPM ... Apache2.4系から導入されたマルチスレッドとマルチプロセスのモジュール。CPUとメモリの使用量が少ない

Apacheやyumでインストールしたパッケージの場合、デフォルトではpreforkモジュールが読み込まれるように設定されています。preforkでも運用には問題ありませんが、折角なので、よりサーバー資源が有効に活用できるeventMPMを利用したいと思います。本記事ではサーバーパフォーマンスを向上するためにeventMPMとPHPをCGIとして動作させるFastCGIを利用のphp-fpmパッケージ導入までを紹介します。

1. event MPMの設定とphp-fpmを導入する環境

ApacheのeventMPM設定とphp-fpmをインストールする環境はWordPressの導入手順を紹介した記事

Open Source
centos-apache-wordpress-install-top2
CentOSに構築したApache環境へ最短でWordPressをインストールする手順

こんにちは、ITエンジニアの小村(@system_kom)です。 昨今のウェブサイトはLAMP(Linux、Apache、MySQL、PHPの頭文字をとってLAMP)で構成されていることが殆どです。 今回は、以前の記事で構築したLAMP環境 ...

で紹介していますが、確認の意味で再度纏めておきます。基本的な環境は以下の通りです。

  • OSのバージョンはCentOSで最新(2018年5月現在)のバージョン7.5を利用しています。
  • ウェブサーバーとしてApache2.4.6がインストールされています。
  • Apacheは基本的な設定が完了して、テストページが表示されています。
  • ApacheはHTTPS通信に対応した設定が完了しています。
  • PHP 7.2系をインストールしており、テストページまで表示されています。
  • MariaDBは10系(10.2)をインストールしており、最低限の設定を行っています。
  • サーバーはインターネットへ接続されており、グローバルIPアドレスが一つ、割り当てられています。
  • ファイアウォールとしてfirewalldを設定しています。

この環境を前提にApacheのMPM設定とphp-fpmのインストールを進めていきます。インストールするphp-fpmは以前の記事と同様に7.2系を利用します。(2018年6月時点では7.2.6)

2. Apache(httpd)のMPM設定変更対応

先ずはデフォルトのpreforkMPMで動作しているApacheをeventMPMで動作するように変更します。MPMはApacheのDSO(動的モジュール)として提供されています。以下の手順で設定を行います。

2-1. デフォルトのApacheに設定されているMPMの確認

デフォルトのモジュールとしてpreforkMPMが読み込まれていることを確認します。現在、読み込まれているモジュールの確認はhttpdコマンドに-Mオプションを付けて実行します。

# httpd -M | grep mpm
mpm_prefork_module (shared)

上記の結果から、現状ではpreforkMPMが読み込まれていることが確認できます。この読み込まれているモジュールをeventMPMへ変更します。
※因みにパッケージで導入したApacheはデフォルトでpreforkMPMが読み込まれていますが、ソースコードからインストールしたApacheの場合はデフォルトがeventMPMになっているようです。

2-2. ディレクトリの移動とMPM設定ファイルのバックアップ

MPMの設定は”/etc/httpd/conf.modules.d/”以下にある00-mpm.confファイルで行います。00-mpm.confの設定変更前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

# cd /etc/httpd/conf.modules.d/
# cp -p 00-mpm.conf 00-mpm.conf.org

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

# vi 00-mpm.conf

2-3. MPM設定ファイルの編集

00-mpm.confはMPMとして用意されている3つのモジュールの何れかを読み込むように記載がされています。(2つはコメントアウトされている)デフォルトの設定は以下のように”LoadModule mpm_prefork_module modules/mod_mpm_prefork.so”が有効になっています。

# 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

これを以下のように”LoadModule mpm_event_module modules/mod_mpm_event.so”を有効にするように変更します。
現在、有効になっている”LoadModule mpm_prefork_module modules/mod_mpm_prefork.so”をコメントアウト(#を行頭に付ける)して、”LoadModule mpm_event_module modules/mod_mpm_event.so”からコメントを外します(#を行頭から外す)。以下のように変更します。

# 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

設定ファイルの変更後に、ファイルを保存します。これで設定ファイルの変更は完了です。

2-4. mpm-conf設定ファイルの反映とhttpdの確認

ここまででphpの基本的な設定は完了しました。変更した設定を反映するためにhttpd(Apache)を再起動します。systemctlを以下のように実行します。

# systemctl restart httpd

エラーが出力されなければ、httpdは正常に再起動しています。
再起動後にhttpdのstatusを確認します。

# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2018-05-30 17:15:00 JST; 5 days ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 1601 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 4212 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 1605 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
tq1605 /usr/sbin/httpd -DFOREGROUND
tq4217 /usr/sbin/httpd -DFOREGROUND
mq4218 /usr/sbin/httpd -DFOREGROUND

上記のようにActive項目に”active (running)”に出力されていれば、httpdは正常に再起動していることが確認できます。

2-5. 変更後のMPMの確認

設定ファイル変更後のモジュールとしてeventMPMが読み込まれていることを確認します。現在、読み込まれているモジュールの確認はhttpdコマンドに-Mオプションを付けて実行します。

# httpd -M | grep mpm
mpm_event_module (shared)

結果として”mpm_event_module (shared)”が表示されれば、確認は完了です。ここまでの作業でApacheのMPMをpreforkMPMからeventMPM変更することができました。続いて、php-fpmパッケージの導入を行います。

3. php-fpmの導入

項目2. まででApacheのMPM設定が完了しましたので、ここからはphp側の作業としてphp-fpmパッケージの導入と設定を説明していきます。
php-fpm(FastCGI Process Manager)はphpスクリプトをCGIとして動作させるためのパッケージです。phpにはモジュール版とCGI版があり、通常、Apacheで利用されるものはモジュール版になります。php-fpmはCGI版で、FastCGIは通常のCGIよりパフォーマンスの向上が見込めるものになります。モジュール版と比較して、高負荷なサイトでのパフォーマンスアップを期待できます。本章ではモジュール版のphpからphp-fpmへ切り替える手順を紹介します。

3-1. php-fpmパッケージの情報を確認する。

php-fpmパッケージのインストール前に、パッケージの情報を確認しておきます。php7.2系のphp-fpmはremiレポジトリに含まれるため、確認コマンドの実行時にremiレポジトリを参照するように指定します。

$ yum info --enablerepo=remi,remi-php72 php-fpm

実行結果は以下の通りです。各パッケージの役割などを確認しておくと、インストールするパッケージの意味合いをイメージしやすいと思います。

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* epel: mirrors.tongji.edu.cn
* extras: ftp.riken.jp
* remi: mirror.bebout.net
* remi-php72: mirror.bebout.net
* remi-safe: mirror.bebout.net
* updates: ftp.riken.jp
利用可能なパッケージ
名前 : php-fpm
アーキテクチャー : x86_64
バージョン : 7.2.6
リリース : 1.el7.remi
容量 : 1.7 M
リポジトリー : remi-php72
要約 : PHP FastCGI Process Manager
URL : http://www.php.net/
ライセンス : PHP and Zend and BSD and MIT and ASL 1.0
説明 : PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI
: implementation with some additional features useful for sites of
: any size, especially busier sites.

上記のように7.2系のphp-fpmが表示されることが確認できました。このphp-fpmパッケージをインストールしていきます。

3-2. php-fpmパッケージのインストール

php-fpmパッケージはyumコマンドにinstallオプションを付けることでインストールすることができます。項目3-1. で必要なパッケージの情報が確認できましたので、以下のコマンドでインストールします。

# yum -y install --enablerepo=remi,remi-php72 php-fpm

上記ではyumコマンドに-yオプションを付けることでインストール時の確認応答を省いています。コマンドを実行すると、以下のようにインストールが開始されます。

読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* epel: mirrors.tongji.edu.cn
* extras: ftp.riken.jp
* remi: mirror.bebout.net
* remi-php72: mirror.bebout.net
* remi-safe: mirror.bebout.net
* updates: ftp.riken.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php-fpm.x86_64 0:7.2.6-1.el7.remi を インストール
--> 依存性解決を終了しました。

依存性を解決しました

インストール中:
php-fpm x86_64 7.2.6-1.el7.remi remi-php72 1.7 M

トランザクションの要約

インストール 1 パッケージ

総ダウンロード容量: 1.7 M
インストール容量: 5.1 M
Downloading packages:
php-fpm-7.2.6-1.el7.remi.x86_64.rpm | 1.7 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : php-fpm-7.2.6-1.el7.remi.x86_64 1/1
検証中 : php-fpm-7.2.6-1.el7.remi.x86_64 1/1

インストール:
php-fpm.x86_64 0:7.2.6-1.el7.remi

完了しました!

エラーがなく、”完了しました!”と表示されればphp-fpmパッケージのインストールは完了です。

3-3. インストールされたphp-fpmパッケージの確認

php-fpmがインストールされたことを確認します。インストールされているパッケージはyumコマンドで確認できます。以下のようにyumを実行することで、php-fpmパッケージがインストールされていることを確認します。

# yum list installed | grep php-fpm

出力結果として、以下のphpパッケージが表示されることを確認します。

php-fpm.x86_64 7.2.6-1.el7.remi @remi-php72

上記のパッケージが表示されれば、インストール後のphp-fpmパッケージ確認は完了です。

4. php-fpm設定ファイルの変更

php-fpmは本記事の環境で利用するために、幾つかの設定変更を行う必要があります。本章では設定ファイルの場所と、設定変更が必要な個所について説明していきます。設定の前提条件は以下になります。

  • 動作ユーザーとグループをApacheに合わせてwwwに変更
  • メモリなどのパフォーマンス設定を行う(メモリ1GBと前提)

パフォーマンス設定については、運用環境に合わせて行う必要がありますが、本記事ではサンプルとしてメモリが1GBあるサーバーで動作させることを考えた数値設定を行います。実際には設定値の調整が必要になりますので、参考として考えて下さい。尚、本記事ではパフォーマンス設定の詳細や調整については割愛しています。

4-1. php-fpm設定ファイルのバックアップ

php-fpmの設定は”/etc/php-fpm.d/”以下にある”www.conf”ファイルで行います。www.confの設定変更前に、ファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

# cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

# vi /etc/php-fpm.d/www.conf

4-2. www.conf設定ファイルの変更

バックアップの後、www.confファイルの変更を行います。変更点は以下となります。

4-2-1. php-fpmを動作させるユーザー、グループの設定変更

php-fpmを動作させるユーザーとグループについては、Apache側での設定に合わせる必要があります。本記事で利用している環境では、Apacheの動作ユーザーとグループとしてwwwを設定していますので、www.conf設定ファイルの以下の部分をapacheからwwwに変更します。20行目付近にある設定パラメーター、userとgroupを変更します。具体的には

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www

に変更します。続いてパフォーマンスに関するパラメータを設定します。

4-2-2. pm.max_パラメーターの変更

次にパフォーマンスに関するパラメータの”pm.max_”が付いた各パラメータを変更します。デフォルトでの設定だとメモリを多く使い過ぎてしまうことがありますので、数値をやや低めに設定しています。基本的にはサーバーのスペックやHTTPのリクエスト数に応じて設定を変更する必要がありますので、ここでの設定は参考までに考えて下さい。

まずpm.max_childrenを50から25に変更します。pm.max_childrenは処理を行う子プロセスの最大数で多すぎるとメモリを容量以上に利用しますので、ここでは50から25へ落としています。

;pm.max_children = 50
pm.max_children = 25

pm.start_serversはphp-fpmのサービス開始時に起動される子プロセスの数になります。少し多めに5から10へ変更しています。

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
;pm.start_servers = 5
pm.start_servers = 10

pm.min_spare_serversは待ち状態にあるphp-fpm子プロセスの最小の数値になります。多少、多めに5から10へ変更しています。

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
;pm.min_spare_servers = 5
pm.min_spare_servers = 10

pm.max_spare_serversは待ち状態にあるphp-fpm子プロセスの最大の数値になります。多少、少な目に35から20へ変更しています。

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
;pm.max_spare_servers = 35
pm.max_spare_servers = 20

pm.max_requestsは子プロセスが再起動するまでに実行するリクエスト数です。デフォルトでは0なので再起動しませんが、メモリリークの対応として再起動を行うようにコメントアウトを外します。(500リクエストを実行後に子プロセスが再起動を行う。)

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
;pm.max_requests = 500
pm.max_requests = 500

以上のパラメータを変更後にファイルを保存します。これでphp-fpmの設定ファイル変更は完了です。

5. php-fpmの起動と自動起動設定

ここまででphp-fpmの基本的な設定は完了しましたので、本章ではphp-fpmの起動と起動後の確認、及びphp-fpmの自動起動設定を行います。

5-1. php-fpmの起動と起動後の確認

起動できる状態に設定が完了しましたので、早速php-fpmを起動してみます。systemctlコマンドを以下のように実行します。

# systemctl start php-fpm

上記のようにActive項目に”active (running)”に出力されておりエラーが出力されなければphp-fpmは正常に起動しています。起動後にphp-fpmのstatusを確認します。

# systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since 水 2018-05-30 16:07:08 JST; 9s ago
Main PID: 9780 (php-fpm)
Status: "Ready to handle connections"
CGroup: /system.slice/php-fpm.service
tq9780 php-fpm: master process (/etc/php-fpm.conf)
tq9781 php-fpm: pool www
tq9782 php-fpm: pool www
tq9783 php-fpm: pool www
tq9784 php-fpm: pool www
mq9785 php-fpm: pool www

5月 30 16:07:08 www systemd[1]: Starting The PHP FastCGI Process Manager...
5月 30 16:07:08 www systemd[1]: Started The PHP FastCGI Process Manager.

上記の出力結果から、php-fpmは正常に起動していることが確認できます。これでphp-fpmの起動と確認は完了です。

5-2. php-fpmの自動起動設定

サーバーの再起動や停止の復旧時に、php-fpmが自動的に起動するように設定します。サービスの自動起動を設定するにもsystemctlコマンドを利用します。自動起動は以下のようにsystemctlコマンドを実行します。

# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

エラーが出力されなければ、自動起動の設定は正常に完了しています。
続いて自動起動が設定されたことを確認します。こちらもsystemctlコマンドから確認できます。”is-enabled”オプションを付与して実行します。

# systemctl is-enabled php-fpm
enabled

上記のように”enabled”と表示されれば自動起動は設定されています。これで自動起動の確認は完了です。

6. Apacheの設定変更

php-fpmを導入することでphpがモジュール型からCGI型へ変更されます。これに対応するためにApache側も設定変更を行います。

6-1. httpd.confのバックアップ

httpdの設定は/etc/httpd/conf以下にあるhttpd.confで行います。
httpd.confの編集前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。コピー後、lsコマンドでファイルが存在することを確認します。

# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bkup
# ls
httpd.conf httpd.conf.bkup httpd.conf.org magic

バックアップの完了後、エディタで設定ファイルを開いて変更を行います。本環境ではOSの標準的なエディタである、viエディタを利用しています。

# vi /etc/httpd/conf/httpd.conf

6-2. httpd.confの変更

httpd.confの最下行に以下の記載を追加します。プロセスの起動数など、パフォーマンスに関するパラメータも含まれています。こちらは適宜変更してください。(最初はこのままでも問題ありません。運用や環境に合わせて少しずつ調整することをお勧めします。)
[追記する内容]

# event MPM setting

StartServers 2
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50
MaxRequestWorkers 50
MaxConnectionsPerChild 0

SetHandler "proxy:fcgi://127.0.0.1:9000"

上記の項目を追加した後の設定ファイル抜粋(最下行)は以下のようになります。

# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

# event MPM setting

StartServers 2
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50
MaxRequestWorkers 50
MaxConnectionsPerChild 0

SetHandler "proxy:fcgi://127.0.0.1:9000"

上記の設定追加後、httpd.confファイルを保存します。

6-3. Apacheに読み込まれているphpモジュールの無効化

続いて、デフォルトでモジュール版として読み込まれているphp7のモジュールを無効化します。(読み込まないように)モジュール版の無効化はphpモジュール読み込み用ファイルである”15-php.conf”をリネームします。具体的には以下のようにコマンドを実行します。

# mv /etc/httpd/conf.modules.d/15-php.conf /etc/httpd/conf.modules.d/15-php.conf.org

これでphpモジュールの無効化は完了です。

6-4. Apacheの設定ファイル確認

設定変更を行ったファイルに間違いがないかを確認します。設定ファイルの確認はhttpdに”-t”オプションを付けて実行します。

# httpd -t
Syntax OK

上記のように”Syntax OK”と表示されれば。設定ファイルには問題ありません。これで設定ファイルの確認は完了です。

6-5. 設定ファイル変更の反映

設定ファイルの変更が完了しましたので、変更した設定を反映するためにApacheを再起動します。systemctlコマンドを以下のように実行します。

# systemctl restart httpd

再起動後にhttpdのステータスを確認します。

# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2018-05-30 16:15:10 JST; 5s ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 9849 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Main PID: 9853 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
tq9853 /usr/sbin/httpd -DFOREGROUND
tq9854 /usr/sbin/httpd -DFOREGROUND
mq9855 /usr/sbin/httpd -DFOREGROUND

5月 30 16:15:09 www systemd[1]: Starting The Apache HTTP Server...
5月 30 16:15:10 www systemd[1]: Started The Apache HTTP Server.

Apacheが正常に再起動していることが上記から確認できます。合わせてphpモジュールの無効化を確認します。確認はhttpdコマンドに-Mを付けて実行します。

# httpd -M | grep php
#

上記のようにphpモジュールが表示されなければ、無効化の確認は完了です。これでApache側の設定変更は完了になります。

7. 動作確認

項目6. まででApacheの設定変更とphp-fpmの導入と設定が完了しましたので、ここからは実際にブラウザでサイトへ接続して、正常にApacheとphp-fpmが動作していることを確認していきます。利用しているブラウザはGoogle Chromeになります。

7-1. ブラウザでのphp-fpm確認

ブラウザから動作を確認します。設定したApacheのドキュメントルートに動作確認用のファイルを作成して、ブラウザからアクセスを行います。

7-1-1. 動作確認用ファイルの作成

動作確認用のファイルを作成します。ここではドキュメントルートとして”/home/www/html”が設定されている前提です。ディレクトリを移動します。

# cd /home/www/html
# ls
index.php readme.html wp-blog-header.php wp-config.php wp-includes wp-login.php wp-signup.php
latest-ja.tar.gz wp-activate.php wp-comments-post.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-admin wp-config-sample.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php

インストールしたwordpress用のファイルがありますが、こちらは利用しません。
viコマンドでtest.phpというファイル名を作成します。(index.phpは変更しないように気を付けて下さい。)

# vi test.php

ファイルの内容は以下になります。

変更後にファイルを保存してください。これで動作確認用ファイルの作成は完了です。

7-1-2. ブラウザからのアクセス

ブラウザから先ほど作成したテスト用phpファイルであるtest.phpにアクセスします。
サイトがあるホスト名がwww.testdom.comの場合は以下のようにブラウザに入力します。

https://www.testdom.com/test.php

正常に設定ができている場合、以下のようなphpの情報が画面に表示されます。

httpd-php-fpm-7-1-2

phpinfoの画面から、”Server API”の項目が”fastCGI”になっていることが確認できれば、php-fpmは正常に動作しています。
因みにモジュール版phpを利用している場合は、Server APIは”Apache 2.0 Handler”になっています。

httpd-php-fpm-7-1-2-2

またwordpressの画面が正常に表示されることを確認できれば、確認は完了です。

cetnos-wp-install-8-2

作成したtest.phpは不要になりますので、削除してください。

8. パフォーマンスの比較

ここまででphp-fpmの導入とApacheのeventMPM構成の設定が完了しました。実際のどの程度、パフォーマンスが向上したかをApacheに付属しているApache Benchコマンド、”ab”で測定してみます。abはApacheを導入すると同時にインストールされます。ここでは環境として、別のサーバーから、php-fpmを導入したサーバーを測定するようにしています。

8-1. 従来のApache prefork MPM と PHPモジュール構成

先ずは従来の構成であるpreforkMPMとphpモジュールの構成をテストします。abコマンドにはオプションとして”-n”と”-c”を指定します。-nはリクエスト総数を指定します。-cは同時接続数になります。本記事では100リクエストを同時接続10ユーザーを前提としてテストを実行しました。
結果は以下のようになりました。

# ab -n 100 -c 10 https://www.testdom.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.testdom.com (be patient).....done

Server Software: Apache/2.4.6
Server Hostname: www.testdom.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path: /
Document Length: 53148 bytes

Concurrency Level: 10
Time taken for tests: 17.567 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 5343200 bytes
HTML transferred: 5314800 bytes
Requests per second: 5.69 [#/sec] (mean)
Time per request: 1756.652 [ms] (mean)
Time per request: 175.665 [ms] (mean, across all concurrent requests)
Transfer rate: 297.04 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 16 13.6 14 78
Processing: 292 1700 1098.1 1298 9246
Waiting: 174 1569 798.0 1274 3892
Total: 307 1716 1096.7 1316 9261

Percentage of the requests served within a certain time (ms)
50% 1316
66% 1452
75% 1730
80% 2066
90% 3533
95% 3904
98% 3938
99% 9261
100% 9261 (longest request)

本テストでは以下の項目に注目しました。

  • Time taken for tests: 17.567 seconds
  • Requests per second: 5.69 [#/sec] (mean)

”Time taken~”はテストの所要時間、”Requests per~”は秒間でどれだけのリクエストを処理できたかを示す項目になります。上記から従来の構成では、テストの所要時間は約17.5秒で、1秒間に処理できたリクエストは約5.7になります。

8-2. Apache event MPM と php-fpm(fastCGI)構成

続いてApache event MPMとphp-fpmの構成をテストします。8-1. とテスト条件は同じになります。

# ab -n 100 -c 10 https://www.testdom.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.testdom.com (be patient).....done

Server Software: Apache/2.4.6
Server Hostname: www.testdom.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path: /
Document Length: 53148 bytes

Concurrency Level: 10
Time taken for tests: 13.655 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 5342200 bytes
HTML transferred: 5314800 bytes
Requests per second: 7.32 [#/sec] (mean)
Time per request: 1365.545 [ms] (mean)
Time per request: 136.555 [ms] (mean, across all concurrent requests)
Transfer rate: 382.04 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 12 8.0 13 62
Processing: 256 1325 412.0 1257 4398
Waiting: 136 1281 381.6 1235 4384
Total: 271 1337 411.5 1262 4404

Percentage of the requests served within a certain time (ms)
50% 1262
66% 1400
75% 1430
80% 1456
90% 1531
95% 1623
98% 2869
99% 4404
100% 4404 (longest request)

項目8-1. と同様に以下の数値を確認します。

  • Time taken for tests: 13.655 seconds
  • Requests per second: 7.32 [#/sec] (mean)

上記から従来の構成では、テストの所要時間は約13.6秒で、1秒間に処理できたリクエストは約7.3になります。
このように大きくはありませんが、処理速度が向上していることが確認できました。今後、パラメータなどを詰めていくことにより、更なるパフォーマンスの向上が期待できます。

9. まとめ

今回はサーバー側でのパフォーマンス向上を行うための技術であるeventMPMとphp-fpmの実装を行いました。ページの表示速度はSEOにも影響するため、できる限り早くレスポンスを返すことが必要になります。パフォーマンスを向上するために、一般的なサーバーだとApacheよりもNGINXを利用する環境が多いようですが、折角、Apacheでサーバーを構築したのであれば、Apacheを前提としてやったほうが良いかと考えて、本記事を作成しました。
数値だけ見ると、思ったよりパフォーマンスが上がっていないように見えますが、実際にアクセスすると、かなりの速度向上が体感できます。今後はこの環境にキャッシュ機能のOPCACHEとAPCUを導入し、更に速度を向上したいと思います。

  • この記事を書いた人
rem-profile-photo

レムシステム

レムシステムはPC・サーバー・ネットワークでの業務効率化を主な業務としている会社です。全国に対応しています。

-Apache, CentOS
-