Оптимизация производительности Drupal (кэширование, Varnish)
Drupal имеет одну из самых продуманных систем кэширования среди CMS. Кэш-теги, cache contexts, render cache, dynamic page cache, BigPipe — правильное использование этих механизмов даёт TTFB < 50 мс даже для сложных страниц.
Многоуровневое кэширование Drupal
Render cache — кэшируются отдельные render arrays (блоки, вьюхи, поля). Инвалидируется по cache tags.
Dynamic Page Cache — кэширует страницы с учётом контекста (авторизован/нет, язык, роль). Обходит рендеринг, но не обходит bootstrap Drupal.
Internal Page Cache — кэш полных страниц для анонимных пользователей. Хранит HTML на диске/в БД.
External cache (Varnish/Nginx) — кэш перед Drupal. Полные страницы без запуска PHP.
Internal Page Cache
drush en page_cache -y
Конфигурация → Производительность → Cache pages for anonymous users. Время кэширования — минимум 10 минут для контентных сайтов.
// Настройка времени кэша программно
\Drupal::configFactory()
->getEditable('system.performance')
->set('cache.page.max_age', 3600) // 1 час
->save();
BigPipe: потоковый рендеринг
drush en big_pipe -y
BigPipe рендерит страницу в два прохода: сначала статические части (быстро), затем персонализированные блоки (пользователь видит страницу раньше). Для авторизованных пользователей — критично.
Varnish Cache
Varnish работает как reverse proxy перед Nginx/Apache. Drupal автоматически отправляет заголовки с cache tags — Varnish кэширует ответы и инвалидирует нужные при публикации.
apt install varnish
Varnish конфигурация (/etc/varnish/default.vcl):
vcl 4.1;
import std;
import purge;
backend default {
.host = "127.0.0.1";
.port = "8080"; # Nginx на 8080, Varnish на 80/443
}
sub vcl_recv {
# Не кэшировать авторизованных пользователей
if (req.http.Cookie ~ "SESS|SSESS") {
return(pass);
}
# Не кэшировать POST запросы
if (req.method != "GET" && req.method != "HEAD") {
return(pass);
}
# Удалить лишние куки
unset req.http.Cookie;
return(hash);
}
sub vcl_backend_response {
# Кэшировать только 200 ответы
if (beresp.status != 200) {
set beresp.uncacheable = true;
return(deliver);
}
# TTL из Drupal заголовков
if (beresp.http.Cache-Control ~ "max-age") {
set beresp.ttl = std.duration(regsub(beresp.http.Cache-Control, ".*max-age=([0-9]+).*", "\1") + "s", 0s);
} else {
set beresp.ttl = 1h;
}
set beresp.grace = 1h;
return(deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
Drupal + Varnish: модуль Purge
composer require drupal/varnish_purger drupal/purge
drush en purge purge_drush purge_ui purge_queuer_coretags purge_processor_cron varnish_purger -y
Varnish Purge отправляет BAN-запросы к Varnish при изменении контента. Cache tags автоматически формируются Drupal.
Конфигурация: Конфигурация → Производительность → Varnish Purge → указать IP Varnish и порт.
Redis для кэша Drupal
composer require drupal/redis
drush en redis -y
settings.php:
$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';
// Для bootstrap - оставить в базе для надёжности
$settings['cache']['bins']['bootstrap'] = 'cache.backend.database';
PHP OPcache
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.jit=tracing
opcache.jit_buffer_size=100m
CSS/JS агрегация
Конфигурация → Производительность:
- Aggregate CSS files: ✓
- Aggregate JavaScript files: ✓
Включать только на production. В development — отключить для удобства отладки.
Анализ производительности
# XHProf через drush
composer require drupal/xhprof
drush en xhprof -y
# Профилировать конкретный запрос
drush xhprof:enable && curl https://site.com/heavy-page && drush xhprof:disable
# Медленные запросы
drush sqlq "SELECT * FROM watchdog WHERE type = 'devel' ORDER BY wid DESC LIMIT 20"
Модуль Devel + Query Count показывает количество SQL-запросов и их время на каждой странице.
Результаты типичной оптимизации
| Конфигурация | TTFB | SQL-запросы |
|---|---|---|
| Без кэша | 800–2000 мс | 100–300 |
| Dynamic Page Cache | 50–200 мс | 5–20 |
| Varnish (анонимные) | 1–5 мс | 0 |
| Redis + OPcache | 100–300 мс | 5–15 |
Сроки
Базовая оптимизация (OPcache, Redis, Internal Page Cache, CSS/JS агрегация) — 2–3 дня. Настройка Varnish с модулем Purge и cache tags — плюс 2–3 дня. Полный аудит и оптимизация — 5–7 дней.







