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

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

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


  • Прокси не требуется


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

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


    Закэшированные страницы обслуживаются напрямую из памяти или SSD через NGINX

  • Селективная очистка


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

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


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


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

Особенность Кеш FastCGI Прокси кеш
Бэкенд 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
Время ответа 200-500ms 5-20ms
Запросы/сек 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= к страницам)
  • Cookies, устанавливаемые на всех страницах
  • Проверьте: curl -sI your-url | grep Set-Cookie
Вошедшие страницы кешируются

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

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/*'

Связанные