CentOS Nginx

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

2018年7月28日

nginx-fastcgi-cache-top2

前回の記事でnginxの環境にPHPアクセラレーターと呼ばれるパッケージ、OPcacheとAPCuの導入までを紹介しました。

Open Source
nginx-op-apcu-top2
CentOSのNginxでPHPの処理速度をアップするOPcacheとAPCuをインストール

今回は、nginx環境へWordPressを導入するための前回の記事 で作成したWordPressが動作しているnginx環境を利用して、更にWordPressを高速化するためのphp用パッケージであ ...

今回はさらに強力なキャッシュ機能であるFastCGIキャッシュの設定について紹介します。意外にバーチャルホスト環境でFastCGIキャッシュを利用する手順を紹介しているサイトは少ないと思います。是非、参考にしてみて下さい。
nginxにはキャッシュ機能としてプロキシキャッシュとFastCGIキャッシュが用意されています。PROXYキャッシュはウェブの待ち受けが二段階になる構成で、リバースプロキシサーバーを導入するような構成になり、やや複雑になります。FastCGIキャッシュはプロキシキャッシュをウェブサーバー一段階で行う構成で、無駄な通信と処理を必要とせず、シンプルに構成することができます。

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

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

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

# vi nginx.conf

1-1-2. fastcgi_cache_pathの設定

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

# 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の各パラメーターは以下のような意味合いを持ちます。

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

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

# 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ディレクティブ内に以下を追記します。

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

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

1-1-4. fastcgi_ignore_headersの設定

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

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

1-1-5. fastcgi_cache_use_staleの設定

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

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

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

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

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になります。以下が現状のディレクトリとファイルの構成です。

/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に行います。先ずはこのファイルをバックアップします。
以下の手順でコピーを行います。

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

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

$ 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パーマリンク対応の設定までが完了している、変更前の設定ファイルの内容は以下のようになります。

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 ~ \.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$”部分になります。

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ディレクティブに追記します。

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設定です。

# 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”が設定されていますので、以下のように追記を行います。

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

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

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

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

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 ~ \.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に行います。先ずはこのファイルをバックアップします。
以下の手順でコピーを行います。

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

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

$ 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パーマリンク対応の設定までが完了している、変更前の設定ファイルの内容は以下のようになります。

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 ~ \.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”のみバーチャルホスト毎の設定に合わせます。
変更が完了したファイルの内容は以下の通りです。

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 ~ \.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”オプションを付けて実行することで設定ファイルの間違いをチェックできます。設定変更後には実行することをお勧めします。
以下のように実行します。

# 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を再起動します。

# 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”サイトでは、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キャッシュ 導入前のテスト

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

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

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

$ 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~”はテストの所要時間、”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”が指定されています。以下、設定箇所の抜粋です。

# 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. キャッシュディレクトリの削除

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

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

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

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

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

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

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

5-1-2. nginxの再起動

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

# systemctl restart nginx

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

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

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

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

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

# vi /home/www/www.testdom.com/wp-admin/cache_remove.php

作成するファイルの内容

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

# chown www:www /home/www/www.testdom.com/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のパッケージ版では、キャッシュを削除するためのモジュールが有効になっていませんが、今後の記事でキャッシュを削除するためのモジュールを利用する方法も紹介していきます。

レムシステムでは、ブログで紹介した設定ができない場合や、利用中のサーバー・ネットワークについての相談を受け付けています。利用中のシステムやセットアップでお困りの点がございましたら、お気軽にご相談ください。

メールでのお問い合わせ

メールフォームからシステムの
知りたいことや問題点をお問い合わせ

メールで問い合わせる

電話でのお問い合わせ

電話でお気軽にお問い合わせください
(受付時間:平日10:00〜18:00)

053-525-7357

  • この記事を書いた人
  • 最新記事
レムシステム

小村定

SIerでIT系インフラの設計と構築を経験したのちに独立、「レムシステム株式会社」を設立する。インフラ系エンジニア歴20年の経験を活かしてITに関わる課題解決や効率化に取り組む日々を送っている。

Copyright© レムシステム エンジニアブログ , 2019 All Rights Reserved.