CentOSのNginxにFastCGIキャッシュを設定してサイト速度を100倍にする

nginx-fastcgi-setting-img

こんにちは、ITエンジニアの小村(@system_kom)です。

前回の記事でnginxの環境にPHPアクセラレーターと呼ばれるPHPにキャッシュ機能を追加するパッケージ「OPcache」「APCu」の導入までを紹介しました。

Open Source
nginx-php-cache-img
Nginxのパフォーマンスを手軽にアップできるPHPキャッシュ OPcacheとAPCuをインストール

こんにちは、ITエンジニアの小村(@system_kom)です。 前回の記事ではNginx環境へWordPressを導入するための手順と注意点を紹介しました。 今回はNginx環境を利用してPHPを高速化するためのキャッシュ機能を提供するパ ...

今回はさらにNginxの強力なキャッシュ機能であるFastCGIキャッシュの設定について紹介します。バーチャルホスト環境でFastCGIキャッシュを利用する手順を紹介しているサイトは意外に少ないと思います。是非、参考にしてみて下さい。

nginxにはキャッシュ機能としてプロキシキャッシュFastCGIキャッシュが用意されています。

PROXYキャッシュはウェブの待ち受けが二段階になる構成で、リバースプロキシサーバーを導入するような構成になり、やや複雑になります。FastCGIキャッシュはプロキシキャッシュをウェブサーバーで行う構成で、無駄な通信と処理を必要とせず、シンプルに構成することができます。

なお、FastCGIキャッシュはパッケージ版のnginxでは、機能に含まれているため、追加でパッケージなどをインストールすることが無く利用が可能です。

注意ポイント

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

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

FastCGIキャッシュを設定する環境はnginx環境へOPcacheとAPCu(共にPHPを高速化させるためのPHPアクセラレータパッケージ)の導入手順を紹介した記事

Open Source
nginx-php-cache-img
Nginxのパフォーマンスを手軽にアップできるPHPキャッシュ OPcacheとAPCuをインストール

こんにちは、ITエンジニアの小村(@system_kom)です。 前回の記事ではNginx環境へWordPressを導入するための手順と注意点を紹介しました。 今回はNginx環境を利用してPHPを高速化するためのキャッシュ機能を提供するパ ...

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

OSのバージョン CentOS 7.5.1804. 2016年7月時の最新
ウェブサーバー nginx 1.15.0 2018年7月時の最新
バーチャルホスト www.testdom.com / www.testdom2.com
WordPress インストール済み
PHP PHP/php-fpm 7.2系インストール
PHPアクセラレータ OPcache/APCu インストール
SSL Let's EncryptによるHTTPS有効
IPアドレス グローバルIPアドレスを割り当て
Firewall firewalldでHTTP/HTTPSを許可済み

この環境を前提に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の編集前に、既存のファイルをバックアップしておきます。具体的には以下の手順でコピーを行います。

 command
# cd /etc/nginx/
# cp -p nginx.conf nginx.conf.org2

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

 command
# vi nginx.conf

1-1-2. fastcgi_cache_pathの設定

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

 config
# fastcgi cache on www.testdom.com
fastcgi_cache_path /var/cache/nginx/testdom levels=1:2 keys_zone=testdom:30m max_size=512M inactive=600m;

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

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

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

 config
# fastcgi cache on www.testdom2.com
fastcgi_cache_path /var/cache/nginx/testdom2 levels=1:2 keys_zone=testdom2:30m max_size=512M inactive=600m;

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

1-1-3. fastcgi_cache_key設定

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

 config
fastcgi_cache_key "$scheme$request_method$host$request_uri";

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

1-1-4. fastcgi_ignore_headersの設定

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

 config
# cache 404 or other
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;}

1-1-5. fastcgi_cache_use_staleの設定

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

 config
# return old cache if PHP crashes
fastcgi_cache_use_stale error timeout invalid_header http_500;

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

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

 config
user www;
worker_processes 1;
 
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
 
events {
    worker_connections 1024;
}
 
http {
    server_tokens off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
 
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log /var/log/nginx/access.log main;
 
    sendfile on;
    #tcp_nopush on;
 
    keepalive_timeout 3;
 
    gzip on;
 
    server_names_hash_bucket_size 128;
 
    # fastcgi cache on www.testdom.com
    fastcgi_cache_path /var/cache/nginx/testdom levels=1:2 keys_zone=testdom:30m max_size=512M inactive=600m;
 
    # fastcgi cache on www.testdom2.com
    fastcgi_cache_path /var/cache/nginx/testdom2 levels=1:2 keys_zone=testdom2:30m max_size=512M inactive=600m;
 
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
 
    # cache 404 or other
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
 
    # return old cache if PHP crashes
    fastcgi_cache_use_stale error timeout invalid_header http_500;
 
    include /etc/nginx/conf.d/*.conf;
    include sites-enabled/*.conf;
}

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

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

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

 directory
/etc/nginx/
|-- conf.d
|-- fastcgi_params
|-- koi-utf
|-- koi-win
|-- mime.types
|-- modules -> ../../usr/lib64/nginx/modules
|-- nginx.conf
|-- scgi_params
|-- sites-available
| |-- default.conf
| |-- www.testdom.com.conf
| |-- www.testdom2.com.conf
|-- sites-enabled
| |-- default.conf -> /etc/nginx/sites-available/default.conf
| |-- www.testdom.com.conf -> /etc/nginx/sites-available/www.testdom.com.conf
| `-- www.testdom2.com.conf -> /etc/nginx/sites-available/www.testdom2.com.conf
|-- ssl
| `-- dhparam.pem
|-- uwsgi_params
`-- win-utf

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

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

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

 command
# cp -p /etc/nginx/sites-available/www.testdom.com.conf /etc/nginx/sites-available/www.testdom.com.conf.org3

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

 command
$ ls /etc/nginx/sites-available/
default.conf www.testdom.com.conf www.testdom.com.conf.org www.testdom.com.conf.org2 www.testdom.com.conf.org3 www.testdom2.com.conf

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

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

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

 config
server {
    listen 80;
    server_name testdom.com www.testdom.com;
    rewrite ^ https://$server_name$request_uri? permanent;
}
 
server {
    listen 443 ssl;
    server_name testdom.com www.testdom.com;
    access_log /var/log/nginx/www.testdom.com-access.log main;
    error_log /var/log/nginx/www.testdom.com-error.log;
    root /home/www/www.testdom.com;
 
    ssl_certificate /etc/letsencrypt/live/www.testdom.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.testdom.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
 
    location / {
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$args;
    }
 
    location ~ \.(png|jpg|gif|ico|css|js)$ {
        index index.html;
        break;
    }
 
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
}

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

 config
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

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

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

FastCGIキャッシュでは、特に設定しない限り、全てのファイルについてキャッシュを有効化します。

WordPressではキャッシュを行うと都合の悪い部分があります。例えばコメント欄や、管理用のページ、クッキーなどがそれにあたります。その為、キャッシュをしないURIについては「do_not_cache」フラグに1がセットされるように設定し、フラグが1のコンテンツについてはキャッシュを行わないように設定します。

WordPress用の設定として、以下のパラメータをlocationディレクティブに追記します。

 config
set $do_not_cache 0;
 
if ($request_method = POST) {
set $do_not_cache 1;
}
if ($query_string != "") {
set $do_not_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $do_not_cache 1;
}
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $do_not_cache 1;
}
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;

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

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

 config
# fastcgi cache on www.testdom.com
fastcgi_cache_path /var/cache/nginx/testdom levels=1:2 keys_zone=testdom:30m max_size=512M inactive=600m;

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

 config
fastcgi_cache testdom;
fastcgi_cache_valid 200 60m;
add_header X-F-Cache $upstream_cache_status;

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

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

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

 config
server {
    listen 80;
    server_name testdom.com www.testdom.com;
    rewrite ^ https://$server_name$request_uri? permanent;
    }
 
server {
    listen 443 ssl;
    server_name testdom.com www.testdom.com;
    access_log /var/log/nginx/www.testdom.com-access.log main;
    error_log /var/log/nginx/www.testdom.com-error.log;
    root /home/www/www.testdom.com;
 
    ssl_certificate /etc/letsencrypt/live/www.testdom.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.testdom.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
 
    location / {
        index index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;
    }
 
    location ~ \.(png|jpg|gif|ico|css|js)$ {
        index index.html;
        break;
    }
 
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
set $do_not_cache 0;
 
if ($request_method = POST) {
set $do_not_cache 1;
}
if ($query_string != "") {
set $do_not_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $do_not_cache 1;
}
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $do_not_cache 1;
}
fastcgi_cache testdom;
fastcgi_cache_valid 200 60m;
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
add_header X-F-Cache $upstream_cache_status;
}
}

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

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

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

 command
# cp -p /etc/nginx/sites-available/www.testdom2.com.conf /etc/nginx/sites-available/www.testdom2.com.conf.org3

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

 command
$ ls /etc/nginx/sites-available/
default.conf www.testdom.com.conf www.testdom2.com.conf.org www.testdom2.com.conf.org2 www.testdom.co2m.conf.org3 www.testdom2.com.conf

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

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

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

 config
server {
listen 80;
server_name testdom2.com www.testdom2.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
 
server {
listen 443 ssl;
server_name testdom2.com www.testdom2.com;
access_log /var/log/nginx/www.testdom2.com-access.log main;
error_log /var/log/nginx/www.testdom2.com-error.log;
root /home/www/www.testdom2.com;
 
ssl_certificate /etc/letsencrypt/live/www.testdom2.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.testdom2.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
 
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
 
    location ~ \.(png|jpg|gif|ico|css|js)$ {
        index index.html;
        break;
    }
 
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

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

 config
server {
listen 80;
server_name testdom2.com www.testdom2.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
 
server {
listen 443 ssl;
server_name testdom2.com www.testdom2.com;
access_log /var/log/nginx/www.testdom2.com-access.log main;
error_log /var/log/nginx/www.testdom2.com-error.log;
root /home/www/www.testdom2.com;
 
ssl_certificate /etc/letsencrypt/live/www.testdom2.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.testdom2.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
 
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$args;
}
 
    location ~ \.(png|jpg|gif|ico|css|js)$ {
        index index.html;
        break;
    }
 
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
set $do_not_cache 0;
 
if ($request_method = POST) {
set $do_not_cache 1;
}
if ($query_string != "") {
set $do_not_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $do_not_cache 1;
}
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $do_not_cache 1;
}
fastcgi_cache testdom2;
fastcgi_cache_valid 200 60m;
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;
add_header X-F-Cache $upstream_cache_status;
}
}

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

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

 command
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

2-5. 設定の有効化

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

 command
# systemctl restart 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"サイトでは、"HIT"と表示されていることから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"(Apache Bench)で測定してみます。
abはApacheを導入すると同時にインストールされます。ここでは環境として、別のサーバーから、FastCGIキャッシュを有効にしたnginxサーバーを測定するようにしています。

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

先ずはFastCGIキャッシュが有効になっていないサーバーに対してテストを行います。(前回の記事で設定したPHPキャッシュのOPcacheとAPCuは有効の状態です。)

abコマンドにはオプションとして"-n"と"-c"を指定します。"-n"オプションはリクエスト総数を指定します。"-c"は同時接続数になります。

本記事ではリクエスト数と同時接続数をやや増やして、300リクエストを同時接続20ユーザーを前提としてテストを実行しました。
結果は以下のようになりました。
FastCGIキャッシュ 導入前のテスト

 command
$ ab -n 300 -c 20 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)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests
 
Server Software: nginx
Server Hostname: www.testdom.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
 
Document Path: /
Document Length: 55361 bytes
 
Concurrency Level: 20
Time taken for tests: 11.860 seconds
Complete requests: 300
Failed requests: 0
Write errors: 0
Total transferred: 16685400 bytes
HTML transferred: 16608300 bytes
Requests per second: 25.29 [#/sec] (mean)
Time per request: 790.688 [ms] (mean)
Time per request: 39.534 [ms] (mean, across all concurrent requests)
Transfer rate: 1373.85 [Kbytes/sec] received
 
Connection Times (ms)
min mean[+/-sd] median max
Connect: 3 11 15.9 5 159
Processing: 287 769 82.7 771 1030
Waiting: 35 331 44.9 329 483
Total: 291 779 87.9 781 1073
 
Percentage of the requests served within a certain time (ms)
50% 781
66% 801
75% 812
80% 819
90% 863
95% 937
98% 961
99% 1021
100% 1073 (longest request)

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

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

「Time taken for tests」はテストの所要時間、「Requests per second」は秒間でどれだけのリクエストを処理できたかを示す項目になります。

上記から従来の構成では、テストの所要時間は約11.6秒で、1秒間に処理できたリクエストは約25になります。

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

続いて、同じ条件でFastCGIキャッシュ設定後のnginxサーバーについてテストを行います。

本テストにはFastCGIキャッシュが利用されますので、設定前よりパフォーマンスが出ることが期待できます。結果は以下のようになりました。

FastCGIキャッシュ導入後のテスト

 command
$ ab -n 300 -c 20 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)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Finished 300 requests
 
Server Software: nginx
Server Hostname: www.testdom.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
 
Document Path: /
Document Length: 55361 bytes
 
Concurrency Level: 20
Time taken for tests: 0.528 seconds
Complete requests: 300
Failed requests: 0
Write errors: 0
Total transferred: 16690200 bytes
HTML transferred: 16608300 bytes
Requests per second: 568.34 [#/sec] (mean)
Time per request: 35.190 [ms] (mean)
Time per request: 1.760 [ms] (mean, across all concurrent requests)
Transfer rate: 30878.02 [Kbytes/sec] received
 
Connection Times (ms)
min mean[+/-sd] median max
Connect: 5 29 4.1 29 47
Processing: 2 4 2.6 4 18
Waiting: 1 4 0.7 3 7
Total: 7 34 4.9 33 52
WARNING: The median and mean for the waiting time are not within a normal deviation
These results are probably not that reliable.
 
Percentage of the requests served within a certain time (ms)
50% 33
66% 33
75% 34
80% 35
90% 40
95% 44
98% 47
99% 48
100% 52 (longest request)

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

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

「Time taken for tests」はテストの所要時間、「Requests per second」は秒間でどれだけのリクエストを処理できたかを示す項目になります。
上記から従来の構成では、テストの所要時間は約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"が指定されています。

以下、設定箇所の抜粋です。

 config
# fastcgi cache on www.testdom.com
fastcgi_cache_path /var/cache/nginx/testdom levels=1:2 keys_zone=testdom:30m max_size=512M inactive=600m;

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

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

キャッシュディレクトリの削除は、具体的には以下のように操作を行います。
削除前にターゲットのキャッシュディレクトリを確認します。

 command
$ ls -a /var/cache/nginx/
. .. client_temp fastcgi_temp proxy_temp testdom testdom2 scgi_temp uwsgi_temp

ターゲットのディレクトリが確認できたら、"rm"コマンドでキャッシュディレクトリの削除します。

 command
# rm -rf /var/cache/nginx/testdom

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

 command
$ ls -a /var/cache/nginx/
. .. client_temp fastcgi_temp proxy_temp testdom2 scgi_temp uwsgi_temp

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

5-1-2. nginxの再起動

キャッシュ情報をメモリ上から削除するために、nginxを再起動します。

 command
# systemctl restart nginx

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

6. まとめ

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

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

どちらの方法もパフォーマンスを向上するために有効であることが確認できました。
特にFastCGIキャッシュ機能については、効果が絶大で、パフォーマンスが必要なサーバーにnginxを利用している環境では、是非、導入していただくことをお勧めします。

残念ながらCentOSのパッケージ版では、キャッシュを削除するためのモジュールが有効になっていませんが、今後の記事でキャッシュを削除するためのモジュールを利用する方法も紹介していきます。

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

レムシステム

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

-CentOS, Nginx