Как ускорить WordPress с помощью NGINX FastCGI Cache: полное руководство 2026
Что такое FastCGI Cache и почему он важен
FastCGI Cache – это встроенный в NGINX механизм, который сохраняет готовый HTML‑ответ от PHP‑FPM в памяти или на диске. При повторных запросах сервер отдает кешированный файл без обращения к PHP, что сокращает время отклика от 300 мс до 30‑50 мс. Для WordPress, где большинство страниц генерируются динамически, такой уровень микрокеширования дает прирост производительности до 5‑6×.
Подготовка сервера: установка NGINX и PHP‑FPM
Перед тем как включать кэш, убедитесь, что ваш стек поддерживает нужные модули:
# Ubuntu 22.04
sudo apt update && sudo apt install nginx php-fpm
# Проверяем, что модуль fastcgi_cache доступен
nginx -V | grep -o with-http_fastcgi_module Если модуль отсутствует, переустановите NGINX из официальных репозиториев или соберите его с опцией --with-http_fastcgi_module.
Базовая конфигурация FastCGI Cache для WordPress
Создание зоны кэша
В /etc/nginx/nginx.conf объявляем область кэша размером 1 ГБ и путь для файлов:
http {
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=wp_cache:100m max_size=1g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
...
} Параметр keys_zone задаёт размер памяти, в которой хранятся метаданные кэша. Размер 100 МБ достаточно для 10‑15 тыс. записей.
Кешировать статические запросы WordPress
В файл конфигурации сайта /etc/nginx/sites-available/example.com добавляем блок location ~ .php$ и включаем кэш:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_cache wp_cache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
}
# Исключения (см. ниже)
include /etc/nginx/conf.d/fastcgi_exceptions.conf;
}
Теперь все GET‑запросы к PHP‑скриптам будут кэшироваться на 10 минут, если ответ имеет статус 200, 301 или 302.
Исключения: как не кешировать динамические части
Кешировать админку, корзину WooCommerce, пользовательские запросы нельзя – иначе изменения не отразятся. Добавляем файл fastcgi_exceptions.conf:
set $skip_cache 0;
# Не кешировать админскую часть
if ($request_uri ~* "^/wp-(admin|login|cron).php") {
set $skip_cache 1;
}
# WooCommerce: корзина, чек-аут, аккаунт
if ($request_uri ~* "^/?(.*&)?wc-ajax=|/cart|/checkout|/my-account") {
set $skip_cache 1;
}
# Прямые запросы к REST API
if ($request_uri ~* "^/wp-json/") {
set $skip_cache 1;
}
# Пользовательские куки (например, logged_in)
if ($http_cookie ~* "wordpress_logged_in_") {
set $skip_cache 1;
}
Эти правила гарантируют, что кэш будет обходиться для всех динамических страниц, а статический контент – сохраняться.
Управление кэшем: очистка и автоматическое обновление
Purge через запрос к специальному URL
Самый простой способ – добавить эндпоинт, который будет удалять кеш конкретного URL. В functions.php темы вставляем PHP‑код:
add_action( 'init', function() {
if ( ! is_user_logged_in() || ! current_user_can('manage_options') ) return;
if ( isset($_GET['purge_cache']) && $_GET['purge_cache'] === '1' && !empty($_GET['url']) ) {
$url = esc_url_raw($_GET['url']);
$hash = md5("GET" . parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH));
$cache_file = "/var/run/nginx-cache/" . substr($hash, 0, 1) . "/" . substr($hash, 1, 1) . "/" . $hash;
if (file_exists($cache_file)) {
unlink($cache_file);
}
}
});
Вызов https://example.com/?purge_cache=1&url=https://example.com/ удалит кеш главной страницы.
Cron‑задача для периодической очистки устаревшего кэша
Создаём системный cron, который будет удалять файлы старше 24 ч:
# /etc/cron.d/nginx-cache-clean
0 * * * * root find /var/run/nginx-cache -type f -mmin +1440 -delete Эта задача запускается каждый час и гарантирует, что диск не заполняется старыми файлами.
Тонкая настройка и отладка
Для контроля эффективности кэша включаем логирование:
log_format cache_status '$remote_addr - $remote_user [$time_local] "$request" '
'Cache:$upstream_cache_status "$http_user_agent"';
access_log /var/log/nginx/access_cache.log cache_status; В логе вы увидите статусы HIT, MISS и BYPASS. Анализируя их, можно подправить правила исключений.
Не забывайте про совместимость с другими плагинами. Например, Lazy Loading WordPress генерирует динамические изображения; их тоже лучше исключить из кэша, добавив правило if ($uri ~* "-lazy.jpg$") { set $skip_cache 1; }.
Для мобильных пользователей рекомендуется включить mobile‑friendly адаптивные шаблоны, а кэшировать их отдельно, используя переменную $http_user_agent в ключе кэша.
Если вы активно используете Gutenberg reusable blocks, убедитесь, что их изменения не кэшируются: добавьте if ($request_uri ~* "block‑preview") { set $skip_cache 1; }.
Наконец, защита от SEO‑спама и DDoS‑атак реализуется через специальные правила в NGINX, которые могут конфликтовать с FastCGI Cache. Тщательно проверяйте порядок директив.
Проверяем результат
После перезагрузки NGINX (sudo systemctl reload nginx) откройте страницу в браузере и посмотрите заголовок X-Cache-Status (если вы его добавили). Идеальный результат – HIT уже после первого полного запроса. Используйте инструменты curl -I или webpagetest.org для измерения времени до первого байта (TTFB).
С помощью FastCGI Cache ваш WordPress станет в 3‑5 раз быстрее, а нагрузка на PHP‑FPM существенно снизится. При правильных исключениях и регулярной очистке кэша вы избежите проблем с динамическим контентом и сохраните пользовательский опыт на высоте.
❓ Часто задаваемые вопросы
Как проверить, что FastCGI Cache действительно работает?
Выполните запрос curl -I https://example.com/ и найдите заголовок X-Cache-Status (HIT, MISS или BYPASS). Также можно смотреть лог access_cache.log с параметром $upstream_cache_status.
Можно ли использовать FastCGI Cache вместе с плагином WP Rocket?
Да, но рекомендуется отключить кэширование страниц в плагине, оставив только минификацию и отложенную загрузку, чтобы не возникало конфликтов двойного кэширования.
Как настроить отдельный кэш для мобильных устройств?
Добавьте в fastcgi_cache_key переменную $http_user_agent или используйте отдельную зону кэша, например fastcgi_cache_path … keys_zone=wp_cache_mobile:50m; и условие if ($http_user_agent ~* "Mobile") { fastcgi_cache wp_cache_mobile; }.
Что делать, если после включения кэша страницы не обновляются после публикации записи?
Убедитесь, что в правилах исключений нет конфликтов, а также реализуйте автоматический purge через хук save_post или используйте готовый скрипт, который очищает кэш конкретного URL после публикации.