Varnish の Debug は Firebug を使えば簡単にできます。今回は こちら に続き Firebug を使って Varnish を利用しているサイトでキャッシュが利用できない場合に対処します。
HTTP ヘッダのクッキー設定可否
Varnish では URL がクッキーを送信していた場合にキャッシュしないように初期設定がされています。クッキーの送信可否は Firebug を開いて HTTP リクエストを見ることで確認できます。
クッキー送信は上記の箇所になります。こちら でも触れていますが、Varnish の設定ファイルである /etc/varnish/default.vcl の初期設定を(コメントアウト解除により)そのまま使った場合、vcl_recv の箇所は以下のようになっています。
(省略)
sub vcl_recv {
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
(省略)
上記の “if (req.http.Authorization || req.http.Cookie) {” は「リクエスト認証が必要としている」もしくは「リクエストがクッキーを持っている」場合を意味し、この場合は return(pass)、つまりキャッシュしないようになっています。
Varnish のこの設定は控えめになっていますがこういったクッキーを無視して構わないのであればこの箇所はコメントアウトすればクッキー付きの URL でもキャッシュできるようになります。