Очистка кэша 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)$") {<br>       return (pass);<br> }

Для того чтобы исключить из кэширования 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 {" <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> </head> </body> </html> "};   return (deliver); } 

Дальше создаем папку, где будут храниться нужные файлы и переходим в нее. В моем случае это — /var/www/varadm.
Уже в папке создаем несколько файлов. Первый из них — index.php, со следующим содежанием:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Purge Varnish cache</title> </head>  <style type="text/css"> body { font-size: 10px; } h1 {     font-weight: bold;     color: #000000;     border-bottom: 1px solid #C6EC8C;     margin-bottom: 2em; } label {     font-size: 160%;     float: left;     text-align: right;     margin-right: 0.5em;     display: block } input[type="text"] {     width: 500px; } .submit input {     margin-left: 0em;     margin-bottom: 1em; } </style>  <body>  <h1>Makes Varnish purge the supplied URL from its cache</h1>  <form action="purge.php" method="post"> <p><label>URL</label> <input type="text" name="url"></p> <p><label>HOST</label> <input type="text" name="host" value="<?php echo $_SERVER["HTTP_HOST"] ?>"></p> <p class="submit"><input value="Submit" type="submit"></p> </form>  </body> </html> 

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

<?php $fp = fsockopen("127.0.0.1", "80", $errno, $errstr, 2); $string = $_POST['url']; $host = $_POST['host']; $url = str_replace($host, '', $string); #$url = $_POST['url']; echo "<center>"; if (!$fp) {     echo "$errstr ($errno)<br />\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 "<br>";     }     fclose($fp); echo "<b>" . $host . $url . " was purged </b><br><br>"; echo "<a href=\"/varadm\">Return to varnish admin page<a>"; } echo "</center>"; ?>

Создаем настройки для нашей папки в каталоге Apache: /etc/httpd/conf.d/varadm.conf

Alias /varadm /var/www/varadm <Directory /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 </Directory> 

Осталось создать пользователя для базовой авторизации и сгенерировать для него пароль:

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 код страниц и отдельно создает объекты кэша для статических файлов. Тоесть, если Вы сменили код генерации станицы и удалили ее объект из кэша, это еще не значит что кэш очистился для всех статичесикх объектов, которые присутствуют на этой странице. Получается довольно круто: не нужно очищать кэш для тяжелых страниц при смене одной картинки. Можно грохнуть объект кэша именно для этой картинки.

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

ссылка на оригинал статьи http://habrahabr.ru/post/216265/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *