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

Varnish не удаляет мои запросы, отправленные Plone

У меня есть Varnish 3.0.5 и я подключился к бэкэнду Plone 4. Мои запросы кэшируются, но не удаляются надежно, фактически только после истечения срока действия ttl. plone.app.caching - это аддон, который отправляет запрос на очистку каждый раз, когда объект изменяется. Это журнал лаков:

   14 BackendOpen  b backend_0 127.0.0.1 54428 127.0.0.1 9088
   14 BackendXID   b 1585950387
   14 TxRequest    b PURGE
   14 TxURL        b /VirtualHostBase/https/example.com/path/VirtualHostRoot/pic/a.jpg
   14 TxProtocol   b HTTP/1.1
   14 TxHeader     b Host: localhost:9081
   14 TxHeader     b X-Varnish: 1585950387
   14 BackendClose b backend_0
   13 ReqStart     c 127.0.0.1 56614 1585950387
   13 RxRequest    c PURGE
   13 RxURL        c /VirtualHostBase/https/example.com/path/VirtualHostRoot/pic/a.jpg
   13 RxProtocol   c HTTP/1.1
   13 RxHeader     c Host: localhost:9081
   13 VCL_call     c recv pipe
   13 VCL_call     c hash
   13 Hash         c /VirtualHostBase/https/example.com/path/VirtualHostRoot/pic/a.jpg
   13 VCL_return   c hash
   13 VCL_call     c pipe pipe
   13 Backend      c 14 backend_0 backend_0
   13 ReqEnd       c 1585950387 1412603444.714001656 1412603505.824758053 0.000071526 0.000180483 61.110575914

В default.vcl я настроил очистители acl, базовые функции vcl_hit и vcl_miss, а внутри vcl_recv у меня есть:

if (req.request == "PURGE") {
    if (!client.ip ~ purge) {
        error 405 "This IP is not allowed to send purge requests.";
    }
    return (lookup);
}

Когда я открываю изображение после очистки, я все равно получаю старую версию, пока не истечет максимальный возраст. Это сокращенный вывод журнала:

3 RxURL        c /VirtualHostBase/https/example.com:443/path/VirtualHostRoot/pic/a.jpg
3 RxProtocol   c HTTP/1.0
3 RxHeader     c Host: enertour.bz.it
3 VCL_call     c recv lookup
3 VCL_call     c hash
3 Hash         c /VirtualHostBase/https/example.com/path/VirtualHostRoot/pic/a.jpg
3 VCL_return   c hash
3 Hit          c 1585950403
3 VCL_call     c hit deliver
3 VCL_call     c deliver deliver
3 TxHeader     c Cache-Control: max-age=0, s-maxage=240, must-revalidate
3 TxHeader     c X-Cache-Rule: plone.content.file
3 TxHeader     c Age: 181

До сих пор я переписывал хеш-значение запроса, чтобы оно соответствовало хеш-функции запроса на очистку. Они идентичны, но мой объект не очищается, и я не могу понять, почему? Это потому, что запрашивающий хост меняется?

Рад любым подсказкам!

Посмотрев снова на свой vcl сегодня, я понял, что во время модификаций функция очистки проскальзывала под строками, где я проверяю типы запросов. Поэтому продувку не разрешили, и она закончилась на трубе. Правильный порядок:

if (req.request == PURGE) {
  ...
  return (lookup);
}
if (req.request != "(GET|HEAD)" {
  ...
  return (pass);
}