Могу ли я аннулировать произвольную запись кэша с помощью Varnish?

Я изучаю, могу ли я использовать Varnish для ускорения REST API.

По сути, я хочу кэшировать запросы GET на потенциально долгое время. Но когда получен запрос PUT/POST/DELETE, я хочу проанализировать URL-адрес и на основе найденной информации очистить запись в кеше.

Например:

GET /documents/:docType // return document list for specified docType
DELETE /document/:docType/:docId // delete a document

GET /documents/A0  <-- cached
GET /documents/A1  <-- cached
DELETE /document/A0/333  <-- first entry is purged

Могу ли я добиться этого с помощью VCL?


person Federico Razzoli    schedule 03.07.2015    source источник


Ответы (1)


Я предлагаю этот учебник по лаку, где объясняется очистка и бан.

Вы должны быть осторожны при очистке, так как вы не должны позволять всем очищать URL-адрес.

Для этого вы должны сделать что-то вроде:

# IPs allowed to purge
acl purgeIps {
    "localhost";
    "192.168.55.0"/24;
}

Затем в вашем vcl_recv вы должны решить, когда очищать/запрещать:

if (req.request == "PUT" ||
    req.request == "POST" ||
    req.request == "DELETE"){
    if (!client.ip ~ purgeIps) {
        error 405 "Not allowed.";
    }
    purge; #I'm not sure if purge can be done here, if it doesn't work you should use it in vcl_hit and vcl_miss
    # Also, if purge does not work here you should change this line for return(lookup);
    error 200 "Purged";
}

Здесь вы можете найти больше примеров блокировки и очистки

person Redithion    schedule 05.07.2015
comment
Вы не можете причинить большого вреда, включив PURGE, так как он вытесняет один объект, соответствующий точному URL-адресу, а URL-адрес не может содержать подстановочные знаки (поскольку Varnish хранит объекты с хэш-идентификатором, а не самим URL-адресом, поэтому шаблоны не имеют смысла). С другой стороны, БАН может быть опасен, - person karatedog; 06.07.2015
comment
Да, это то, что я имел в виду. Тем не менее, думая об этом глубже и не будучи уверенным на 100%, возможно, если вы разрешите очистку тяжелого статического объекта, вы подвергнетесь DDoS-атаке из-за многократной очистки и загрузки. - person Redithion; 06.07.2015
comment
Какой бы метод вы ни использовали, если вы включите, скажем, метод PUT в запросе, за которым следует вновь сгенерированный ответ, вы все равно будете уязвимы для DDoS, поскольку этот процесс не может быть кэширован. Потенциальному злоумышленнику нужно только найти соответствующий URL-адрес для этого PUT. Хотя, не зная внутренностей приложения, не так просто узнать, что это за тяжелые объекты. - person karatedog; 07.07.2015