cache-purge: Модуль очистки кэша NGINX
Требует подписку Pro (или выше) на GetPageSpeed NGINX Extras.
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-cache-purge
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-cache-purge
Включите модуль, добавив следующее в верхнюю часть файла /etc/nginx/nginx.conf:
load_module modules/ngx_http_cache_purge_module.so;
Этот документ описывает nginx-module-cache-purge v2.5.10, выпущенный 25 марта 2026 года.
Выборочно очищайте содержимое из кэшей FastCGI, proxy, SCGI и uWSGI NGINX с помощью HTTP-запросов PURGE — никаких хака с файловой системой, никаких головных болей с разрешениями.
Эта функция присутствует в NGINX Plus, но ngx_cache_purge приносит её в открытый NGINX.
Ключевые особенности
- Очистка в том же местоположении — добавьте поддержку
PURGEнепосредственно к существующим кэшированным местоположениям, не требуя дополнительных блоковlocation - Очистка с подстановочными знаками — очищайте несколько кэшированных записей с помощью одного запроса, используя
* - Массовая очистка — очищайте весь кэшированный контент сразу с помощью
purge_all - Контроль доступа на основе IP — ограничьте, кто может отправлять запросы на очистку
- Замена метода ключа кэша — очищайте кэшированный контент GET даже когда
$request_methodнаходится в вашем ключе кэша - Настраиваемый формат ответа — получайте результаты очистки в HTML, JSON, XML или обычном тексте
- Все типы кэша — работает с FastCGI, proxy, SCGI и uWSGI
Быстрый старт
Добавьте поддержку PURGE к любому кэшированному местоположению:
http {
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_pass http://127.0.0.1:8000;
proxy_cache my_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_purge PURGE from 127.0.0.1;
}
}
}
Очистите кэшированную страницу:
curl -X PURGE https://example.com/page-to-purge
Вот и всё. Никакого отдельного местоположения /purge, никаких разрешений на файловой системе для управления.
Директивы конфигурации
Синтаксис в том же местоположении (рекомендуется)
Включает очистку непосредственно в местоположении, которое обслуживает кэшированный контент.
fastcgi_cache_purge
- синтаксис:
fastcgi_cache_purge on|off|<method> [purge_all] [from all|<ip> [.. <ip>]] - по умолчанию:
none - контекст:
http,server,location
proxy_cache_purge
- синтаксис:
proxy_cache_purge on|off|<method> [purge_all] [from all|<ip> [.. <ip>]] - по умолчанию:
none - контекст:
http,server,location
scgi_cache_purge
- синтаксис:
scgi_cache_purge on|off|<method> [purge_all] [from all|<ip> [.. <ip>]] - по умолчанию:
none - контекст:
http,server,location
uwsgi_cache_purge
- синтаксис:
uwsgi_cache_purge on|off|<method> [purge_all] [from all|<ip> [.. <ip>]] - по умолчанию:
none - контекст:
http,server,location
Синтаксис отдельного местоположения
Используйте отдельное местоположение для запросов на очистку. Полезно, когда вам нужны разные правила доступа для очистки.
fastcgi_cache_purge
- синтаксис:
fastcgi_cache_purge zone_name key - контекст:
location
proxy_cache_purge
- синтаксис:
proxy_cache_purge zone_name key - контекст:
location
scgi_cache_purge
- синтаксис:
scgi_cache_purge zone_name key - контекст:
location
uwsgi_cache_purge
- синтаксис:
uwsgi_cache_purge zone_name key - контекст:
location
Формат ответа
cache_purge_response_type
- синтаксис:
cache_purge_response_type html|json|xml|text - по умолчанию:
html - контекст:
http,server,location
Пример с JSON-ответами:
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_key "$uri$is_args$args";
proxy_cache_purge PURGE from 127.0.0.1;
cache_purge_response_type json;
}
{"Key": "httplocalhost/"}
Замена метода ключа кэша
Когда $request_method является частью вашего ключа кэша, запросы на очистку генерируют другой ключ (PURGE против GET) и не найдут кэшированную запись. Эти директивы решают эту проблему:
*_cache_purge_key_method
- синтаксис:
fastcgi_cache_purge_key_method <method> [<method> ...] - контекст:
http,server,location
Доступно для всех типов кэша: fastcgi_cache_purge_key_method, proxy_cache_purge_key_method, scgi_cache_purge_key_method, uwsgi_cache_purge_key_method.
location ~ \.php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_purge PURGE from 127.0.0.1;
fastcgi_cache_purge_key_method GET; # Заменяет GET на PURGE в поиске ключа
}
Вы можете указать несколько методов:
fastcgi_cache_purge_key_method GET HEAD;
Интеграция с WordPress
FastCGI Cache + Purge
Полная настройка WordPress с поддержкой кэширования и автоматической очистки:
http {
fastcgi_cache_path /var/cache/nginx levels=1:2
keys_zone=WORDPRESS:100m max_size=1g
inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$host$request_uri";
server {
listen 80;
server_name example.com;
root /var/www/wordpress;
index index.php;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|webp|avif)$ {
expires max;
log_not_found off;
}
location / {
try_files $uri $uri/ /index.php?$args;
fastcgi_cache_purge PURGE from 127.0.0.1;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout updating;
fastcgi_cache_lock on;
fastcgi_cache_purge PURGE from 127.0.0.1;
add_header X-Cache-Status $upstream_cache_status always;
}
}
}
Почему fastcgi_cache_purge в обоих местоположениях? Корневой URL / является особым случаем. Когда try_files проверяет $uri/, он находит каталог корневого документа. Для запросов GET директива index перенаправляет на index.php — но для запросов PURGE index не применяется, и NGINX останавливается на location /. Добавление fastcgi_cache_purge там гарантирует, что PURGE / будет работать.
Плагин очистки кэша прокси
Установите плагин Proxy Cache Purge, чтобы автоматически очищать кэш при обновлении контента:
wp plugin install varnish-http-purge --activate
wp option update vhp_varnish_ip '127.0.0.1'
Плагин отправляет запросы PURGE в NGINX всякий раз, когда посты, комментарии или страницы изменяются — никаких ручных действий по управлению кэшем не требуется.
Рекомендации по ключам кэша
Держите всё просто — избегайте $request_method в ключах
# Рекомендуется
fastcgi_cache_key "$scheme$host$request_uri";
# Избегайте — запросы на очистку не будут соответствовать кэшированным записям GET
fastcgi_cache_key "$scheme$request_method$host$request_uri";
Если вы должны включить $request_method, используйте *_cache_purge_key_method GET, чтобы исправить поиск ключа очистки.
Очистка с подстановочными знаками
Очистите несколько записей, соответствующих шаблону, добавив *:
curl -X PURGE https://example.com/blog/*
Звездочка должна быть последним символом. Для этого $uri должен находиться в конце вашего ключа кэша.
Массовая очистка
Очистите все кэшированные файлы сразу:
proxy_cache_purge PURGE purge_all from 127.0.0.1;
Это может быть медленно при больших кэшах или медленных хранилищах. Используйте пути к кэшу на основе RAM для лучшей производительности.
Контроль доступа на основе IP
Ограничьте запросы на очистку доверенными источниками:
fastcgi_cache_purge PURGE from 127.0.0.1 192.168.1.0/24;
Устранение неполадок
| Ответ | Причина | Исправление |
|---|---|---|
| 405 Not Allowed | PURGE попал в местоположение без *_cache_purge |
Добавьте *_cache_purge во все соответствующие местоположения |
| 412 Precondition Failed | Запись в кэше не найдена (никогда не кэшировалась, уже истекла или несоответствие ключа) | Проверьте ключ кэша — ищите проблемы с $request_method |
| 403 Forbidden | IP клиента не в списке from |
Добавьте свой IP в from |
| 200 OK, но кэш остается | $request_method в ключе кэша создает несоответствующие ключи |
Удалите $request_method из ключа или добавьте *_cache_purge_key_method GET |
Взаимодействие с gzip_vary: Включение gzip_vary может мешать очистке кэша. Если вы испытываете непостоянное поведение очистки, отключите gzip_vary внутри кэшированного местоположения.
Тестирование
ngx_cache_purge включает тестовый набор на основе Test::Nginx:
prove
См. также
- Ускорение WordPress с помощью NGINX Cache Purge — полный справочник по настройке
- NGINX Proxy Cache & Microcaching — основы прокси-кэша
- Документация по NGINX fastcgi_cache_purge — справочник NGINX Plus