目次

17 Nginx FastCGI Cache

nginxにはキャッシュ機能としてプロキシキャッシュとFastCGIキャッシュがある。

https://arakoki70.com/?p=4144

https://www.rem-system.com/nginx-fastcgi-cache/

FastCGIキャッシュディレクトリとキーの設定

fastcgi_cache_pathとfastcgi_cache_keyは、httpディレクティブに記述

http {
    fastcgi_cache_path /tmpfs/cache-zone levels=1:2 keys_zone=cache-zone:30m max_size=512M inactive=600m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    .
    .
    .
    .
    
fastcgi_cache_path/tmpfs/cache-zoneキャッシュの保存先。バーチャルホスト毎に異なるパスを指定
levels1:2キャッシュの構造レベルを指定
keys_zonetestdom:30mゾーン名とキャッシュキー管理用のメモリサイズ。
ゾーン名はバーチャルホスト毎に指定します。
ここではメモリサイズとしては30MBを保持するように設定
max_size512Mキャッシュの最大サイズ。このサイズを超えると利用されていないものから削除されていく
inactive600mこの時間アクセスが無いキャッシュを削除

FastCGIを利用する設定

こちらはlocationディレクティブに記述

location ~ \.php$ {
    fastcgi_read_timeout 300;
    fastcgi_pass   unix:/opt/bitnami/php/var/run/www.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $request_filename;
    include        fastcgi_params;
    
    
    ### 以下の設定を追加 ###
    set $do_not_cache 0;
    
    #  -- POST or HEAD ?
    if ($request_method != "GET") {
      set $do_not_cache 1;
    }
    #  -- Login or Comment or Post Editting ?
    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
      set $do_not_cache 1;
    }
    fastcgi_cache cache-zone;
    fastcgi_cache_valid 200 60m;
    add_header X-F-Cache $upstream_cache_status;
}
$do_not_cache0 1キャッシュ時の条件記述。
$do_not_cache=0の時はキャッシュしない。
上記の条件は、GET以外はキャッシュしない。cookie条件:コメント中、記事作成中、ログイン中の場合はキャッシュしない。
fastcgi_cache_valid200 60mHTTPステータス毎にキャッシュの有効期限を設定。
ここではHTTPステータス:200は60分でキャッシュの有効期限が切れる
add_header X-F-Cache $upstream_cache_statusヘッダーX-F-Cache にキャッシュの状態を表示。HITとかMISSとか表示される

キャッシュの確認

「X-F-Cache」で確認できる。

設定の下記部分
add_header X-F-Cache $upstream_cache_status;

一回目はキャッシュが無いので、MISSになる

# curl -D - -s  -o /dev/null http://localhost/info.php
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 01 May 2021 13:52:56 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.4.15
X-F-Cache: MISS

2回目はキャッシュにHITする。

# curl -D - -s  -o /dev/null http://localhost/info.php
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 01 May 2021 13:52:58 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.4.15
X-F-Cache: HIT