Очистка кэша FastCGI: еще один вариант

Nov 13, 2017 10:36 · 333 words · 2 minute read nginx

Ранее мы уже рассматривали настройку кэширования на Nginx, упоминали об очистке кэша FastCGI в бесплатной версии веб-сервера Nginx с помощью модуля ngx_cache_purge.

Как оказалось, бывают случаи, когда функционала данного модуля недостаточно или нет возможности пересборки веб-сервера Nginx — давайте разберемся и рассмотрим еще один вариант очистки кэша FastCGI!

Однажды я столкнулся с тем, что функционал модуля ngx_cache_purge позволял чистить кэш страницы только частично. Это было связано со специфическим значением директивы fastcgi_cache_key, который в рассматриваемом случае выглядел так:

...
        fastcgi_cache_key "$scheme$request_method$host$request_uri$allowed_country";
...

Мы знаем, что имена кэша основываются на переменных директивы fastcgi_cache_key. Значение последней переменной ($allowed_country) определяется с помощью GeoIP и содержит двухбуквенный код страны, с которой происходит запрос к сайту.

Примечание. Читайте также Nginx + GeoIP: блокировка пользователей из определенных стран.

Таким образом, при запросе страницы http://example.com/test.php с украинского ip-адреса будет сформировано следующее имя кэша:

fastcgi_cache_key "httpGETexample.com/test.phpUA";

После хеширования этой строки в MD5 получилось бы следующее:

b57290d1cda3bf4187dcd7fc68fae2db

В соотношении с подкаталогами, указанными в levels=1:2, первый уровень каталога в этой строке MD5 будет обозначен последним символом строки (в данном примере это символ b). Второму уровню принадлежат следующие после первого уровня 2 символа (2d). Таким образом, вся структура каталогов нашей кэш-зоны будет такой:

/var/tmp/nginx_cache/b/2d/b57290d1cda3bf4187dcd7fc68fae2db

Для пользователя, посетившего сайт с российского ip-адреса получится соответственно:

5b5d5cfc3aba90a81ecb7fddf0d8259d

и

/var/tmp/nginx_cache/d/59/5b5d5cfc3aba90a81ecb7fddf0d8259d

Зная структуру каталогов кэш-зоны, можно легко создать скрипт очистки кэша (в данном примере используется PHP). В корневой директории сайта создайте файл cleancache.php следующего содержания:

<?php
$cache_path = '/var/tmp/nginx_cache/';
$url = parse_url($_POST['url']);
 
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
 
$hash_ua = md5($scheme.'GET'.$host.$requesturi.'UA');
$hash_ru = md5($scheme.'GET'.$host.$requesturi.'RU');
// Выводим хэш MD5 для отладки
var_dump($hash_ua);
var_dump($hash_ru);
 
var_dump(unlink($cache_path . substr($hash_ua, -1) . '/' . substr($hash_ua,-3,2) . '/' . $hash_ua));
var_dump(unlink($cache_path . substr($hash_ru, -1) . '/' . substr($hash_ru,-3,2) . '/' . $hash_ru));
?>

Теперь можно отправить POST-запрос на этот файл с URL, который нужно очистить, в качестве параметра:

curl -d 'url=http://example.com/url-for-clean.php' http://example.com/cleancache.php

В результате выполнения скрипта вы увидите в консоли true или false в зависимости от того, очистился кэш или нет.

Не забудьте исключить данный скрипт из кэширования и ограничить доступ к нему.

tweet Share