Оптимізація продуктивності Drupal (кешування, Varnish)
Drupal має одну з найпродуманіших систем кешування серед CMS. Cache tags, cache contexts, render cache, dynamic page cache, BigPipe — правильне використання цих механізмів дає TTFB < 50 мс навіть для складних сторінок.
Багаторівневе кешування Drupal
Render cache — кешуються окремі render arrays (блоки, views, поля). Інвалідується за 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
Configuration → Performance → 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);
}
# Видалити непотрібні cookies
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.
Конфігурація: Configuration → Performance → 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
Configuration → Performance:
- 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 днів.







