Очистка кэша Varnish через Браузер с помощью PHP

Приветсвую тебя, дорогой читатель. В этой заметке я хочу поведать тебе, как можно элегантно чистить кэш Varnish. Данная статья описывает, как можно удалять страницы=объекты из кэша, используя их URL адреса.Эта статья размещена в моем блоге и набрана моими руками. Текущий результат был собран из частей нескольких материалов. Я, как приверженец свободного распространения информации, считаю своим долгом поделиться этой статьей с другими людьми путем размещения ее на страницах интернет ресурса с большей аудиторией, чем мой блог.

Итак для начала нужно описать ACL в настройках нашего хоста, что бы разрешить очистку кэша с определенных ip адресов. Для этого добавим следующее в файл /etc/varnish/default.vcl. (имя файла может отчиаться в зависимости от настройки Вашего сервера)

acl purge { «localhost»; «public_ip_address»;} Дальше добавим следующие строки в описание vcl_recv:

if (req.request == «PURGE») { if (! client.ip ~ purge) { error 405 «Not allowed.»; } else { purge_url (req.url); error 200 «Purged. Everything is fine»; } } Это нужно для того, чтобы запретить очистку кэша с внешней стороны.Для того чтобы Varnish не кэшировал саму страницу очистки кэша, нужно добавить следующие строки в vcl_fetch:

if (req.http.host == «www.your_site.com» && req.url == »^/varadm/.*\.(html|php)$») {
return (pass);
} Для того чтобы исключить из кэширования POST запросы, удостовертесь что в vcl_recv есть вот такие строчки:

if (req.request == «POST») { return (pass); } Отключаем кеширование для запросов basic авторизации (vcl_recv):

if (req.http.Authorization || req.http.Authenticate) { return (pass); } Для того, что бы не выводить кучу ненужной информации, я для себя очистил стандартный вывод страницы ошибки: В принципе этого можно не делать:

sub vcl_error { set obj.http.Content-Type = «text/html; charset=utf-8»; synthetic {» »}; return (deliver); } Дальше создаем папку, где будут храниться нужные файлы и переходим в нее. В моем случае это — /var/www/varadm.Уже в папке создаем несколько файлов. Первый из них — index.php, со следующим содежанием:

Purge Varnish cache

Makes Varnish purge the supplied URL from its cache

»>

Следующий — purge.php с вот таким содежанием:

»; if (!$fp) { echo »$errstr ($errno)
\n»; } else { $out = «PURGE /$url HTTP/1.0\r\n»; $out .= «Host: $host\r\n»; $out .= «Connection: Close\r\n\r\n»; fwrite ($fp, $out); while (! feof ($fp)) { echo fgets ($fp, 128); echo »
»; } fclose ($fp); echo »» . $host. $url.» was purged

»; echo »Return to varnish admin page»; } echo »»; ?> Создаем настройки для нашей папки в каталоге Apache: /etc/httpd/conf.d/varadm.conf

Alias /varadm /var/www/varadm DirectoryIndex index.html Options -Indexes +Includes

Order allow, deny AuthType Basic AuthUserFile /var/www/varadm/.ok_user AuthGroupFile /dev/null AuthName «Enter username/password» Require valid-user Satisfy any Deny from all Осталось создать пользователя для базовой авторизации и сгенерировать для него пароль:

htpasswd -cmb /var/www/varadm/.ok_user user password Теперь можно заходить на свой сайт, указывая location /varadm: www.your_site.com/varadm

В форме будет два поля. Одно — URL, второе принимает значение www.your_site.com. В поле URL вставляем адрес объекта, который нужно удалить из кэша и жмем «Submit». Все. Объект удален.

Как ни странно, Varnish кэширует отдельно html код страниц и отдельно создает объекты кэша для статических файлов. Тоесть, если Вы сменили код генерации станицы и удалили ее объект из кэша, это еще не значит что кэш очистился для всех статичесикх объектов, которые присутствуют на этой странице. Получается довольно круто: не нужно очищать кэш для тяжелых страниц при смене одной картинки. Можно грохнуть объект кэша именно для этой картинки.

Оригинал статьи.

© Habrahabr.ru