ウェブサイトを爆速に!nginxのFastCGIキャッシュで100倍以上の処理速度を

2018/08/02 CentOS, Nginx, サーバー構築

nginx-fastcgi-cache-top
前回の記事
>「nginxでPHPの処理速度を簡単にアップする、OPcacheとAPCuのインストール。」
でnginxの環境にPHPアクセラレーターと呼ばれるパッケージ、OPcacheとAPCuの導入までを紹介しました。今回はさらに強力なキャッシュ機能であるFastCGIキャッシュの設定について紹介します。意外にバーチャルホスト環境でFastCGIキャッシュを利用する手順を紹介しているサイトは少ないと思います。是非、参考にしてみて下さい。
nginxにはキャッシュ機能としてPROXYキャッシュとFastCGIキャッシュが用意されています。PROXYキャッシュはウェブの待ち受けが二段階になる構成で、リバースプロキシサーバーを導入するような構成になり、やや複雑になります。FastCGIキャッシュはPROXYキャッシュをウェブサーバー一段階で行う構成で、無駄な通信と処理を必要とせず、シンプルに構成することができます。

スポンサーリンク

なお、FastCGIキャッシュはパッケージ版のnginxでは、機能に含まれているため、追加でパッケージなどをインストールすることが無く利用が可能です。
※CentOS向けパッケージ版のnginxではキャッシュを削除するために利用するモジュール”ngx_cache_purge”が有効になっていません。キャッシュの削除は手動でも可能ですが、頻繁に更新するようなサイトではnginxをソースからインストールすることをお勧めします。(ソースからのnginxインストールは別記事でアップ予定です。)

目次

1.FastCGIキャッシュを設定する環境

FastCGIキャッシュを設定する環境はnginx環境へOPcacheとAPCu(共にPHPを高速化させるためのPHPアクセラレータパッケージ)の導入手順を紹介した記事
>「nginx環境へWordPressをインストールする時の注意点。パーマリンクの設定に気を付ける。」
で紹介していますが、確認の意味で再度纏めておきます。基本的な環境は以下の通りです。

  • OSのバージョンはCentOSで最新のバージョン7.5を利用しています。(2016年7月現在)
  • ウェブサーバーとしてnginx1.15.0がインストールされています。(2018年7月現在、mainline最新版)
  • nginxは基本的な設定が完了して、バーチャルホストが二つ設定されています。
  • バーチャルホストは”www.testdom.com”と”www.testdom2.com”になります。
  • phpとphp-fpmの7.2系がインストールされて、テスト用のwordpressサイトが表示されています。
  • phpアクセラレータとしてOPcacheとAPCuがインストールされています。
  • Let’s Encrypytを利用してHTTPS通信の機能を有効化しています。
  • サーバーはインターネットへ接続されており、グローバルIPアドレスが一つ、割り当てられています。
  • ファイアウォールとしてfirewalldを設定しています。

この環境を前提にFastCGIキャッシュの設定を進めていきます。

1.nginxの設定

本章ではnginxでFastCGIキャッシュを利用するための具体的な設定手順を説明していきます。設定の前提は以下のようになります。

  • バーチャルホスト毎にFastCGIキャッシュを設定
  • WordPress用に特定のページをキャッシュしないように設定

この条件に合わせて設定を行っていきます。

1-1.nginx.confファイルの変更

nginxの設定ファイルはnginx自体の設定を行うための”nginx.conf”ファイルと、バーチャルホストを設定するための”ドメイン名.conf”に分かれています。ファイルは”/etc/nginx/”以下に保存されています。FastCGIキャッシュを利用する為に、まずはnginx.confの変更を行います。

1-1-1.nginx.confファイルのバックアップ

nginx.confの編集前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

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

1-1-2.fastcgi_cache_pathの設定

先ずはバーチャルホスト毎の設定として、FastCGIキャッシュの保存先(キャッシュパス)、ゾーン名とキャッシュキー管理用のメモリサイズ、キャッシュの保存期間を設定します。これは設定ファイル内に記載されている”httpディレクティブ”内に追記する形になります。
以下の設定をhttpディレクティブ内に追記します。本設定はバーチャルホスト”www.testdom.com”用です。実際には運用するバーチャルホスト名に変更して下さい。

fastcgi_cache_pathの各パラメーターは以下のような意味合いを持ちます。

  • fastcgi_cache_path /var/cache/nginx/testdom …キャッシュの保存先。バーチャルホスト毎に異なるパスを指定します。
  • levels=1:2 … levelsパラメーターはキャッシュの構造レベルを指定します。
  • keys_zone=testdom:30m … ゾーン名とキャッシュキー管理用のメモリサイズ。ゾーン名はバーチャルホスト毎に指定します。メモリサイズとしては30メガバイトを保持するように設定しています。
  • max_size=512M … キャッシュの最大サイズになります。このサイズを超えると利用されていないものから削除されていきます。
  • inactive=600m … この時間、アクセスが無いキャッシュを削除します。

上記を追記後、もう一つのバーチャルホスト”www.testdom2.com”用設定を追加します。基本的にはキャッシュパスとキーゾーン名が異なるだけで同じ内容です。以下を追記します。

これでキャッシュの保存先とキーゾーン名の設定は完了です。

1-1-3.fastcgi_cache_key設定

FastCGIキャッシュのためのキーを定義します。このキー情報を用いてユーザーへ渡すファイルを判断しています。GETリクエストとHEADリクエストを別に区別するようにキーを設定します。項目1-1-2.と同様にhttpディレクティブ内に以下を追記します。

これでキャッシュのためのキー設定は完了です。

1-1-4.fastcgi_ignore_headersの設定

特定のヘッダ情報を無視するための設定を行います。httpディレクティブ内に以下を追記します。

1-1-5.fastcgi_cache_use_staleの設定

どのFastCGIからのレスポンスに、保存されているキャッシュの内容を使用するかを指定します。
httpディレクティブ内に以下を追記します。

1-2.設定変更後のnginx.conf

全ての項目を変更後のnginx.confファイルは以下のようになります。

変更点に間違いが無いかを確認します。問題なければ変更したnginx.confファイルを保存してください。

2.バーチャルホストのFastCGIキャッシュ設定

FastCGIキャッシュに対応するために設定が必要なファイルは”/etc/nginx/sites-available”ディレクトリに含まれるバーチャルホスト用の設定ファイル”ドメイン名”.confになります。以下が現状のディレクトリとファイルの構成です。

上記ディレクトリツリー上の”sites-available”ディレクトリに含まれる設定ファイル”www.testdom.com.conf”と”www.testdom2.com.conf”が設定の対象です。

2-1.www.testdom.com.conf設定ファイルのバックアップ

FastCGIキャッシュに関する設定はバーチャルホスト用設定ファイルであるwww.testdom.com.confに行います。先ずはこのファイルをバックアップします。
以下の手順でコピーを行います。

コピーされたバックアップファイルが存在することを確認します。

コピーしたファイル”www.testdom.com.conf.org3”があることが確認できました。

2-2.www.testdom.com.conf 設定ファイルの編集

ファイルのバックアップが完了しましたので”www.testdom.com.conf”を編集していきます。SSLとWordPressパーマリンク対応の設定までが完了している、変更前の設定ファイルの内容は以下のようになります。

上記の記載内容で、変更が必要な部分は、一番下のphpファイルに関する”location ~ \.php$”部分になります。

このlocationディレクティブに、FastCGIキャッシュ用設定を追加します。

2-2-1.FastCGIキャッシュのWordPress用設定

FastCGIキャッシュでは、特に設定しない限り、全てのファイルについてキャッシュを有効化します。WordPressではキャッシュを行うと都合の悪い部分があります。例えばコメント欄や、管理用のページ、クッキーなどがそれにあたります。その為、キャッシュをしないURIについては、”do_not_cache”フラグに1がセットされるように設定し、フラグが1のコンテンツについてはキャッシュを行わないように設定します。
WordPress用の設定として、以下のパラメータをlocationディレクティブに追記します。

2-2-2.バーチャルホスト用のFastCGIキャッシュ用設定

続いてバーチャルホスト用のFastCGIキャッシュ設定を追加します。この設定値は項目1-1-3.で設定したkeys_zoneパラメータと同じものにします。以下が項目1-1-3.で設定したkeys_zone設定です。

上記からkeys_zoneにはパラメーターとして”testdom”が設定されていますので、以下のように追記を行います。

その他のパラメータはキャッシュの有効期限と、ヘッダーにキャッシュの状態を表示するための設定です。設定が完了したらファイルを保存します。

2-2-3.変更後のバーチャルホスト用設定ファイル

変更後の設定ファイル全体は以下のようになります。

これで設定ファイルの変更は完了です。

2-3.www.testdom2.com.conf設定ファイルのバックアップ

FastCGIキャッシュに関する設定はバーチャルホスト用設定ファイルであるwww.testdom.com.confに行います。先ずはこのファイルをバックアップします。
以下の手順でコピーを行います。

コピーされたバックアップファイルが存在することを確認します。

コピーしたファイル”www.testdom2.com.conf.org3”があることが確認できました。

スポンサーリンク

2-3-1.www.testdom2.com.conf 設定ファイルの編集

同じくもう一つのバーチャルホスト用ファイル”www.testdom2.com.conf”を編集していきます。SSLとWordPressパーマリンク対応の設定までが完了している、変更前の設定ファイルの内容は以下のようになります。

この設定を”www.testdom.conf”と同じように変更します。設定項目”fastcgi_cache”のみバーチャルホスト毎の設定に合わせます。
変更が完了したファイルの内容は以下の通りです。

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

設定ファイルの作成と配置が完了したら、間違いや問題がないかを確認します。nginxに”-t”オプションを付けて実行することで設定ファイルの間違いをチェックできます。設定変更後には実行することをお勧めします。
以下のように実行します。

上記のように、”test is successful”と表示されていればファイルには問題ありません。

2-5.設定の有効化

設定ファイルの変更を行った場合には、ファイル再読み込みとして、nginxの再起動が必要になります。systemctlコマンドでnginxを再起動します。

エラーが出力されなければ、正常に再起動は完了しています。これでFastCGIキャッシュ設定の有効化は完了です。

3.FastCGIキャッシュの動作確認

「項目3.設定の有効化」まででFastCGIキャッシュの設定が完了しましたので、ここからは実際にブラウザでサイトへ接続して、正常にFastCGIキャッシュが動作していることを確認していきます。利用しているブラウザはGoogle Chromeになります。

3-1.FastCGIキャッシュの確認 www.testdom.com

Google Chromeのデベロッパーツール(その他のツール=>デベロッパーツール)を起動します。[Network]を選択して、ページのリロードを行って、HTTPヘッダーを確認します。
HTTPヘッダーはコンテンツのをクリックすると、表示されます。Response Headers内にある[X-F-Cache]が”HIT”となっていればFastCGIキャッシュが利用されています。
nginx-fastcgi-3-1
もし[X-F-Cache]が”MISS”となっている場合、キャッシュがありませんので、ページをリロードすることで”HIT”に変わります。同じく[X-F-Cache]が”BYPASS”となっている場合には、キャッシュを利用していません。これはWordPressにログインしたままになってになっていることが殆どです。一旦、WordPressからログオフして、ページをリロードしてみて下さい。
上記のように”www.testdom.com”サイトでは、FastCGIキャッシュが動作していることが確認できました。

3-2.FastCGIキャッシュの接続確認 www.testdom2.com

続いて”www.testdom2.com”でもFastCGIキャッシュを確認します。確認方法は項目3-1.で記載した手順と同じで、ページを取得した際のHTTPヘッダーを確認します。
nginx-fastcgi-3-2
上記のように[X-F-Cache]が”HIT”になっていれば、FastCGIキャッシュは有効になっています。これで確認は完了です。

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

ここまででFastCGIキャッシュの設定と動作確認が完了しました。実際のどの程度、パフォーマンスが向上したかをApacheに付属しているApache Benchコマンド、”ab”で測定してみます。abはApacheを導入すると同時にインストールされます。ここでは環境として、別のサーバーから、FastCGIキャッシュを有効にしたnginxサーバーを測定するようにしています。

4-1.FastCGIキャッシュ設定前のテスト

先ずはFastCGIキャッシュが有効になっていないサーバーに対してテストを行います。(OPcacheとAPCuは有効)abコマンドにはオプションとして”-n”と”-c”を指定します。-nはリクエスト総数を指定します。-cは同時接続数になります。本記事では、リクエスト数と同時接続数をやや増やして、300リクエストを同時接続20ユーザーを前提としてテストを実行しました。
結果は以下のようになりました。
FastCGIキャッシュ 導入前のテスト

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

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

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

4-2.FastCGIキャッシュ設定後のテスト

続いて、同じ条件でFastCGIキャッシュ設定後のnginxサーバーについてテストを行います。本テストにはFastCGIキャッシュが利用されますので、設定前よりパフォーマンスが出ることが期待できます。結果は以下のようになりました。
FastCGIキャッシュ導入後のテスト

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

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

”Time taken~”はテストの所要時間、”Requests per~”は秒間でどれだけのリクエストを処理できたかを示す項目になります。上記から従来の構成では、テストの所要時間は約0.5秒で、1秒間に処理できたリクエストは約570になります。
本テスト環境ではFastCGIキャッシュが有効になっているため、無効の場合と比較して、所要時間で約22倍、リクエスト数は約23倍と大きなパフォーマンス向上が確認できました。
この数値はOPcacheとAPCuを利用していないnginx環境と比較すると100倍以上の差になります。上記の結果からFastCGIキャッシュはウェブサイトを劇的に早くできることが確認できました。

5.キャッシュファイルの削除

FastCGIキャッシュは強力な反面、運用面で困ったことも発生します。WordPressの場合だと、記事を更新や削除を行ったとしても、直ぐには反映されません。これはキャッシュからページを取得しているためです。
その為、更新や削除など編集作業を行って、直ぐに変更を反映させたい場合には、キャッシュファイルをクリアする必要があります。WordPressの場合だと、記事の更新、編集時にキャッシュをクリアしてくれるプラグイン”Nginx helper”が用意されていますが、これはCentOS用のnginxパッケージだと、必要となるモジュール”ngx_cache_purge”が有効になっていないため、利用できません。本章ではパッケージでインストールしたnginxでFastCGIキャッシュ用のクリアを行うための手順を紹介します。

5-1.コマンドによるキャッシュの削除

サーバーへsshでログインできる環境であれば、コマンドでキャッシュファイルを削除する方法がお勧めです。キャッシュファイルは項目1-1-2.で指定した”fastcgi_cache_path”パラメーターに指定されたパスに保存されています。
”www.testdom.com”の場合には、パスとしてパラメーター”/var/cache/nginx/testdom”が指定されています。以下、設定箇所の抜粋です。

この場合、/var/cache/nginx/testdomを削除することでキャッシュをクリアできます。

5-1-1.キャッシュディレクトリの削除

キャッシュの削除は、具体的には以下のように操作を行います。
事前の確認

キャッシュディレクトリの削除

キャッシュディレクトリ削除の確認

上記のようにキャッシュディレクトリが削除されていれば、削除は完了です。

5-1-2.nginxの再起動

削除したキャッシュディレクトリをメモリ上から削除するために、nginxを再起動します。

エラーが出力されなければ、正常に再起動は完了しています。これでFastCGIキャッシュの削除は完了です。WordPress上のサイトを確認して更新や編集が反映されていることを確認して下さい。

5-2.phpスクリプトによるキャッシュの削除

コマンドでの削除以外に、phpスクリプトを作成してキャッシュを削除する方法もあります。本設定はWordPressを利用している前提になりますが、WordPress以外のサイトでもURLからアクセスできるパスに配置していただくことにより利用が可能です。

5-2-1.phpスクリプトの作成

WordPressを利用している前提で、以下の内容のファイルを”wp-admin”以下に作成します。ここではcache_remove.phpとして作成しています。

作成するファイルの内容

ファイルの作成が出来たら、ファイルを保存します。ファイルの保存後に所有者を変更します。

これでphpスクリプトの作成は完了です。

5-2-2.phpスクリプトの実行

作成したphpスクリプトの実行はブラウザから行います。
ブラウザに作成したphpスクリプトのURLを入力します。www.testdom.comサイトの場合は

https://www.testdom.com/wp-admin/cache_remove.php

と入力して、enterキーを押します。
画面にメッセージは表示されませんが、エラーが無ければキャッシュの削除は実行されています。

6.まとめ

nginx環境で動作するWordPressやPHPで作成されたサイトのパフォーマンスを向上するために、最近の記事で二つの方法を紹介してきました。

  • PHPアクセラレータと呼ばれるキャッシュ用機能を利用する方法
  • FastCGIキャッシュを有効にする方法

どちらの方法もパフォーマンスを向上するために有効であることが確認できました。特にFastCGIキャッシュ機能については、効果が絶大で、パフォーマンスが必要なサーバーにnginxを利用している環境では、是非、導入していただくことをお勧めします。
残念ながらCentOSのパッケージ版では、キャッシュを削除するためのモジュールが有効になっていませんが、今後の記事でキャッシュを削除するためのモジュールを利用する方法も紹介していきます。

関連する記事


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

もし、貴社で、

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

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

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

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

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

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

Message

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

  • スポンサーリンク