Как ускорить Drupal с помощью правильных кэшей: OPcache, APCu и общий бэкенд (Redis или Memcached)
Если ваш сайт на Drupal работает медленно, обычно проблема решается кэшированием. Однако это не одно универсальное решение. Различные уровни решают разные проблемы. Именно поэтому OPcache, APCu и общий бэкенд, такой как Redis или Memcached, часто используются вместе. Каждый из них ускоряет определенную часть стека. Используйте их правильно, и Drupal станет отзывчивым. Используйте их неправильно, и он все равно будет тормозить.
Внимание: выберите один общий бэкенд для корзин кэша Drupal. Используйте Redis или Memcached, но не оба для одних и тех же корзин.
Краткий обзор: обязательно сделать vs продвинутые настройки
- Обязательно сделать: Включите OPcache в PHP. Включите APCu для локальных кэшей. Выберите один общий бэкенд для корзин в многосерверных конфигурациях.
- Продвинутые настройки: Сопоставьте конкретные корзины, настройте таймауты клиента Redis, отрегулируйте размер элементов Memcached, сожмите большие значения Redis, определите размер пулов на основе реального использования.
Краткое руководство по выбору
Конфигурация | Обязательно сделать | Общий бэкенд | Лучше всего подходит для | Примечания |
---|---|---|---|---|
Один сервер | OPcache + APCu | Опционально | Небольшие сайты на одном узле | Кэш базы данных может быть достаточным. Добавьте Redis или Memcached при росте трафика. |
Несколько серверов | OPcache + APCu | Redis или Memcached | Кластеры с балансировкой нагрузки | Используйте один общий бэкенд для render, dynamic page cache, page, default, data. |
Контент с высокой вариативностью | OPcache | Redis | Сложное тегирование и инвалидация | Структуры и опции персистентности помогают. |
Легкий и простой | OPcache | Memcached | Чистое кэширование с минимальными накладными расходами | Очень быстрый, эфемерный по своей природе. |
Что делает каждый кэш
- 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.
Быстрые правила определения размера
Кэш | Ключевая настройка | Быстрое правило (МБ) |
---|---|---|
OPcache | opcache.memory_consumption | МБ = (размер_кодовой_базы_МБ × 3) + 32 |
OPcache | opcache.max_accelerated_files | ≈ 1.5 × файлов PHP (используйте 10000, 16229, 32531) |
APCu | apc.shm_size | МБ ≈ (ключей × (средний_размер_элемента_байты + 100) × 1.2) ÷ 1 000 000 |
Redis | maxmemory | МБ ≈ (элементов × (средний_размер_элемента_байты + 50) × 1.3) ÷ 1 000 000 |
Memcached | -m | МБ ≈ (элементов × средний_размер_элемента_байты × 1.3) ÷ 1 000 000 |
Memcached | -I | Начните с 4 МБ; увеличьте при необходимости |
Распространенные мифы
- Миф: OPcache кэширует HTML — Правда: Он кэширует скомпилированный код PHP.
- Миф: APCu работает между серверами — Правда: Он локален для одного серверного процесса.
- Миф: Redis всегда лучше Memcached — Правда: Выбирайте в зависимости от потребностей.
- Миф: Промахи кэша означают, что что-то сломано — Правда: Промахи случаются и заполняются при трафике.
Краткий контрольный список настройки
- 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 для общих корзин. Сохраняйте простоту, измеряйте результаты и настраивайте.