У меня есть 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);
}