Nginx の FastCGI Cache を特定の URL について無効にする

作成

したいこと

Nginx において, 同一ウェブサイト上のコンテンツ毎に FastCGI Cache の有効/無効を切り替えたい. 例えば, 記事のキャッシュは有効, 記事一覧のキャッシュは無効といったようにしたい.

やりかた

リクエストした URL のページにおいて FastCGI Cache が有効になっているかを調べるには, /etc/nginx/nginx.confhttp ディレクティブに以下を追加する.

http {
    add_header X-Cache-Status $upstream_cache_status;
}

こうすることで, レスポンスヘッダに「X-Cache-Status」 (任意に変更可) という名の項が追加され, その値によって FastCGI Cache の状態が判別出来る.

$upstream_cache_status : keeps the status of accessing a response cache (0.8.3). The status can be either “MISS”, “BYPASS”, “EXPIRED”, “STALE”, “UPDATING”, “REVALIDATED”, or “HIT”.

-- quoted from $upstream_cache_status on Feb. 25, 2018..

取りうる値は "MISS", "BYPASS", "EXPIRED", "STALE", "UPDATING", "REVALIDATED", "HIT" の7つのいずれかだ. それぞれの意味は次が詳しい.

-- quoted from A Guide to Caching with NGINX and NGINX Plus on Feb. 25, 2018.

今回は, MISS (キャッシュなし), BYPASS (キャッシュ設定を迂回, キャッシュ不使用), HIT (キャッシュあり) の3つを使う.

ダメだった例

Location 毎に fastcgi_no_cache 等を記述しても効かなかった. Location を問わず X-Cache-Status は, 初回読み込み時 MISS, 2回目以降読み込み時 HIT となる.

server {

    location /example {
        fastcgi_cache_bypass 1;
        fastcgi_no_cache     1;
    }

    fastcgi_cache_bypass 0;
    fastcgi_no_cache     0;

}

うまくいった例

$request_uri とのマッチを判定して, fastcgi_no_cache 等の値を変えたところ, うまくいった. X-Cache-Status は, /example 以外の location で初回読み込み時 MISS, 2回目以降読み込み時 HIT となり, /example では常に BYPASS となる.

server {

    set $disable_cache 0;

    if ($request_uri ~ /example) {
        set $disable_cache 1;
    }

    fastcgi_cache_bypass $disable_cache;
    fastcgi_no_cache     $disable_cache;

}