Очистка кэша FastCGI: еще один вариант
Nov 13, 2017 10:36 · 333 words · 2 minute read
Ранее мы уже рассматривали настройку кэширования на 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
в зависимости от того, очистился кэш или нет.
Не забудьте исключить данный скрипт из кэширования и ограничить доступ к нему.