Очистка кеша 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
- Перейдите в Плагины → Добавить новый
- Найдите "Proxy Cache Purge"
- Установите и активируйте
wp plugin install varnish-http-purge --activate
Настройте плагин:
- Перейдите в Настройки → Proxy Cache Purge
- Установите Custom IP на
127.0.0.1 - Сохраните
Шаг 5: Настройте бэкенд кеша NGINX
Начиная с Proxy Cache Purge 5.9.0, плагин нативно поддерживает формат очистки с подстановочными знаками NGINX. Настройте его для использования бэкенда NGINX:
- Перейдите в Proxy Cache Purge → Настройки
- В разделе Cache Backend выберите NGINX
- Нажмите Сохранить настройки
Добавьте в ваш 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 бэкендов
-
Модуль cache-purge
Полная справка по директивам
-
Модуль PageSpeed
Дополнительный уровень оптимизации