Очистка кэша FastCGI в Nginx

Дата: 23.01.2016Метки:

Если у вас в Nginx настроено кэширование с помощью параметра fastcgi_cache, то вы наверняка задумывались над реализацией функции, которая каждый раз при обновлении страниц сайта выполняла бы автоматическую очистку. Для этих целей в Nginx предусмотрена штатная директива fastcgi_cache_purge, которая задает условия для использования запроса на очистку кэша.

Проблема заключается в том, что использование директивы fastcgi_cache_purge доступно только как часть коммерческой подписки Nginx. Как альтернативное решение я предлагаю использовать модуль ngx_cache_purge. Нужно отметить, что кроме fastcgi модуль поддерживает очистку Proxy, SCGI и uWSGI кэш в Nginx.

Для очистки кэша на стороне CMS должна работать специальная функция, которая при каждом обновлении будет отправлять серверу специально сформированных запрос. В этой статье я расскажу о использовании директивы fastcgi_cache_purge на примере WordPress, для которого уже есть готовый плагин.

Чтобы добавить поддержку директивы fastcgi_cache_purge нам необходимо собрать Nginx из исходников. В своей предыдущей статье я уже описывал процесс сборки Nginx из исходников. Из этой инструкции вам необходимо выполнить все пункту предшествующие процессу сборки пакета. Если кратко, то у вас должны быть загружены исходники Nginx и все необходимы для сборки пакеты.

Далее загружаем и распаковываем исходники модуля ngx_cache_purge:

# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
# tar -xzf ngx_cache_purge-2.3.tar.gz

Откройте файл, отвечающий за параметры сборки пакета:

# nano /tmp/nginx-1.9.9/debian/rules

В этом файле нужно найдти секцию override_dh_auto_build и добавить в конец директиву --add-module, которая указывает на директорию размещения модуля ngx_cache_purge:

CFLAGS="" ./configure \
        --prefix=/etc/nginx \
        --sbin-path=/usr/sbin/nginx \
        --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_HTTP2) \
        --with-cc-opt="$(CFLAGS)" \
        --with-ld-opt="$(LDFLAGS)" \
        --add-module=/usr/src/ngx_cache_purge-2.3
dh_auto_build

Сохраняем файл, переходим в корень каталога с исходниками Nginx и запускаем команду сборки пакета:

# cd /usr/src/nginx-1.9.9
# dpkg-buildpackage -rfakeroot -uc -b

Команда выполнит компиляцию исходников и автоматически соберет deb-пакет nginx_1.9.3-1~jessie_i386.deb. Установим Nginx запустив команду:

# dpkg -i nginx_1.9.3-1~jessie_i386.deb

Откройте файл и измените настройки виртуального хоста Nginx. Добавьте в секцию server, который будет отвечать за функцию очистки кэша FastCGI:

location ~ /purge(/.*) {
    fastcgi_cache_purge KEYS_ZONE_NAME "$scheme$request_method$host$1";
}

Чтобы работала функция очистки кэша, вам необходимо заменить KEYS_ZONE_NAME на свое значение параметра keys_zone. Проверяем конфигурацию и применяем настройки Nginx. Для Debian/Ubuntu выполните команды:

# nginx -t
# service nginx reload

И последний шаг. В админке WordPress установите плагин Nginx Helper.