Использование модуля ngx_cache_purge для очистки кэша FastCGI

Jul 24, 2017 09:59 · 426 words · 2 minute read nginx

Мы уже упоминали о настройке кэширования на 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
tweet Share