Использование модуля ngx_cache_purge для очистки кэша FastCGI
Jul 24, 2017 09:59 · 426 words · 2 minute read
Мы уже упоминали о настройке кэширования на Nginx, рассматривали преимущества и примеры настроек кеширования (в том числе FastCGI), но не затронули такой важный вопрос, как очистка данных из кеша.
Давайте разберемся с очисткой кэша FastCGI в бесплатной версии веб-сервера Nginx с помощью модуля ngx_cache_purge
!
Если в вашем случае кэширование в Nginx настроено с помощью параметра fastcgi_cache
, то наверняка не раз задумывались об автоматической очистке кеша определенной страницы при ее обновлении. Штатная директива fastcgi_cache_purge
, которая может решить данную проблему, к сожалению, доступна только как часть коммерческой подписки Nginx (Nginx+), а в бесплатной версии веб-сервера на помощь нам приходит модуль ngx_cache_purge
.
Прежде всего, необходимо собрать Nginx с поддержкой данного модуля — ранее мы уже использовали самостоятельные сборки (с http2, с ALPN, с brotli
, с PageSpeed), поэтому никаких затруднений быть не должно.
Скачиваем и распаковываем исходники актуальной версии Nginx:
cd /opt/ \
&& wget https://nginx.org/download/nginx-1.13.1.tar.gz \
&& tar xf nginx-1.13.1.tar.gz
Получаем код модуля ngx_cache_purge
:
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz \
&& tar -zxvf ngx_cache_purge-2.3.tar.gz \
&& mv ngx_cache_purge-2.3 ngx_cache_purge \
&& rm ngx_cache_purge-2.3.tar.gz
Находясь в каталоге с исходниками Nginx собираем его:
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' \
--with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--as-needed' \
--add-module=/opt/ngx_cache_purge
make
make install
service nginx restart
Допустим, в секции http
конфигурационного файла /etc/nginx/nginx.conf
у нас уже есть следующие строки:
...
fastcgi_cache_path /var/www/nginx_cache levels=1:2 keys_zone=fcgi:100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
...
Немного изменим настройки сайта (в секции server
для основного хоста) добавив строки:
server {
...
if ($request_method = PURGE) {
set $method GET;
rewrite ^(.*)$ /purge$1 last;
}
...
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/letsclearitup.sock;
fastcgi_hide_header X-Powered-By;
fastcgi_cache fcgi;
fastcgi_cache_min_uses 1;
fastcgi_cache_valid 200 302 1d;
fastcgi_cache_valid 404 1m;
fastcgi_cache_methods GET HEAD;
}
...
location ~ /purge(/.*) {
fastcgi_cache_purge fcgi "$scheme$method$host$1";
}
...
}
Теперь для очистки кэша определенной страницы с помощью модуля ngx_cache_purge
необходимо отправить PURGE-запрос на эту страницу. Сделать это можно, например, с помощью утилиты curl
:
curl -X PURGE -L https://letsclearitup.com.ua/nginx/nastroyka-keshirovaniya-na-nginx.html
Если такая страница была в кэше и его удалось успешно очистить, то результатом данного запроса будет следующее:
Successful purge
Key : httpsGETletsclearitup.com.ua/nginx/nastroyka-keshirovaniya-na-nginx.html
Path: /var/www/nginx_cache/7/9a/9dda1b3118148e6c036a2cf7df6db9a7
nginx
Если страницы в кэше не оказалось, то вы увидите следующее:
404 Not Found
nginx