WordPress должен летать, а не медитировать

Васисуалий Пупкевич однажды прочитал, что Redis ускоряет WordPress. Нашёл плагин Redis Object Cache, установил, нажал «Включить» — и с видом человека, только что оптимизировавшего высоконагруженный сервис, пошёл пить кофе. Сайт, разумеется, не ускорился ни на миллисекунду. Потому что Redis — это не плагин, а отдельный сервис на сервере, который сначала нужно установить, настроить и подружить с PHP, и только потом подключать плагином. Поразмыслив, Васисуалий делегировал задачу Web-team Форсаж. Сайт взлетел. Кофе теперь пьётся заслуженно. Дальше — как повторить этот трюк своими руками, шаг за шагом.

Что такое Redis и зачем он WordPress

Redis (Remote Dictionary Server) — это молниеносное хранилище данных прямо в оперативной памяти сервера. Пока MySQL каждый раз честно лезет на диск за одними и теми же данными, Redis держит их в RAM и отдаёт быстрее, чем вы успеете моргнуть.

Для WordPress это даёт конкретные и измеримые плюсы:

  • Меньше запросов к базе данных — повторяющиеся запросы отдаются из кеша, MySQL отдыхает
  • Быстрее генерация страниц — PHP не пересчитывает то, что уже посчитано минуту назад
  • Меньше нагрузка на сервер — особенно заметно при всплесках трафика
  • Кеш переживает перезапуск PHP-FPM — в отличие от встроенного object cache WordPress, который живёт только в рамках одного запроса и забывает всё сразу после него

Как это работает в связке — наглядно видно на схеме: гости получают страницы через кеш, администраторы идят напрямую (чтобы не видеть устаревшую версию своих же правок), MySQL занимается только тем, чем действительно должен заниматься.

Двойное кеширование: Redis + WP Super Cache

Шаг 1. Установка Redis

Обновляем пакеты и устанавливаем Redis:

sudo apt update
sudo apt install -y redis-server

Теперь настраиваем конфигурацию. Подключаемся через FTP-клиент под root, скачиваем файл /etc/redis/redis.conf и открываем в текстовом редакторе.

Находим и редактируем следующие строки (некоторые нужно раскомментировать, убрав #):

maxmemory 1gb
maxmemory-policy allkeys-lru
bind 127.0.0.1
requirepass ВАШ_СЛОЖНЫЙ_ПАРОЛЬ

Что означает каждая настройка:

maxmemory 1gb — жёсткий лимит памяти для Redis. Без него он может незаметно съесть всю доступную RAM и устроить на сервере несанкционированный банкет.

maxmemory-policy allkeys-lru — когда память заканчивается, Redis удаляет давно неиспользуемые ключи. Самая разумная стратегия для WordPress-кеша.

bind 127.0.0.1 — Redis слушает только локальные подключения. Снаружи — закрыт наглухо, и это правильно.

requirepass — пароль для подключения. Не «12345», не «password», не имя кота. Redis и так доступен только локально, но без пароля — это дверь без замка в квартире без сигнализации.

Сохраняем файл, загружаем обратно и перезапускаем Redis:

sudo systemctl restart redis-server
sudo systemctl enable redis-server

Проверяем, что Redis живой:

redis-cli -a ВАШ_СЛОЖНЫЙ_ПАРОЛЬ --no-auth-warning ping
redis-cli -a ВАШ_СЛОЖНЫЙ_ПАРОЛЬ --no-auth-warning info memory

Должны получить PONG и статистику по памяти. Если ввести команду без ключа -a — Redis молча проигнорирует запрос: пароль-то мы уже поставили, и он это всерьёз.

Шаг 2. PHP-расширение Redis

Redis установлен, но PHP о его существовании пока ничего не знает — они как соседи по подъезду, которые ни разу не здоровались.

Сначала уточните версию PHP, которая включена именно для вашего сайта — не в Hestia в целом, а конкретно для домена. Удобнее всего проверить через phpinfo.php — подробнее в нашем посте → Как проверить версию PHP через phpinfo.

Устанавливаем расширение для нужной версии (в примере — PHP 8.3):

sudo apt install -y php8.3-redis
sudo systemctl restart php8.3-fpm

Теперь соседи знакомы и общаются напрямую.

Шаг 3. Плагин Redis Object Cache

Устанавливаем плагин Redis Object Cache (автор — Tillman Tillet) через WP-CLI. Почему через WP-CLI, а не кликами в админке — объясняем в посте → Как запустить WordPress в режиме терминатора.

wp plugin install redis-cache --activate --path=/home/wphestia/web/ВАШ_САЙТ.РУ/public_html/ --allow-root

Добавляем настройки подключения в wp-config.php — перед строкой /* That's all, stop editing! */:

// Redis Object Cache
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', 'ВАШ_СЛОЖНЫЙ_ПАРОЛЬ' );
define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );
define( 'WP_REDIS_MAXTTL', 86400 );
define( 'WP_REDIS_SELECTIVE_FLUSH', true );
define( 'WP_CACHE_KEY_SALT', 'ВАШСАЙТ_' );

Параметр WP_CACHE_KEY_SALT — уникальный префикс ключей кеша. Особенно важен, если на сервере несколько сайтов: без него они будут делить одно пространство ключей и путать чужие данные со своими — а это уже не оптимизация, а коммунальная квартира.

Включаем кеш:

wp redis enable --path=/home/wphestia/web/ВАШ_САЙТ.РУ/public_html

Шаг 4. Двойное кеширование: Redis + WP Super Cache

Redis и WP Super Cache не конкурируют — они работают в паре и закрывают разные задачи:

  • WP Super Cache кеширует готовые HTML-страницы и отдаёт их гостям без запуска PHP вообще
  • Redis кеширует объекты PHP — запросы к базе данных, транзиенты, результаты вычислений

Вместе они образуют двойной щит: молниеносно для гостей, разумно для всего остального.

В настройках WP Super Cache переходим на вкладку Расширенные и выставляем параметры как на скриншотах:

Настройки WP Super Cache

настройках WP Super Cache переходим на вкладку Расширенные и выставляем параметры

Ключевые настройки:

  • Метод доставки кеша: Эксперт — более эффективная доставка через прямые файлы
  • Отключить кеширование для авторизованных пользователей — администраторы всегда видят живой сайт, а не вчерашнюю кешированную версию
  • Не кешировать страницы с параметрами GET — защита от проблем с динамическими URL
  • Сжимать файлы кеша — дополнительное ускорение отдачи
  • Очистить все файлы кеша при публикации или обновлении — чтобы после сохранения поста посетители видели актуальную версию, а не призрак старой статьи

Правила в .htaccess: почему они работают на связке Nginx + Apache2

После сохранения настроек WP Super Cache автоматически записывает блок правил в .htaccess в корне сайта. Выглядит устрашающе:

# BEGIN WPSuperCache
# Директивы (строки) между `BEGIN WPSuperCache` и `END WPSuperCache`
# созданы автоматически и подлежат изменению только через фильтры WordPress.
# Сделанные вручную изменения между этими маркерами будут перезаписаны.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
AddDefaultCharset UTF-8
RewriteCond %{REQUEST_URI} !^.*[^/]$
RewriteCond %{REQUEST_URI} !^.*//.*$
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html.gz -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html.gz" [L]
RewriteCond %{REQUEST_URI} !^.*[^/]$
RewriteCond %{REQUEST_URI} !^.*//.*$
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTPS} !on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html.gz -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html.gz" [L]
RewriteCond %{REQUEST_URI} !^.*[^/]$
RewriteCond %{REQUEST_URI} !^.*//.*$
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTPS} on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index-https.html" [L]
RewriteCond %{REQUEST_URI} !^.*[^/]$
RewriteCond %{REQUEST_URI} !^.*//.*$
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP:Cookie} !^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$
RewriteCond %{HTTP:X-Wap-Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]
RewriteCond %{HTTPS} !on
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html -f
RewriteRule ^(.*) "/wp-content/cache/supercache/%{SERVER_NAME}/$1/index.html" [L]
</IfModule>
# END WPSuperCache

На первый взгляд — портянка, от которой хочется закрыть ноутбук и уйти жить в лес. Но логика простая: каждый блок проверяет набор условий, и если все совпали — отдаёт готовый кешированный файл напрямую, вообще не запуская PHP. Последовательно проверяются четыре варианта: сжатый HTTPS, сжатый HTTP, несжатый HTTPS, несжатый HTTP — на любой вкус браузера.

Ключевые условия в каждом блоке:

  • Запрос не к файлу без слеша — только «чистые» URL
  • Метод запроса не POST — формы кешу не интересны
  • Пустая строка запроса — никаких GET-параметров
  • Нет куки авторизации — залогиненые идят напрямую, минуя кеш
  • Кешированный файл физически существует на диске

Почему это работает на связке Nginx + Apache2? В Hestia CP Nginx выступает как reverse proxy и принимает все входящие запросы первым. Статику (картинки, CSS, JS) Nginx отдаёт сам, не отвлекая Apache по пустякам. Динамические запросы проксирует в Apache, а тот уже честно читает .htaccess и применяет правила mod_rewrite. Так что снаружи всё выглядит как «Nginx-сервер», но директивы .htaccess от WP Super Cache прекрасно работают — их обрабатывает Apache во втором эшелоне обороны.

Если блок WPSuperCache в .htaccess после сохранения настроек не появился сам — зайдите на вкладку Простые и нажмите Обновить правила .htaccess вручную. Иногда плагин стесняется писать в файл без личного приглашения.

Финальная проверка

Подождите 1-2 минуты после настройки, затем проверяем, что кеш действительно наполняется:

# Сколько ключей накопилось
redis-cli -a 'ВАШ_СЛОЖНЫЙ_ПАРОЛЬ' dbsize

# Сколько памяти занято
redis-cli -a 'ВАШ_СЛОЖНЫЙ_ПАРОЛЬ' info memory | grep used_memory_human

# Живой мониторинг запросов (Ctrl+C для выхода)
redis-cli -a 'ВАШ_СЛОЖНЫЙ_ПАРОЛЬ' monitor

Проверка исключения администраторов. Зайдите на сайт под своей администраторской учёткой и выполните:

redis-cli -a 'ВАШ_СЛОЖНЫЙ_ПАРОЛЬ' monitor 2>/dev/null | grep -v "ВАШСАЙТ_"

При действиях залогиненого администратора новые ключи с пользовательскими данными создаваться не должны — плагин автоматически обходит кеш для авторизованных пользователей. Если создаются — что-то настроено не так, и самое время звать Web-team Форсаж, а не гадать на кофейной гуще.

Статистика в админке. Перейдите в wp-admin → Settings → Redis — там график соотношения попаданий и промахов кеша. После прогрева нормальный показатель: 60-90% hits. Меньше — либо кеш ещё не прогрелся, либо в настройках закралась ошибка.

Redis настроен, двойное кеширование работает, сайт летит. Васисуалий доволен, и, естественно, по-прежнему уверен, что в следующий раз справится сам.

Часто задаваемые вопросы о Redis
Redis что это?
Redis - это система управления базами данных типа «ключ-значение», которая хранит все данные в оперативной памяти сервера, а не на диске. Благодаря этому чтение и запись происходят на порядки быстрее, чем в классических СУБД вроде MySQL. Для WordPress Redis чаще всего используется как object cache - хранилище часто запрашиваемых данных.
Как подключиться к Redis?
Подключение к Redis выполняется через клиент redis-cli с указанием пароля (если он установлен):
redis-cli -a ВАШ_ПАРОЛЬ --no-auth-warning ping

Для подключения WordPress к Redis используются константы в wp-config.php: WP_REDIS_HOST, WP_REDIS_PORT и WP_REDIS_PASSWORD.
Где Redis хранит данные?
По умолчанию Redis хранит данные в оперативной памяти сервера - это и есть его главное отличие от MySQL и других дисковых СУБД. Для восстановления после перезапуска Redis может периодически сохранять снимки данных на диск (RDB-файлы), но основная работа всегда идёт через RAM.
Redis.conf где находится?
Основной конфигурационный файл Redis на Ubuntu находится по пути /etc/redis/redis.conf. Именно в нём настраиваются лимит памяти, политика вытеснения ключей, пароль доступа и другие параметры сервера.
Redis server что это?
Redis-server - это сам процесс (демон), который запускает и обслуживает работу Redis на сервере. Управляется через systemctl как обычный системный сервис: systemctl start redis-server, systemctl status redis-server и так далее. Именно его наличие в списке процессов подтверждает, что Redis установлен и работает.
Сегодня: 10.11.2026
Дата публикации: 27.07.2026
Дата обновления: 07.11.2026

Оставьте комментарий