вторник, 29 ноября 2016 г.

Squid: Как гарантированно удалить объект из кэша командой PURGE

Если вы внимательно изучите исходный код утилиты purge, включенной ныне в состав дистрибутива Squid, то увидите, что, вообще говоря, посылка кэшу метода PURGE не гарантирует, что объект будет физически удален из кэша.

Вы, наверное, и сами это видели.

Давайте проведем небольшой эксперимент с объектом, который гарантированно находится в кэше.

Как у любого нормального админа-практика, у нас есть алиас в шелле для purge:

  alias purge1="/usr/local/squid/bin/purge -p localhost:3128 -P 1 "  

Выполним его.


Код 200 - выполнился?

Попробуем выполнить команду еще раз.

Удалился:


Давайте попробуем другой объект.


Вот этот. Мы нашли его выполнением команды purge без параметра P - то есть только показать, но не удалять.

Объект явно в кэше, его размер 9017 байт.

Выполняем purge -P 1 и......


404! Не найден в кэше!

Хорошо, еще раз:


Какого дьявола! Мы удалили объект дважды, purge мало того, что показывает для объекта, присутствующего в кэше, 404, так еще и не удаляет его!

Внимательно перечитываем исходники purge. И видим, что, помимо того, что удаление объектов по методу PURGE может и не гарантироваться, также существует недокументированный режим принудительного удаление объектов, а именно -P 0xf.

Отлично, приготовим алиас и для этой команды:

  alias purgef="/usr/local/squid/bin/purge -p localhost:3128 -P 0xf "  

и выполним ее:


Вот на этот раз объект удален.

Можете забить на предупреждение:

WARNING! Caches files were removed. Please shut down your cache, remove
your swap.state files and restart your cache again, i.e. effictively do
a slow rebuild your cache! Otherwise your squid *will* choke!

Нам наплевать, что кэш будет в шоке ;) Кстати, предупреждение излишне. Кэшу от этого хуже не станет. Перестраивать swap.state нет необходимости.

Все это было бы лишь не более, чем забавно - если бы не приводило к осложнениям в реальной практике сопровождения кэшей. Заставляющим, зачастую, полностью удалять все содержимое кэша и несколько дней его снова мучительно прогревать, мирясь с провалившимся BYTE HIT.

Более того. Если вы используете squidclamav, который имеет функционал trust cache (посылающий команду PURGE при обнаружении malware) - то, как вы видели выше, удаление может фактически и не произойти. И malware может пойти из кэша дальше.

В любом случае, кто предупрежден - тот вооружен, а кто вооружен - тот почти бесстрашен. ;)