したいこと
Nginx において, 同一ウェブサイト上のコンテンツ毎に FastCGI Cache の有効/無効を切り替えたい. 例えば, 記事のキャッシュは有効, 記事一覧のキャッシュは無効といったようにしたい.
やりかた
リクエストした URL のページにおいて FastCGI Cache が有効になっているかを調べるには,
/etc/nginx/nginx.conf
の http
ディレクティブに以下を追加する.
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;
}