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