WordPressの高速化に。ApacheのeventMPMとphp-fpmを利用してウェブサイトの速度を向上する。

2018/07/04 Apache, CentOS, Linux, サーバー構築

httpd-mpm-php-fpm-top
以前の記事「CentOSのサーバーへWordPressをインストール。WordPressを理解するにはインストールからがお勧め。」で作成したphpとApacheの環境を利用してパフォーマンスを向上するための構成であるApacheのMPMをデフォルトのpreforkMPMからeventMPMへ変更する設定と、PHPをモジュールではなくCGIとして動作させるためのphp-fpmパッケージの導入を説明します。
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の導入手順を紹介した記事「CentOSのサーバーへWordPressをインストール。WordPressを理解するにはインストールからがお勧め。」で紹介していますが、確認の意味で再度纏めておきます。基本的な環境は以下の通りです。

  • 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オプションを付けて実行します。

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

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

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

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

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

00-mpm.confはMPMとして用意されている3つのモジュールの何れかを読み込むように記載がされています。(2つはコメントアウトされている)デフォルトの設定は以下のように”LoadModule mpm_prefork_module modules/mod_mpm_prefork.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”からコメントを外します(#を行頭から外す)。以下のように変更します。

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

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

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

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

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

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

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

結果として”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レポジトリを参照するように指定します。

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

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

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

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

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

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

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

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

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

上記のパッケージが表示されれば、インストール後の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の設定変更前に、ファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

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

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

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

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

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

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

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

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

スポンサーリンク

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6.Apacheの設定変更

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

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

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

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

6-2.httpd.confの変更

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7.動作確認

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

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

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

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

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

インストールしたwordpress用のファイルがありますが、こちらは利用しません。
viコマンドでtest.phpというファイル名を作成します。(index.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ユーザーを前提としてテストを実行しました。
結果は以下のようになりました。

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

  • 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.とテスト条件は同じになります。

項目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を導入し、更に速度を向上したいと思います。

関連する記事


システムでお困りのお客様

もし、貴社で、

  • サポート切れのサーバやネットワーク機器の入れ替えをしたいが、どうしたらよいかわからない
  • サーバやネットワークの管理を行う社員がいないため困っている
  • 業務に利用している機器のセキュリティが大丈夫か心配
  • 機器の障害で、業務への影響が発生している
  • 社内の要望に対して、どのようなシステムを導入したらよいか解らない

など、サーバーやネットワーク、セキュリティでお悩みの方、新規のシステム導入を検討中の方。
多くのシステム構築を行い、成功させてきた実績をもつ弊社が、その問題を解決します。
お気軽にお問い合わせ頂き、貴社の問題解決にお役立てください。

お問い合わせ・ご相談はこちらから

Facebookでのご購読が便利です。

Twitter・Feedlyでもご購読できます。

Twitterでフォローする Feedlyでフォローする

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  • スポンサーリンク