Как сделать объект недействительным в кэше Varnish, если он имеет нулевую длину? - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь обойти бэкэнд-сервер, который время от времени начинает обслуживать пустые страницы с ответом 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.

Ответы [ 2 ]

2 голосов
/ 04 августа 2014

Что я сделал, так это проверил Content-Length для 0 и 20 в sub_vcl_fech и перезапустился, когда это произошло

if (beresp.http.Content-Length == "0" || beresp.http.Content-Length == "20"){
    return(restart);
}

длина содержимого 20 - это то, что мой сервер возвратил при возникновении ошибки.

в подпрограмме vcl_recv я добавил проверку на количество перезапусков максимум 2

if(req.restarts == 2){
   error 500 req.http.host;
}

Вариант 2

другой вариант, который я получилиз лаковой документации.https://www.varnish -cache.org / docs / 3.0 / tutorial / processing_misbehaving_servers.html

  1. Бросить ошибку в vcl_fetch, например: error 751 req.http.host;
  2. добавить магический маркер в vcl_error.
  3. добавить возврат (перезапустить);в проверке vcl_error
  4. на наличие магического маркера, установленного в vcl_recv или vcl_fetch
0 голосов
/ 02 апреля 2012

Делать это в vcl_deliver слишком поздно. Эта подпрограмма вызывается непосредственно перед отправкой контента клиенту, и obj больше не должен быть доступен (только «resp», который не содержит параметров ttl или grace).

Вы пытались сделать это в vcl_fetch? Вам не нужно будет вызывать «restart», а напрямую «hit_for_pass».

Во всяком случае, (не уверен в этом) Я не думаю, что льготный режим можно использовать в зависимости от содержимого ответа, так как он должен запускаться, когда вы не можете получить какое-либо обновление содержимого (ошибка сервера). Возможно, это могло бы сработать, изменив бэкэнд на «зомби» и перезапустив запрос, но наверняка, как только вы попадете в vcl_fetch, ответ ... извлекается, и режим льготности не сработает.

...