Вы уже настроили Nginx как reverse proxy, увеличили memory_limit, настроили PHP-FPM и добавили кэширование через FastCGI? Отлично, но ваш сайт всё ещё может тормозить под нагрузкой. Проблема в том, что WordPress каждую секунду выполняет сотни запросов к базе данных, и это узкое место даже на продакшн-стеке.
В этом руководстве мы разберём, как использовать Redis Object Cache для ускорения WordPress в 3-5 раз. Это не просто «ещё один кэш», а решение, которое сокращает количество запросов к MySQL/MariaDB на 70-90%.
Почему Redis, а не Memcached или APCu?
Сравним основные кэш-хранилища для WordPress:
- Redis — хранит данные в оперативной памяти, поддерживает сложные структуры данных (хэши, списки, множества), работает как кэш и как БД
- Memcached — только простые ключ-значение, нет персистентности, не поддерживает сложные структуры
- APCu — кэш только для одного процесса PHP, не работает в кластере
Для WordPress-сайтов с высокой нагрузкой Redis — лучший выбор. Он поддерживает:
- Кэширование объектов (постов, терминов, пользователей)
- Кэширование запросов (query cache)
- Кэширование сессий (если настроен)
- Очереди задач (для асинхронных операций)
Как Redis ускоряет WordPress
Без Redis WordPress выполняет запросы к базе данных для:
- Каждого поста в списке
- Каждого термина таксономии
- Каждого пользователя
- Каждого настройки плагина
С Redis эти данные хранятся в оперативной памяти и доступны за 0.1-0.5 мс вместо 10-50 мс для MySQL. Это уменьшает нагрузку на базу данных и ускоряет сайт.
Шаг 1: Установка Redis на сервер
Для начала установим Redis-сервер на ваш VPS:
# Установка Redis
sudo apt update && sudo apt install -y redis-server
# Включение автозапуска
sudo systemctl enable --now redis-server
# Проверка работы
redis-cli ping
# Должно вернуть PONGБазовая настройка Redis
Редактируем конфигурационный файл:
sudo nano /etc/redis/redis.confВажные параметры:
# Ограничение использования памяти (50% от RAM)
maxmemory 2gb
maxmemory-policy allkeys-lru
# Включение персистентности (опционально)
save 900 1
save 300 10
save 60 10000# Применяем изменения
sudo systemctl restart redis-serverШаг 2: Настройка WordPress для Redis
Теперь подключим WordPress к Redis. Для этого установим плагин и настроим wp-config.php.
Установка плагина Redis Object Cache
Через wp-cli (рекомендуется):
cd /var/www/wordpress/wp-content/plugins
wget https://downloads.wordpress.org/plugin/redis-cache.latest-stable.zip
unzip redis-cache.latest-stable.zip
rm redis-cache.latest-stable.zipИли через админку WordPress → Плагины → Добавить новый → Поиск «Redis Object Cache».
Настройка wp-config.php
Добавьте в wp-config.php (перед строкой «That’s all, stop editing!»):
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', '' );
define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_CACHE_KEY_SALT', 'custom-code-ru:' );Шаг 3: Активация и настройка кэширования
Перейдите в админку WordPress → Настройки → Redis → Enable Object Cache.
После активации проверьте статус:
// Создайте файл в корне сайта
<?php
echo wp_cache_get( 'test', 'test' ) ? 'Кэш работает' : 'Кэш не работает';
wp_cache_set( 'test', 'test', 'test' );
?>Критически важные настройки:
- Enable Object Cache — включает основное кэширование
- Enable Object Cache for Admin — кэширует запросы в админке (опционально)
- Enable Group Caching — включает кэширование по группам
- Enable Redis Object Cache Debugging — временно включите для отладки
Шаг 4: Интеграция с Nginx (ускорение в 2 раза)
Ранее мы настроили FastCGI-кэш на уровне Nginx, но это кэширует только HTML-страницы. Чтобы кэшировать и объекты WordPress, добавим кэширование через Redis.
Создадим конфиг Nginx:
location / {
try_files $uri $uri/ /index.php?$args;
# Кэширование статики
expires 30d;
add_header Cache-Control "public, immutable";
}
# Кэширование динамических страниц через Redis
location ~* \.php$ {
set $no_cache 0;
# Не кэшировать админку и формы
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap") {
set $no_cache 1;
}
# Кэширование через Redis
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
# Передача информации о кэше в заголовок
add_header X-Redis-Cache $upstream_cache_status;
}Добавим в конфиг Redis Object Cache:
// Добавьте в wp-config.php
define( 'WP_REDIS_OBJECT_CACHE', true );
define( 'WP_REDIS_DATABASE', 1 );
define( 'WP_REDIS_MAX_KEYS', 1000 );
define( 'WP_REDIS_MAX_EXPIRY', 300 ); // 5 минутШаг 5: Проверка работы кэширования
После настройки проверьте, что кэш работает:
Через wp-cli:
wp redis info
# Должен вернуть информацию о состоянии кэшаЧерез Query Monitor:
Установите плагин Query Monitor и проверьте:
- Количество запросов к БД должно упасть с 200-300 до 10-20
- Среднее время запроса должно уменьшиться с 10-50 мс до 0.1-0.5 мс
Через браузер:
Добавьте в .htaccess:
# Добавление заголовка кэширования
Header set X-Redis-Cache "%{REDIS_CACHE}e" env=REDIS_CACHEПосле этого при каждом запросе в ответе будет заголовок X-Redis-Cache: HIT или X-Redis-Cache: MISS.
Шаг 6: Автоматическая очистка кэша
WordPress должен автоматически очищать кэш при обновлении постов, комментариев и настроек. Для этого:
В wp-config.php:
// Автоматическая очистка кэша при обновлении
add_action( 'save_post', 'wp_cache_flush' );
add_action( 'comment_post', 'wp_cache_flush' );
add_action( 'wp_update_comment', 'wp_cache_flush' );
add_action( 'delete_comment', 'wp_cache_flush' );
add_action( 'switch_theme', 'wp_cache_flush' );Или через плагин:
Установите плагин «Redis Object Cache Clear» и настройте триггеры очистки кэша.
Шаг 7: Расширенная настройка
Для продакшн-сайтов добавим расширенные настройки:
Увеличение срока хранения кэша для статических объектов:
// Добавьте в wp-config.php
function redis_object_cache_set_ttl( $group, $key, $ttl ) {
if ( in_array( $group, [ 'posts', 'terms', 'users' ] ) ) {
return 3600; // 1 час
}
return $ttl;
}
add_filter( 'redis_object_cache_set_ttl', 'redis_object_cache_set_ttl', 10, 3 );Настройка кэширования для WooCommerce:
// Добавьте в wp-config.php
add_filter( 'redis_object_cache_groups', function( $groups ) {
$groups[] = 'woocommerce';
$groups[] = 'wc_session';
$groups[] = 'wc_transients';
return $groups;
} );Чек-лист для оптимальной работы
- Redis установлен и работает (проверьте через
redis-cli ping) - Плагин Redis Object Cache активирован
- wp-config.php содержит правильные настройки
- Кэш работает (проверьте через Query Monitor)
- Кэш автоматически очищается при обновлениях
- Настроено кэширование для WooCommerce (если используется)
- Проверена работа кэша через
X-Redis-Cacheзаголовок - Настроены лимиты памяти в Redis (maxmemory)
Что делать, если кэш не работает?
Кэш работает, но сайт медленно грузится
Если количество запросов к БД уменьшилось, но сайт всё ещё медленный:
- Проверьте Frontend-оптимизацию (Lighthouse, GTmetrix)
- Убедитесь, что Nginx правильно кэширует статику
- Проверьте, что JavaScript/CSS оптимизированы
- Используйте плагин «Perfmatters» для отключения ненужных скриптов
Ошибка «Redis server went away»
Это означает, что WordPress не может подключиться к Redis. Проверьте:
- Работает ли Redis:
sudo systemctl status redis-server - Правильный ли хост и порт в wp-config.php
- Не блокирует ли брандмауэр порт 6379
- Достаточно ли памяти на сервере (проверьте через
free -h)
Сайт не обновляется после изменений
Если вы обновили пост, но изменения не отображаются:
- Проверьте, что кэш автоматически очищается
- Убедитесь, что в wp-config.php нет ошибок в настройках кэширования
- Попробуйте вручную очистить кэш через админку
Сравнение скорости до и после Redis
| Метрика | Без Redis | С Redis |
|---|---|---|
| Количество запросов к БД | 250-300 | 10-20 |
| Среднее время запроса к БД | 15-50 мс | 0.1-0.5 мс |
| Время загрузки страницы | 1.2-2.5 с | 0.3-0.6 с |
| Нагрузка на сервер | Высокая | Низкая |
Что дальше: ускорение через Redis Cluster
Если ваш сайт выходит за пределы одного сервера, настройте Redis Cluster для распределения нагрузки и отказоустойчивости:
# Установка Redis Cluster
sudo apt install -y redis-cli
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1В wp-config.php укажите несколько хостов:
define( 'WP_REDIS_SERVERS', [
'tcp://192.168.1.1:6379',
'tcp://192.168.1.2:6379',
'tcp://192.168.1.3:6379'
] );
define( 'WP_REDIS_CLUSTER', true );Это позволяет масштабироваться до миллионов запросов в минуту.
Перелинковка с другими статьями
- Если вы настроили Nginx reverse proxy, но сайт всё ещё медленный — посмотрите, как Nginx работает в связке с Redis
- Если у вас проблемы с memory_limit, Redis поможет снизить нагрузку на PHP-FPM
- Если сайт падает с кодом 137 в Docker, правильная настройка Redis предотвратит переполнение памяти
Выводы
Redis Object Cache — это обязательный компонент для любого продакшн-сайта WordPress. Он:
- Сокращает количество запросов к базе данных на 70-90%
- Ускоряет время загрузки страницы в 3-5 раз