Как настроить OPcache и object cache на WordPress на VDS

Если WordPress на VDS начал медленнее открывать админку, а фронтенд упирается в PHP и запросы к базе, первым делом стоит смотреть не на тему и не на плагины, а на кеширование на уровне сервера. В типичном стеке это два разных слоя: OPcache для PHP-кода и object cache для повторяющихся запросов к данным WordPress.

Эти вещи часто путают. OPcache ускоряет выполнение PHP, а object cache уменьшает число обращений к базе данных и повторных вычислений внутри WordPress. На VDS они особенно полезны, потому что ресурсы ограничены и лишние запросы быстро становятся заметны.

Когда проблема именно в кешировании, а не в теме или плагинах

Перед настройкой полезно понять, что вы вообще лечите. Если сайт тормозит только после входа в админку, при открытии списков записей, страниц редактирования или при повторных переходах по одним и тем же страницам, кеширование может дать заметный эффект. Если же у вас ошибки PHP, тяжелые запросы от конкретного плагина или перегруженный сервер, кеш не исправит первопричину, но снизит нагрузку.

Признаки, что OPcache и object cache стоит проверить в первую очередь

  • страницы в админке открываются заметно медленнее, чем должны;
  • после каждого запроса CPU на VDS скачет выше обычного;
  • в логах много повторяющихся запросов к одной и той же таблице wp_options или к метаданным;
  • после обновления плагинов сайт какое-то время работает нестабильно, а потом «отпускает»;
  • на одном и том же сервере другой сайт на WordPress ведет себя лучше без явной разницы в контенте.

Если есть доступ к SSH, полезно сразу посмотреть, какой PHP используется, и включен ли OPcache. Для разных хостингов и панелей путь к конфигу отличается, но сам принцип один: сначала проверяем, потом меняем.

php -v

В выводе обычно видно, подключен ли Zend OPcache. Если его нет, значит PHP работает без этого слоя ускорения. Это не катастрофа, но на VDS почти всегда есть смысл его включить.

Как работает OPcache и что он дает WordPress

WordPress состоит из большого числа PHP-файлов. Без OPcache PHP каждый раз заново читает, парсит и компилирует эти файлы в байткод. OPcache сохраняет результат в памяти, и повторные запросы обходятся дешевле. Для сайта с большим числом плагинов это особенно заметно.

Важно не ждать от OPcache чудес. Он не ускоряет медленные SQL-запросы и не заменяет page cache. Но он убирает лишнюю работу PHP, а это уже хороший выигрыш для VDS с ограниченным CPU.

Базовые параметры OPcache, которые обычно имеют смысл

Ниже пример для php.ini или отдельного файла конфигурации PHP-FPM. Конкретные значения зависят от памяти и нагрузки, но логика настройки одинакова.

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60

Что здесь важно:

  • opcache.memory_consumption — объем памяти под кеш байткода;
  • opcache.max_accelerated_files — сколько PHP-файлов можно держать в кеше;
  • opcache.validate_timestamps и opcache.revalidate_freq — как часто PHP проверяет, не изменились ли файлы.

Если вы часто деплоите код вручную, не стоит сразу отключать проверку изменений. Для живого сайта безопаснее оставить validate_timestamps=1, а при необходимости сбрасывать OPcache после обновлений.

Object cache в WordPress: когда нужен Redis или Memcached

Object cache хранит результаты повторяющихся операций WordPress: данные записей, метаданные, опции, результаты некоторых запросов. На обычном сайте это особенно полезно для админки, каталога записей, архивов и страниц с большим количеством вызовов get_option(), get_post_meta() и похожих функций.

На практике чаще всего используют Redis. Memcached тоже встречается, но Redis обычно удобнее в эксплуатации и чаще поддерживается хостингами и панелями. Если у вас VDS, Redis можно поднять отдельно и подключить через плагин object cache.

Что выбрать: плагин, код или серверный кеш

ВариантГде применяетсяПлюсыОграничения
OPcachePHP на сервереУскоряет выполнение PHP без правок темыНе решает медленные SQL-запросы
Redis object cacheWordPress + RedisСнижает число повторных обращений к БДНужен отдельный сервис и корректная настройка
Только page cacheНа уровне плагина или сервераХорошо ускоряет фронтендНе помогает админке и динамическим запросам

Если у сайта уже есть page cache, это не отменяет object cache. Они решают разные задачи.

Пошаговая настройка OPcache и Redis object cache на VDS

Шаг 1. Проверьте, что Redis установлен и доступен

На Linux-сервере Redis обычно ставится отдельным пакетом. Название зависит от дистрибутива, но после установки важно убедиться, что сервис запущен и отвечает локально.

redis-cli ping

Ожидаемый ответ — PONG. Если ответа нет, сначала разбирайтесь с сервисом, а уже потом подключайте WordPress.

Шаг 2. Подключите object cache через плагин

Для WordPress нужен плагин, который умеет работать как persistent object cache. Один из распространенных вариантов — Redis Object Cache. После установки обычно требуется указать параметры подключения и включить кеш. Если хостинг уже дал готовые параметры Redis, используйте их, а не придумывайте свои.

Если вы предпочитаете контролировать подключение через wp-config.php, можно задать параметры вручную. Пример ниже правдоподобен для типовой локальной установки Redis:

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_CACHE_KEY_SALT', 'example.com:' );

Ключевой момент — WP_CACHE_KEY_SALT. Если на одном Redis-сервере несколько сайтов, без префикса можно получить пересечение ключей и странные ошибки в кеше.

Шаг 3. Включите OPcache в конфигурации PHP

Если у вас есть доступ к конфигу PHP-FPM или php.ini, добавьте или проверьте параметры OPcache. После изменения конфигурации перезапустите PHP-FPM.

sudo systemctl restart php8.2-fpm

Имя сервиса зависит от версии PHP. На некоторых панелях перезапуск делается через интерфейс, и это нормально. Главное — не забыть применить изменения, иначе вы будете смотреть на старую конфигурацию.

Как проверить, что кеш реально работает

Проверка нужна не для галочки. Без нее легко включить Redis, но не получить эффекта из-за неправильного подключения, конфликта с плагином или отключенного persistent object cache.

Что смотреть после настройки

  • в админке WordPress нет ошибок подключения к object cache;
  • в логах PHP и веб-сервера нет повторяющихся предупреждений от Redis-плагина;
  • страницы открываются стабильнее при повторных запросах;
  • нагрузка на базу данных снижается на типовых страницах;
  • OPcache не переполняется и не сбрасывается слишком часто.

Для проверки OPcache можно временно создать файл с phpinfo() на закрытом от индексации участке сайта или в тестовой среде. В выводе ищите секцию Zend OPcache. После проверки файл нужно удалить, потому что оставлять phpinfo() на живом сайте небезопасно.

Для object cache удобнее смотреть статус плагина и поведение сайта под повторной нагрузкой. Если есть SSH, можно также проверить, что Redis отвечает и не падает по памяти.

redis-cli info memory

Если память Redis быстро растет без видимой пользы, возможно, кешируются слишком большие объекты или не настроен TTL там, где это уместно.

Частые ошибки и как их исправить

Redis включили, но WordPress его не использует

Такое бывает, если плагин установлен, но не активирован как persistent object cache, либо в wp-config.php указаны неверные параметры подключения. Проверьте хост, порт, базу и префикс ключей. Если Redis локальный, 127.0.0.1 обычно надежнее, чем имя хоста без необходимости.

После включения кеша появились странные данные в админке

Чаще всего причина в конфликте ключей между сайтами или в слишком агрессивном кешировании на уровне другого плагина. Убедитесь, что у каждого сайта свой WP_CACHE_KEY_SALT, а также что нет двух плагинов, которые одновременно пытаются управлять object cache.

OPcache не дает эффекта

Если OPcache включен, но ускорения не видно, проверьте размер памяти и количество файлов. Для сайта с большим числом плагинов слишком маленький opcache.max_accelerated_files или opcache.memory_consumption быстро упираются в лимит, и кеш начинает вытеснять сам себя.

После деплоя сайт показывает старый код

Это типичная проблема, если opcache.validate_timestamps отключен или проверка изменений происходит слишком редко. Для ручных обновлений безопаснее либо оставить проверку включенной, либо после деплоя явно сбрасывать кеш на сервере. Не делайте это вслепую на продакшене без понимания, как именно у вас устроен релиз.

Практические советы по безопасности и производительности

Не храните на сервере лишние инструменты диагностики. Файл с phpinfo(), тестовые скрипты и временные дампы после проверки нужно удалять. Для Redis не открывайте порт наружу без необходимости; на VDS он обычно должен слушать только локальный интерфейс.

Если сайт небольшой, не стоит сразу ставить все возможные кеши одновременно. Сначала включите OPcache, потом проверьте object cache, и только после этого смотрите на page cache и CDN. Иначе вы не поймете, что именно дало эффект, а что создало конфликт.

Для сайтов с частыми обновлениями контента полезно после изменений проверять:

  • не остались ли старые данные в админке;
  • не ломаются ли виджеты и блоки, которые завязаны на метаданные;
  • не растет ли число ошибок в логах PHP;
  • не увеличилось ли время ответа после включения кеша из-за неверных настроек.

Если нужен более широкий аудит технического состояния WordPress на хостинге, иногда удобнее сначала убрать дубли, лишние скрипты и мусорные функции, а уже потом настраивать кеш. В таких задачах полезны инструменты вроде Clearfy Pro, но только если они реально закрывают вашу проблему и не дублируют уже существующие серверные настройки.

Что проверить после внедрения

После настройки не ограничивайтесь одним открытием главной страницы. Пройдитесь по нескольким типовым сценариям: главная, архив, одиночная запись, поиск, админка, редактирование записи. Если сайт использует авторизацию, проверьте и залогиненную сессию, потому что кеш для гостей и для авторизованных пользователей ведет себя по-разному.

Минимальный чек-лист выглядит так:

  • OPcache отображается в phpinfo() или в конфиге PHP;
  • Redis отвечает на PONG;
  • WordPress видит persistent object cache;
  • нет ошибок в debug.log и логах веб-сервера;
  • после очистки кеша сайт восстанавливает актуальные данные;
  • после обновления плагина или темы код не остается в старом состоянии.

Если все это проходит без ошибок, значит кеширование настроено не формально, а рабочим образом. На VDS это обычно дает более предсказуемую нагрузку и меньше случайных просадок при повторных запросах.

⭐⭐⭐⭐⭐