Varnish がこれらのページの古いキャッシュ バージョンを引き続き提供するようにすることで (別名、グレース モード)、200 OK 応答で空白ページの提供を開始するバックエンド サーバーを回避しようとしています。
最初に の応答を調べてみましたvcl_fetch
が、把握できる限り、 のコンテンツの長さを把握する方法はありませんvcl_fetch
。vcl_deliver
次に、 (Content-Length ヘッダーが利用可能な場所) で作業を試みました。それは機能しますが、キャッシュされた不良オブジェクト (空白のページを持つオブジェクト) を消去する方法がわかりません。
obj.grace と obj.ttl を に設定するようにアドバイスされましたvcl_deliver
。これが現在のコードです。
sub vcl_deliver {
# If the front page is blank, invalidate this cached object, in hope
# that we'll get a new one.
if (req.url == "/" && std.integer(resp.http.content-length, 0) < 1000) {
set obj.grace = 0m;
set obj.ttl = 0m;
return(restart);
}
}
しかし、Varnish はそれを好まず、VCL をロードしようとすると次のエラーが表示されます。
Message from VCC-compiler:
'obj.grace': cannot be set in method 'vcl_deliver'.
At: ('input' Line 146 Pos 9)
set obj.grace = 0m;
--------#########------
obj.ttl
行を削除すると、同じエラーが発生します。ドキュメントにはそうではないと書かれていますが、obj.grace
どちらも書き込み可能ではないようです。これは Varnish 3.0.2 にあります。vcl_deliver