Перейти к содержанию

Очистка кеша FastCGI для PHP-FPM

Ультрабыстрое кэширование для WordPress с автоматической, точечной недействительностью кеша.


  • Не требуется прокси


    Кеш FastCGI взаимодействует напрямую с PHP-FPM — без накладных расходов на обратный прокси

  • Ответ в микросекундах


    Кэшированные страницы подаются напрямую из памяти или SSD через NGINX

  • Выборочная очистка


    Очищаются только измененные страницы, остальной кеш остается активным

  • Встроенная безопасность


    Обходит кеш для вошедших пользователей, администраторов и корзин WooCommerce


Когда использовать FastCGI против Proxy Cache

Особенность FastCGI Cache Proxy Cache
Бэкенд PHP-FPM (прямой) Любой HTTP бэкенд
Задержка Меньше (без прокси) Немного выше
Сценарий использования WordPress, PHP приложения Node.js, Python и т.д.
Сложность конфигурации Проще Более гибко

Используйте кеш FastCGI, если вы запускаете WordPress или PHP напрямую на NGINX без слоя обратного прокси.


Быстрая настройка

Шаг 1: Установите необходимые модули

# Установите репозиторий GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Установите модуль очистки кеша
dnf -y install nginx-module-cache-purge

Включите в /etc/nginx/nginx.conf:

load_module modules/ngx_http_cache_purge_module.so;

Шаг 2: Настройте кеш FastCGI

Добавьте в ваш блок http в /etc/nginx/nginx.conf:

# Определение зоны кеша FastCGI
fastcgi_cache_path /var/cache/nginx/fastcgi
                   levels=1:2
                   keys_zone=WORDPRESS:100m
                   max_size=10g
                   inactive=60m
                   use_temp_path=off;

# Ключ кеша (что делает каждую кэшированную страницу уникальной)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Шаг 3: Настройте серверный блок

Создайте или обновите ваш серверный блок WordPress:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;

    # Настройки кеша
    set $skip_cache 0;

    # Не кэшировать POST запросы
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # Не кэшировать URL с параметрами запроса
    if ($query_string != "") {
        set $skip_cache 1;
    }

    # Не кэшировать админку WordPress, вход или определенные пути
    if ($request_uri ~* "/wp-admin/|/wp-login.php|/xmlrpc.php|/wp-cron.php") {
        set $skip_cache 1;
    }

    # Не кэшировать для вошедших пользователей или недавних комментаторов
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $skip_cache 1;
    }

    # Не кэшировать страницы WooCommerce
    if ($request_uri ~* "/cart/|/checkout/|/my-account/") {
        set $skip_cache 1;
    }
    if ($http_cookie ~* "woocommerce_cart_hash|woocommerce_items_in_cart") {
        set $skip_cache 1;
    }

    # Заголовок статуса кеша
    add_header X-Cache-Status $upstream_cache_status;

    # Включить метод PURGE
    fastcgi_cache_purge PURGE from 127.0.0.1;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Кэширование FastCGI
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_valid 404 1m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # Важно для динамического контента
        fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
        fastcgi_cache_lock on;
    }

    # Статические файлы - конфигурация кеширования не требуется
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Создайте директорию кеша и перезагрузите:

mkdir -p /var/cache/nginx/fastcgi
chown nginx:nginx /var/cache/nginx/fastcgi
nginx -t && systemctl reload nginx

Шаг 4: Установите плагин WordPress

  1. Перейдите в Плагины → Добавить новый
  2. Найдите "Proxy Cache Purge"
  3. Установите и активируйте
wp plugin install varnish-http-purge --activate

Настройте плагин:

  1. Перейдите в Настройки → Proxy Cache Purge
  2. Установите Custom IP на 127.0.0.1
  3. Сохраните

Шаг 5: Настройте бэкенд кеша NGINX

Начиная с Proxy Cache Purge 5.9.0, плагин нативно поддерживает формат очистки с подстановочными знаками NGINX. Настройте его для использования бэкенда NGINX:

  1. Перейдите в Proxy Cache Purge → Настройки
  2. В разделе Cache Backend выберите NGINX
  3. Нажмите Сохранить настройки

Добавьте в ваш wp-config.php:

define( 'VHP_PURGE_BACKEND', 'nginx' );
Устаревшее: версия плагина < 5.9.0

Если вы используете Proxy Cache Purge версии ниже 5.9.0, создайте wp-content/mu-plugins/nginx-cache-purge-fix.php:

<?php
/**
 * Имя плагина: Исправление очистки кеша NGINX FastCGI
 * Описание: Добавляет подстановочный знак для очистки всех вариантов кеша
 */
add_filter("vhp_purgeme_path", function($purgeme, $schema, $host, $path, $pregex, $p) {
    if (empty($pregex)) {
        $purgeme .= "*";
    }
    return $purgeme;
}, 10, 6);

Тестирование

# Первый запрос - должен быть MISS
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

# Второй запрос - должен быть HIT
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: HIT

# Очистка кеша
curl -sX PURGE 'http://127.0.0.1/*' -H 'Host: example.com'

# Проверьте, что очищено
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

Как это работает

flowchart LR
    A["👤 Посетитель"] -->|"GET /post/"| B["NGINX"]

    B -->|"Кеш HIT"| C["⚡ Мгновенный ответ"]
    B -->|"Кеш MISS"| D["PHP-FPM"]
    D --> E["WordPress"]
    E --> D
    D -->|"Сохранить в кеш"| B
    B --> C

    style A fill:#667eea
    style B fill:#009639,color:#fff
    style C fill:#48bb78,color:#fff
    style D fill:#4a90d9,color:#fff
    style E fill:#4a90d9,color:#fff

Сравнение производительности

Метрика Без кеша FastCGI Cache
Время ответа 200-500мс 5-20мс
Запросов/сек 50-100 5,000+
Использование CPU Высокое Минимальное
Память Высокая (PHP) Низкая (NGINX)

Влияние в реальном мире

Кеш FastCGI обычно улучшает время ответа WordPress на 10-50 раз и может справляться с пиковыми нагрузками без проблем.


Расширенная конфигурация

Кэширование разных длительностей по типу контента

# Кэшировать страницы на 60 минут
fastcgi_cache_valid 200 60m;

# Кэшировать редиректы на 10 минут
fastcgi_cache_valid 301 302 10m;

# Не кэшировать ошибки долго
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 503 504 0;

Обслуживание устаревшего контента во время ошибок

fastcgi_cache_use_stale error timeout invalid_header
                        updating http_500 http_502 http_503 http_504;

Блокировка кеша для предотвращения "стампед"

fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;

Когда несколько запросов одновременно обращаются к некэшированной странице, только один запрос идет к PHP-FPM. Остальные ждут, пока кеш заполнится.


Устранение неполадок

Страницы не кэшируются

Проверьте переменную $skip_cache. Распространенные проблемы:

  • Параметры запроса на всех URL (некоторые плагины добавляют ?ver= к страницам)
  • Куки устанавливаются на всех страницах
  • Проверьте: curl -sI your-url | grep Set-Cookie
Вошедшие страницы кэшируются

Убедитесь, что проверка куки включает ваши аутентификационные куки:

if ($http_cookie ~* "wordpress_logged_in") {
    set $skip_cache 1;
}
Кеш не очищается
  • Проверьте настройки плагина: Custom IP = 127.0.0.1
  • Убедитесь, что Cache Backend установлен на NGINX (или VHP_PURGE_BACKEND определен в wp-config.php)
  • Протестируйте вручную: curl -X PURGE 'http://127.0.0.1/page/*'

Связанные

  • Руководство по Proxy Cache


    Альтернатива для не-PHP бэкендов

    Proxy Cache

  • Модуль cache-purge


    Полная справка по директивам

    Документация

  • Модуль PageSpeed


    Дополнительный уровень оптимизации

    Документация