Назад к блогу

Как ускорить Drupal с помощью правильных кэшей: OPcache, APCu и общий бэкенд (Redis или Memcached)

2025-08-1310 мин чтения

Если ваш сайт на Drupal работает медленно, обычно проблема решается кэшированием. Однако это не одно универсальное решение. Различные уровни решают разные проблемы. Именно поэтому OPcache, APCu и общий бэкенд, такой как Redis или Memcached, часто используются вместе. Каждый из них ускоряет определенную часть стека. Используйте их правильно, и Drupal станет отзывчивым. Используйте их неправильно, и он все равно будет тормозить.

Внимание: выберите один общий бэкенд для корзин кэша Drupal. Используйте Redis или Memcached, но не оба для одних и тех же корзин.

Краткий обзор: обязательно сделать vs продвинутые настройки

  • Обязательно сделать: Включите OPcache в PHP. Включите APCu для локальных кэшей. Выберите один общий бэкенд для корзин в многосерверных конфигурациях.
  • Продвинутые настройки: Сопоставьте конкретные корзины, настройте таймауты клиента Redis, отрегулируйте размер элементов Memcached, сожмите большие значения Redis, определите размер пулов на основе реального использования.

Краткое руководство по выбору

КонфигурацияОбязательно сделатьОбщий бэкендЛучше всего подходит дляПримечания
Один серверOPcache + APCuОпциональноНебольшие сайты на одном узлеКэш базы данных может быть достаточным. Добавьте Redis или Memcached при росте трафика.
Несколько серверовOPcache + APCuRedis или MemcachedКластеры с балансировкой нагрузкиИспользуйте один общий бэкенд для render, dynamic page cache, page, default, data.
Контент с высокой вариативностьюOPcacheRedisСложное тегирование и инвалидацияСтруктуры и опции персистентности помогают.
Легкий и простойOPcacheMemcachedЧистое кэширование с минимальными накладными расходамиОчень быстрый, эфемерный по своей природе.

Что делает каждый кэш

  • OPcache: Ускоряет сам PHP, кэшируя скомпилированные скрипты.
  • APCu: Локальный кэш ключ-значение на сервер для мелких поисков.
  • Redis: Общее хранилище данных в памяти для кэшей, очередей, блокировок, сессий.
  • Memcached: Общий кэш ключ-значение в памяти, очень простой и быстрый.

Как это вписывается в Drupal

  • OPcache: Включается на уровне PHP. Не является модулем Drupal.
  • APCu: Используется для локальных кэшей и данных загрузки.
  • Redis или Memcached: Сопоставьте render, dynamic page cache, page, default, data с общим бэкендом. Также поддерживает сессии, блокировки и очереди.

Связанное: Кэш состояния (Drupal 10.3+, включен по умолчанию в Drupal 11). Подробности в отдельной статье: Ускорьте бэкенд Drupal с помощью $settings['state_cache'].

Профессиональный совет: В многосерверных конфигурациях оставьте bootstrap в APCu для сверхнизкой задержки и переместите остальное в общий бэкенд.

Быстрые рецепты для settings.php

Скопируйте, затем адаптируйте.

Redis

Интеграция с Drupal

$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';

Настройка производительности

// Опциональное сжатие
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Таймауты клиента (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
  • container_yamls: Регистрирует службы Redis.
  • interface: Выбирает клиент. PhpRedis — это нативный модуль.
  • host/port: Указывает цель подключения. Предпочитайте сокет Unix на том же хосте.
  • cache.default: Устанавливает бэкенд по умолчанию для несопоставленных корзин.
  • bins: Сопоставляет конкретные корзины с Redis.
  • compress_length/level: Сжимает большие значения для экономии памяти.
  • timeouts/persistent: Устанавливает таймауты подключения/чтения и повторно использует соединения.

Memcached

Интеграция с Drupal

$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
  • container_yamls: Регистрирует службы Memcache.
  • servers: Определяет список серверов и имя пула.
  • bins: Сопоставляет корзины с пулом.
  • cache.default: Устанавливает бэкенд по умолчанию для несопоставленных корзин.

APCu для локальных корзин

// Требуется модуль бэкенда APCu
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
  • bootstrap: Хранит данные загрузки в памяти для минимальной задержки.

Настройки времени выполнения/сервера (вне settings.php)

Настройки PHP (php.ini)

OPcache

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
  • opcache.enable: Включает OPcache для FPM или Apache.
  • opcache.enable_cli: Отключает OPcache для CLI.
  • opcache.memory_consumption: Выделяет пул памяти для скомпилированных скриптов.
  • opcache.max_accelerated_files: Устанавливает размер хэш-таблицы.
  • opcache.validate_timestamps: Проверяет временные метки файлов на изменения. Установите в 0 для развертываний типа «создал и забыл».
  • opcache.revalidate_freq: Устанавливает интервал проверки временных меток в секундах, когда validate_timestamps = 1.
  • opcache.interned_strings_buffer: Выделяет память для общих строк.
  • opcache.fast_shutdown: Включает более быстрое завершение запроса.

APCu

apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
  • apc.enabled: Включает APCu для FPM.
  • apc.enable_cli: Отключает APCu для CLI.
  • apc.shm_size: Устанавливает общий объем разделяемой памяти.
  • apc.ttl: Устанавливает время жизни (TTL) записей по умолчанию.
  • apc.gc_ttl: Устанавливает время хранения осиротевших записей.

Сервер Redis (redis.conf)

maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
  • maxmemory: Устанавливает предел памяти.
  • maxmemory-policy: Устанавливает политику вытеснения при заполнении.
  • timeout: Устанавливает время ожидания неактивного клиента в секундах.
  • tcp-keepalive: Устанавливает интервал для зондов поддержания активности.

Сервер Memcached (флаги)

memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
  • -m: Устанавливает общий объем памяти в МБ.
  • -I: Устанавливает максимальный размер элемента.
  • -f: Устанавливает коэффициент роста для классов slab.
  • -o slab_reassign,slab_automove: Включает перебалансировку slab.

Быстрые правила определения размера

КэшКлючевая настройкаБыстрое правило (МБ)
OPcacheopcache.memory_consumptionМБ = (размер_кодовой_базы_МБ × 3) + 32
OPcacheopcache.max_accelerated_files≈ 1.5 × файлов PHP (используйте 10000, 16229, 32531)
APCuapc.shm_sizeМБ ≈ (ключей × (средний_размер_элемента_байты + 100) × 1.2) ÷ 1 000 000
RedismaxmemoryМБ ≈ (элементов × (средний_размер_элемента_байты + 50) × 1.3) ÷ 1 000 000
Memcached-mМБ ≈ (элементов × средний_размер_элемента_байты × 1.3) ÷ 1 000 000
Memcached-IНачните с 4 МБ; увеличьте при необходимости

Распространенные мифы

  1. Миф: OPcache кэширует HTMLПравда: Он кэширует скомпилированный код PHP.
  2. Миф: APCu работает между серверамиПравда: Он локален для одного серверного процесса.
  3. Миф: Redis всегда лучше MemcachedПравда: Выбирайте в зависимости от потребностей.
  4. Миф: Промахи кэша означают, что что-то сломаноПравда: Промахи случаются и заполняются при трафике.

Краткий контрольный список настройки

  • OPcache:
    • Включите расширение в PHP.
    • Настройте размер памяти и параметры повторной проверки для продакшена.
    • Убедитесь, что opcache.memory_consumption достаточно для размещения вашей кодовой базы.
  • APCu:
    • Установите расширение PHP.
    • Проверьте настройки CLI и FPM, если вы используете оба.
    • Установите размер apc.shm_size с запасом, чтобы избежать вытеснений.
  • Redis:
    • Установите сервер и расширение PHP.
    • Добавьте модуль Redis для Drupal и сопоставьте нужные корзины кэша.
    • Установите таймауты клиента и рассмотрите сессии, блокировки и очереди.
  • Memcached:
    • Установите сервер и расширение PHP.
    • Добавьте модуль Memcache для Drupal и сопоставьте нужные корзины.
    • Установите -I для максимального размера элемента; убедитесь, что приложение допускает потерю кэша.

Избегайте этих ловушек

  • Избегайте смешивания Redis и Memcached для одной и той же корзины.
  • Избегайте недостаточного выделения ресурсов для кэшей. Следите за вытеснениями и коэффициентом попаданий.
  • Избегайте чрезмерного кэширования. Сосредоточьтесь на дорогих, повторно используемых данных.
  • Избегайте нарушения инвалидации. Соблюдайте теги и контексты кэша.

Как измерить успех

  • Тенденции времени отклика: Время до первого байта должно уменьшиться после прогрева.
  • Нагрузка на базу данных: Меньше запросов на запрос и меньшая загрузка ЦП на базе данных.
  • Коэффициент попаданий: Отслеживайте коэффициенты попаданий в кэш. Если коэффициенты попаданий остаются низкими, пересмотрите сопоставление корзин и TTL.
  • Журналы ошибок: Следите за ошибками подключения или таймаутами от Redis или Memcached.

Заключительные мысли

Начните с OPcache, добавьте APCu, затем Redis или Memcached для общих корзин. Сохраняйте простоту, измеряйте результаты и настраивайте.