Varnish ESI で特有の問題が発生しています。
私のサイトの各ページには、(ログインした) ユーザーのアカウント情報を吐き出す ESI フラグメントがあります。
ブラウザが Cache-Control: no-cache / Pragma: no-cache (force refresh) をサーバーから ESI コンテンツを要求するときに送信しない限り、Varnish はユーザー セッション ESI フラグメントのキャッシュされた結果を返しているようです。
私の vcl_recv には、これをバイパスするルールが含まれています。
if(req.url ~ "^/session-header") {
return(pass);
}
vcl_fetch にもルールがあります。
if(req.url ~ "^/session-header") {
return(hit_for_pass);
} else {
set beresp.ttl = 1h;
}
基本的に、これはブラウザ側からの動作です。
Cache-Control: max-age=0 => Varnish はキャッシュされた ESI フラグメントを返します
Cache-Control: no-cache / Pragma: no-cache => Varnish はサーバーから ESI フラグメントを取得します
私はそれを理解できないようで、かなり明白な構成を見逃したような気がします。