Я пытаюсь обойти внутренний сервер, который время от времени начинает обслуживать пустые страницы с ответом 200 OK, заставляя Varnish продолжать обслуживать старые кешированные версии этих страниц (также известный как льготный режим).
Сначала я попытался проверить ответ в 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
— кажется, что ни одна из них не доступна для записи в vcl_deliver
, хотя документация говорит об обратном. Это на Varnish 3.0.2.