詳解!KUSANAGIキャッシュ講座

この記事ではKUSANAGIの最大の特徴であるキャッシュ機能(bcacheとfcache)について解説しています。
丁寧に作ったのでこの記事をブックマークして、キャッシュの導入や設定でつまづいた時に読み返してみてください。

bcacheとは

bcacheとは、block cacheの略で動作はWordPress内のKUSANAGIプラグインが行っています。
仕組みとしては、WordPressのページキャッシュプラグイン(WP Super CacheやWP Super Cache等)と似ています。

キャッシュ有効時、まずアクセスがあると、そのページのHTML(キャッシュデータ)がデータベースに保存されます。
(キャッシュデータはwp_site_cacheというテーブルに入っています。)

そして次回以降は、テーマファイルが読み込まれる前にデータベースから取得したキャッシュデータを表示してプログラムを終了しています。
キャッシュが効いていると、テーマファイルが読み込まれないため高速化できるというわけです。

fcacheとは

fcacheとは、FastCGI Cacheの略で動作はサーバー(Nginx)が行っています。
仕組みとしてはbcacheと似ているのですが、大きな違いはキャッシュデータをサーバーに保存している点です。

まず初回アクセス時に、そのページのHTML(キャッシュデータ)がサーバーに保存されます。
(キャッシュデータは/var/cache/nginx/wordpressディレクトリにmd5でハッシュ化されたファイル名で保存されています)

そして次回以降は、アクセスがあるとサーバーに保存されたキャッシュが返されます。
この場合、WordPressにすらアクセスしないためbcacheより高速にページが表示されます。

bcacheの使い方

bcacheを有効にする

デフォルトではbcacheはOFFになっています。

KUSANAGI bcache off時の設定画面

管理画面の「KUSANAGI」→「ページキャッシュ」の画面に行くと
ページキャッシュは有効になっていません。有効にするには、仮想サーバのコンソール上で、 kusanagi bcache on と入力してください。
とメッセージが表示されていますので、コマンドからbcacheを有効化しましょう。

  1. まずSSHでログインします。
    
    
        __ ____  _______ ___    _   _____   __________
       / //_/ / / / ___//   |  / | / /   | / ____/  _/
      / ,< / / / /\__ \/ /| | /  |/ / /| |/ / __ / /
     / /| / /_/ /___/ / ___ |/ /|  / ___ / /_/ // /
    /_/ |_\____//____/_/  |_/_/ |_/_/  |_\____/___/
    
    Version 8.5.2-2, Powered by Prime Strategy.
    
    
  2. sudo su -コマンドでrootユーザーに昇格します。
    
    sudo su -
    最終ログイン: 2021/07/12 (月) 18:13:31 JST日時 pts/0
    
    

    パスワードを求められたら入力してください。

  3. kusanagi targetで現在のプロファイルを確認
    
    kusanagi target
    nullnull.dev
    完了しました。
    
    

    bcacheを有効化したいプロファイルになっていない場合は、
    kusanagi target [profile name]でプロファイルを変更しましょう。

    
    kusanagi target nullnull.dev 
    ターゲットはnullnull.dev に変更されました。
    完了しました。
    
    
  4. 設定を確認

    bcacheを有効化する前に現在のKUSANAGIの設定を確認してみましょう。
    kusanagi statusと入力すると現在の設定を確認できます。

    
    kusanagi status
    Profile: nullnull.dev
    FQDN: nullnull.dev
    Type: WordPress
    KUSANAGI Version 8.5.2-2
    aws
    
    *** (active) nginx ***
    ● nginx.service - The NGINX HTTP and reverse proxy server
       Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
       Active: active (running) since 木 2021-07-08 10:03:28 JST; 5 days ago
    
    *** (active) php7-fpm ***
    ● php7-fpm.service - The PHP FastCGI Process Manager
       Loaded: loaded (/usr/lib/systemd/system/php7-fpm.service; enabled; vendor preset: disabled)
       Active: active (running) since 木 2021-07-08 10:03:27 JST; 5 days ago
    
    *** (active) MariaDB ***
    ● mariadb.service - MariaDB 10.3.30 database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
       Active: active (running) since 木 2021-07-08 10:03:28 JST; 5 days ago
    
    *** ruby ***
    KUSANAGI Ruby is not installed yet
    
    *** add-on ***
    
    *** Cache Status ***
    bcache off
    fcache off
    
    *** WAF ***
    off
    
    *** SELinux ***
    off
    
    完了しました。
    
    

    Cache Statusの項目でbcache、fcache共にoffになっていることがわかります。

    kusanagi bcacheでbcacheの設定だけ確認することもできます。

    
    kusanagi bcache
    bcache は無効です
    完了しました。
    
    
  5. bcacheの有効化

    kusanagi bcache onでbcacheを有効化しましょう。

    
    kusanagi bcache on
    onにします。
    完了しました。
    
    

念の為、KUSANAGIの設定画面も見てみます。
有効化する前に出ていた「ページキャッシュは有効になっていません。有効に…」というメッセージが消えていれば問題ありません。

KUSANAGI bcache on時の設定画面

もし、このメッセージがまだ消えていない場合は、手動で有効化する必要がありますのでwp-confg.phpを開いて79行目当りにある#define('WP_CACHE', true);の先頭の#を削除して保存してください。
これで先程のメッセージは消えるはずです。

bcacheの設定

有効化できたら次はbcacheの設定を行いましょう。
設定は全て管理画面から行います。

キャッシュの有効時間

まず管理画面の「KUSANAGI」→「ページキャッシュ」の画面を開いてください。
上から「トップページ」「アーカイブ」「記事詳細」と数字を入力するフォームが3つあります。

KUSANAGI bcache 「有効時間」の設定画面

これはキャッシュの有効期間を何分にするかの設定です。
デフォルトでは60分、60分、360分になっています。
デフォルトのままでも良いですし、サイトの構成によってはもう少し長めに取っても良いでしょう。

キャッシュ除外URL

KUSANAGI bcache 「キャッシュURL」の設定画面

ここにはキャッシュさせたくないページのURLパターンを入力します。
例えばhttps://example.com/test1/というページを除外したい場合は/test1/、カテゴリーページを全てキャッシュさせたくない場合は/category/.+のように入力すれば良いです。

パターンには正規表現が使え、複数指定する場合は1行ずつ改行して入力してください。
頻繁に更新されるページやPHPでアクセス毎にランダムに出力内容を変えているページ等を指定すると良さそうです。

キャッシュするクエリ文字列

KUSANAGI bcache 「キャッシュするクエリ文字列」の設定画面

独自のクエリ付きのページもキャッシュさせたい場合は、このフォームにクエリのキーを入力します。
WordPressのデフォルトクエリは設定されていますので不要です。

例えば、https://example.com/?custom_test=1というページをキャッシュさせたい場合、custom_testと入力すれば良いです。
複数指定する場合は1行ずつ改行して入力してください。

記事公開時に削除するキャッシュの範囲

KUSANAGI bcache 「公開時に削除するキャッシュの範囲」の設定画面

新しい記事を公開してもキャッシュが残っていればトップページへ反映されません。
そこでこの設定が役に立ちます。
記事公開時にキャッシュを削除したいページを選びましょう。
デフォルトでは「削除しない」になっています。

ちなみにこの設定は予約投稿した記事が公開された際にも実行されます。

advanced-cache.phpの再生成

KUSANAGI bcache 「advanced-cache.phpの再生成」の設定画面

上記の設定をしたあとは必ず「advanced-cache.phpを生成する」ボタンを押してadvanced-cache.phpを再生成してください。
この作業を行わないと設定が反映されないことがあります。

bcacheの効果確認

bcacheの設定が終わったら、次は実際にページがキャッシュされるか確認してみましょう。
まず、管理画面にログインしていない状態でトップページにアクセスしてください。
これでキャッシュデータが生成されるはずです。

どのページがキャッシュされているのかはコマンドで確認することができます。
bcacheを有効化するときと同じ手順でSSHでログインし、rootユーザーになってください。
そして次のコマンドを実行します。

kusanagi bcache clear '\|/$' --dryrun


kusanagi bcache clear '\|/$' --dryrun
キャッシュをクリアします。
INFO: |https|nullnull.dev|/ cache will be deleted
完了しました。

INFO: |https|nullnull.dev|/ cache will be deleted
と表示されているのでトップページがキャッシュされていることがわかります。
先程のコマンドが何をしているのかは次項の「bcacheを削除する」で詳しく説明します。

また、キャッシュファイルはデータベースを見ても確認することができます。
データベースにアクセスしてwp_site_cacheというテーブルを開いてください。

KUSANAGI bcache データベースの内容

typeカラムにfront、device_urlカラムにトップページのurlが入っているので、トップページのキャッシュデータが作成されていることが確認できます。

該当ページがキャッシュから返されているかはHTTP レスポンスヘッダで確認することも可能です。

bcache無効時
x-b-cache: BYPASS

bcache生成時
x-b-cache: create

bcacheヒット時
x-b-cache: cache

bcacheを削除する

最後にbcacheを削除する方法を解説していきます。
bcacheを削除する方法は2つ。
コマンドから行う方法とWordPressの管理画面から行う方法があります。

まずは、コマンドから行う方法について説明します。
SSHでログインし、rootユーザーになってください。
そして、次のコマンドを実行するとトップページのbcacheが削除されます。
kusanagi bcache clear '|/$'


kusanagi bcache clear '\|/$'
キャッシュをクリアします。
SUCCESS: |https|nullnull.dev|/ cache could be deleted
完了しました。

ここでbcacheの削除コマンドの解説したいと思います。
まずkusnagi bcache clearは全てのbcacheを削除するコマンドになります。
複数サイトがあれば全てのサイトの全てのbcacheを削除します。

そしてkusnagi bcache clear '|/$'はトップページのみ削除するコマンドになります。
シングルクォーテーションで囲った部分にはパスを指定します。
パスを指定することで削除対象をターゲットプロファイルに絞ることができます。(パスには正規表現が使えます)

最後に前項で実行したkusnagi bcache clear '|/$' --dryrunですが、
これは削除対象URL(この場合はトップページ)を確認するコマンドになります。
最後に--dryrunをつけると削除対象URLの事前確認が行えます。
ですので慣れないうちは、--dryrunオプションを付けて事前確認を行った後に削除する、という流れで行うと良いと思います。

余談ですが、dryrunは予行演習、空運転、リハーサルというような意味を持ちます。

次は、管理画面から削除する方法について説明します。
まず管理画面にログインし、「KUSANAGI」→「ページキャッシュ」の画面にいきます。
ページ下部に「キャッシュのクリア」という項目がありますので、すぐ下にある「すべて」をクリックしてみましょう。

KUSANAGI bcache 「キャッシュクリア」の設定画面

これでbcacheが全て削除されます。

ページごとにキャッシュを削除したい場合は、管理画面にログインした状態でキャッシュを削除したいページを開いてください。
管理バー(ツールバー)の右側に「cache clear」という項目がありますので、それをクリックすると表示中のページのbcache(fcacheも)が削除されます。

KUSANAGI bcache 管理バーから「cache clear」ボタンを押してキャッシュレスをクリアする

bcacheの使い方については以上になります。

fcacheの使い方

fcacheを有効にする

デフォルトではfcacheはOFFになっています。
ONにするにはコマンドから行う必要がありますので、SSHでログインし、rootユーザーになってください。
そしてkusanagi targetで現在のプロファイルを確認し、問題がなければkusanagi fcacheでfcacheの設定も確認します。

ここまではbcacheの設定手順とほぼ同じです。

そして、kusanagi fcache onでfcacheを有効化します。


kusanagi fcache on
onにします。
Nginxを使用します。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
完了しました。

念の為、fcacheがきちんと有効化されているかconfigファイルを見て確認してみましょう。
まず、cd /etc/nginx/conf.dで各プロファイルのconfigファイルがあるディレクトリに移動します。
そしてllコマンドでディレクトリの中身を確認します。


ll
合計 32
-rw-r--r--. 1 root root  329  5月 26 19:15 _http.conf
-rw-r--r--. 1 root root  894  5月 26 19:15 _ssl.conf
-rw-r--r--. 1 root root   56  5月 26 19:15 kusanagi_naxsi_core.conf
-rw-r--r--. 1 root root 3699  7月 13 13:56 nullnull.dev_http.conf
-rw-r--r--. 1 root root 4883  7月 13 13:56 nullnull.dev_ssl.conf
-rw-r--r--. 1 root root  725  5月 26 19:15 psol.ini
-rw-r--r--. 1 root root  128  5月 26 19:15 security.conf

[profile_name]_http.conf[profile_name]_ssl.confというファイルが2つあるのが確認できます。
前者は非ssl化、後者はssl化の場合の設定ファイルです。

当サイトはSSL化しているので[profile_name]_ssl.confをviコマンドで確認します。


vi nullnull.dev_ssl.conf

    ...

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        #include shib_fastcgi_params;
        #include shib_clear_headers;
        limit_req zone=one burst=10 nodelay;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffers 256 128k;
        fastcgi_buffer_size 128k;
        fastcgi_intercept_errors on;
        fastcgi_read_timeout 120s;

        set $do_not_cache 0; ## page cache
        set $device "pc";

        if ($request_method = POST) {
            set $do_not_cache 1;
        }

129行目辺りにdo_not_cacheという変数がセットされていますが値が0になっていればfcacheが有効化されていますので、ZZでファイルを閉じましょう。
もし、値が1だった場合はfcacheはOFFのままですので、iでインサートモードにし、 do_not_cacheの値を0から1に書き換えます。
そしてescでインサートモードを終了し、:wqコマンドで上書き保存してください。

ファイルを編集したら設定を反映させるためにkusanagi restartコマンドを叩いてNginxを再起動しましょう。
これでfcacheの有効化は完了です。

fcacheの設定

fcacheの設定は特に変更せずとも利用できますが、この項目では需要がありそうなキャッシュの有効時間の設定のみ解説します。

まず、vi /etc/nginx/nginx.confでnginx.confファイルを開いてください。


vi /etc/nginx/nginx.conf

    ...

    brotli on; 
    brotli_static on; 
    brotli_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
    brotli_comp_level 3;
    brotli_min_length 1024;

    open_file_cache max=100000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on; 
    fastcgi_cache_path /var/cache/nginx/wordpress levels=1:2 keys_zone=wpcache:30m max_size=512M inactive=600m;
    fastcgi_ignore_headers "Vary" "Cache-Control" "Expires";

    include /etc/nginx/conf.d/*.conf;

}

58行目辺りのfastcgi_cache_pathから始まる行でキャッシュファイルの保存場所やキャッシュの有効時間などを決めています。
この行の一番右側にinactiveというキーがありますのでその値を変更するとキャッシュの有効時間が変わります。
初期値は600m(600分)になっています。
指定方法ですが、10分なら10m、2時間なら2h、2日なら2dというように指定します。

設定を変更したらkusanagi restartを忘れずに行いましょう。

fcacheの効果確認

bcacheと同様にfcacheの有効化・設定が終わったら、次は実際にページがキャッシュされるか確認してみましょう。
まず、管理画面にログインしていない状態でトップページにアクセスしてください。
(可能であればスマホ、タブレットからもアクセスしましょう。ブラウザのデベロッパーツールでUAを変えてアクセスしてもいいです。)
これでキャッシュファイルが生成されるはずです。

どのページがキャッシュされているのかはコマンドで確認することができます。
手順はbcacheの時とほぼ同じです。

まずでSSHでログインし、rootユーザーになってください。
そして次のコマンドを実行します。

kusanagi fcache clear '/$' --dryrun


kusanagi fcache clear '/$' --dryrun
INFO: pc:GET:https://nullnull.dev/ will be deleted
INFO: smart:GET:https://nullnull.dev/ will be deleted
INFO: tablet:GET:https://nullnull.dev/ will be deleted
完了しました。

fcacheのキャッシュファイルはUA(ユーザーエージェント)ごとに作られるので、pc、tablet、smartと3つキャッシュファイルが生成されていることが確認できました。

bcacheと同様にHTTP レスポンスヘッダで確認することも可能です。
(bcacheの場合と値が少し異なるので注意が必要です)

fcache無効時
x-b-cache: BYPASS

fcache生成時
x-f-cache: MISS

fcacheヒット時
x-f-cache: HIT

fcacheを削除する

最後にfcacheを削除する方法を解説します。
手順はbcacheの時とほぼ同じです。

まずSSHでログインし、rootユーザーに昇格します。
そして次のコマンドを実行するとトップページのキャッシュが削除されます。

kusanagi fcache clear '/$'


kusanagi fcache clear '/$'
SUCCESS: pc:GET:https://nullnull.dev/ cache could be deleted
SUCCESS: smart:GET:https://nullnull.dev/ cache could be deleted
SUCCESS: tablet:GET:https://nullnull.dev/ cache could be deleted
完了しました。

bcacheの時と同様に、管理画面にログインした状態で削除したいページを表示、管理バー(ツールバー)右側の「cache clear」を押すことでも削除できます。
※ちなみに、管理画面にログイン中はbcache、fcache共に効かないようになっています。

以上で、「詳解!KUSANAGIキャッシュ講座」は終了です。