Оптимізація продуктивності Drupal (кешування, Varnish)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Оптимізація продуктивності Drupal (кешування, Varnish)
Складна
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Оптимізація продуктивності 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 днів.