Назад | Перейти на главную страницу

Varnish с непоследовательным удалением страниц из кеша

В нашей конфигурации varnish у нас есть функция vcl_fetch, определенная следующим образом:

if (beresp.ttl > 0s) {
   /* Remove Expires from backend, it's not long enough */
   unset beresp.http.expires;

   /* Set the clients TTL on this object */
   set beresp.http.cache-control = "max-age=900";

   /* Set how long Varnish will keep it */
   set beresp.ttl = 1h;

   /* marker for vcl_deliver to reset Age: */
   set beresp.http.magicmarker = "1";
 }

Затем в vcl_deliver:

if (resp.http.magicmarker) {
   /* Remove the magic marker */
   unset resp.http.magicmarker;

   /* By definition we have a fresh object */
   set resp.http.age = "0";
}

Проблема в том, что если я настраиваю сценарий (сценарий оболочки или сценарий php) для обращения к одному и тому же URL-адресу, я сначала вижу MISS, а затем HIT (пока все хорошо).

Я ожидаю, что сяду - это повторяющиеся ХИТЫ до тех пор, пока не пройдет отметка в 1 час, одно ПРОПУСКАНИЕ на отметке в 1 час, а затем снова час ХИТОВ. Другими словами, поскольку я повторно нажимаю один и тот же URL-адрес, он должен циклически переключаться между HIT и MISS каждые 1 ЧАС.

Вместо этого я вижу что-то вроде этого:

 6/20/2013 6:30:05 - STRING HIT NOT FOUND
 6/20/2013 10:32:11 - STRING HIT NOT FOUND
 6/21/2013 12:33:06 - STRING HIT NOT FOUND
 6/21/2013 2:34:06 - STRING HIT NOT FOUND

Сейчас 5:57 утра (почти 4 часа с тех пор, как HIT не обнаружен).

Все указанные выше промахи в кэше появляются около получасовой отметки, но с интервалом в 4 часа, 2 часа и 2 часа, а TTL установлен на 1 час.

Поэтому я не понимаю, почему объект хранится дольше 1 часа и почему его выселяют, казалось бы, через случайные промежутки времени. Как мне лучше понять, что происходит?

Кстати, я использую лак 3, если это помогает.

Итак, рассматриваемый лаковый сервер кэшировал сайт на Drupal 7. На сайте Drupal 7 у нас был настроен и включен модуль Drupal Varnish.

Насколько я могу судить, это периодически очищал кеш. Я смог определить это, используя следующую команду и увидев БАН, которые я не выдавал:

varnishadm -T localhost:6082 -S /etc/varnish/secret ban.list 
Present bans: 1371834738.031740 193 req.http.host ~ www.ourdomain.com && req.url ~ /