Як налаштувати Varnish для Magento 2: VCL, ESI та інвалідація кеша

Magento 2 без Varnish перетворює кожну сторінку на важкий динамічний запит, який не витримує пікових навантажень і втрачає клієнтів. Ми налаштовуємо Varnish під ваш проєкт: розробляємо VCL, впроваджуємо ESI та інвалідацію, щоб пришвидшити відгук і розвантажити сервер. Наша команда реалізує все під ключ — від аудиту до підтримки, забезпечуючи стабільну роботу навіть при сплесках трафіку.

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Як налаштувати Varnish для Magento 2: VCL, ESI та інвалідація кеша
Складний
~2-3 дні
Часті запитання

Вступ: чому Magento 2 без Varnish — вузьке місце

Magento 2 — важка CMS: кожна сторінка генерується динамічно через PHP-FPM та MySQL. При 500+ одночасних відвідувачах CPU йде в 100%, а час відгуку перевищує 5 секунд, що призводить до втрати конверсій. Varnish вирішує цю проблему: він кешує готові HTML-сторінки в оперативній пам'яті та віддає їх за мікросекунди. Середня економія на хостингу значна для проектів з 10 000+ замовленнями. З Varnish швидкість завантаження сторінки збільшується у 10-50 разів, а час відгуку сервера зменшується з 5 секунд до 0.03 секунди — у 167 разів швидше. На одному з проектів з каталогом 50 000 товарів hit rate виріс з 40% до 93% після налаштування VCL. Ми налаштовуємо Varnish під ваш проект з гарантованим hit rate 85-95%. Отримайте консультацію — оцінимо ваш проект за один день.

Як Varnish прискорює Magento 2?

Varnish зберігає кеш в оперативній пам'яті (-s malloc), що в 100 разів швидше за файловий або Redis-кеш. Навіть при повній інвалідації (масове оновлення цін) Varnish прогрівається за 1-2 хвилини завдяки grace (віддача застарілої копії) та saintmode (пропуск битого бекенда). Це критично для інтернет-магазинів з піковими навантаженнями: без Varnish сервер не витримує навіть 10% від запланованого трафіку.

Чому стандартний VCL потребує доопрацювання?

Magento генерує VCL через адмінку, але він не враховує:

  • передачу реального IP через X-Forwarded-For;
  • обробку BAN-запитів з патернами за тегами;
  • кешування для HTTP/HTTPS через заголовок Ssl-Offloaded;
  • нормалізацію URL (UTM-мітки, fbclid).

Типова помилка: не налаштований ACL для PURGE та BAN — інвалідація не працює, і зміни на сайті не відображаються. Наші інженери виправляють VCL під кожну задачу.

Як ми налаштовуємо Varnish: установка, VCL та ESI

Установка та базові параметри

# Установка на Ubuntu LTS (актуальна версія)
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish74/script.deb.sh | sudo bash
apt install varnish

# Файл сервісу (редагувати через systemctl edit varnish)
ExecStart=
ExecStart=/usr/sbin/varnishd \
    -a :80 \
    -T localhost:6082 \
    -f /etc/varnish/default.vcl \
    -s malloc,2g \
    -p thread_pools=2 \
    -p thread_pool_max=1000 \
    -p thread_pool_timeout=300

Розмір malloc — 2-4 GB для Magento. Менше 1 GB неефективно: сторінки важать 80–200 KB, і при малому кеші hit rate падає.

Ключові частини виправленого VCL

Код VCL (натисніть для розгортання)
vcl 4.1;
import std;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
}

acl purge {
    "localhost";
    "127.0.0.1";
}

sub vcl_recv {
    # Передаємо реальний IP
    if (req.restarts == 0) {
        if (req.http.X-Forwarded-For) {
            set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
        } else {
            set req.http.X-Forwarded-For = client.ip;
        }
    }

    # PURGE-запити від Magento
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed"));
        }
        return (purge);
    }

    # BAN по X-Magento-Tags (інвалідація блоків)
    if (req.method == "BAN") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed"));
        }
        if (req.http.X-Magento-Tags-Pattern) {
            ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
        }
        return (synth(200, "Banned"));
    }

    # Не кешуємо checkout, cart, customer
    if (req.url ~ "/(checkout|customer|account|cart|wishlist)") {
        return (pass);
    }

    # Видаляємо куки на статиці
    if (req.url ~ "\.(css|js|png|jpg|jpeg|webp|gif|ico|woff2|svg)(\?.*)?$") {
        unset req.http.Cookie;
        return (hash);
    }

    # Чистимо UTM та інші мітки
    set req.url = regsuball(req.url, "(^|&)(utm_[a-z]+|gclid|gclsrc|fbclid)=[^&]*", "");
    set req.url = regsub(req.url, "^(.*)\?&?(.*)?$", "\1?\2");
    set req.url = regsub(req.url, "^(.*)\?$", "\1");

    return (hash);
}

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    if (req.http.Ssl-Offloaded) {
        hash_data(req.http.Ssl-Offloaded);
    }
    return (lookup);
}

sub vcl_backend_response {
    if (beresp.status >= 500) {
        set beresp.uncacheable = true;
        set beresp.ttl = 1s;
        return (deliver);
    }
    if (beresp.http.content-type ~ "text/html") {
        set beresp.ttl = 1d;
        set beresp.grace = 1h;
    }
    if (bereq.url ~ "\.(css|js|woff2)(\?.*)?$") {
        set beresp.ttl = 1y;
    }
    if (beresp.ttl > 0s) {
        unset beresp.http.Set-Cookie;
    }
    return (deliver);
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
        set resp.http.X-Cache-Hits = obj.hits;
    } else {
        set resp.http.X-Cache = "MISS";
    }
    unset resp.http.X-Magento-Tags;
    unset resp.http.X-Powered-By;
    unset resp.http.Server;
    return (deliver);
}

ESI — динамічні блоки всередині кешованих сторінок

Magento використовує ESI для персоналізованих блоків (кошик, ім'я користувача). У VCL ESI вмикається через beresp.do_esi = true, який Magento встановлює заголовком X-Esi: 1. Перевірка:

curl -I https://myshop.ru/ | grep X-Cache # Очікується: HIT
curl -I https://myshop.ru/checkout/cart/ | grep X-Cache # Очікується: MISS (кошик не кешується)

Порівняння Varnish та вбудованого кеша Magento

Параметр Varnish Вбудований (файли/Redis)
Сховище RAM Файли або Redis
Швидкість віддачі мікросекунди мілісекунди
Інвалідація по X-Magento-Tags (BAN) по тегах (повний скид)
Hit rate 85-95% 70-80%
Grace/святий режим + -

Varnish швидший у 3-5 разів і дає на 15-20% вищий hit rate.

Типові помилки та їх вирішення

Проблема Ознака Рішення
Hit rate < 70% Багато MISS у логах Перевірити блокування куками, збільшити розмір malloc, видалити зайві cookie з кешованих запитів
Інвалідація не працює Після зміни товару сторінка стара Перевірити ACL для PURGE/BAN; переконатися, що BAN-запити доходять
ESI не оновлюється Кошик показує старі дані Перевірити, що VCL не видаляє заголовок X-Esi; ESI-блоки повинні бути тільки для динаміки

Процес роботи та строки

  1. Аудит поточної архітектури (VCL, Nginx, PHP-FPM).
  2. Установка та налаштування Varnish з оптимальним malloc та thread_pools.
  3. Адаптація VCL під Magento (ESI, BAN, grace).
  4. Налаштування SSL termination (Nginx/HAProxy) з передачею Ssl-Offloaded.
  5. Інтеграція з Magento: вибір Varnish в адмінці, ввімкнення FPC.
  6. Тестування hit rate (ціль 85-95%) та інвалідації.
  7. Документація та навчання базовим операціям (varnishadm, varnishlog).
  8. Підтримка 1 місяць після налаштування.

Строки: установка та базова конфігурація — 1-2 дні, тестування та оптимізація — 1 день, навантажувальне тестування — 0.5-1 дня.

Що входить в роботу

  • Повний аудит та підбір параметрів.
  • Установка, налаштування VCL, ESI, HTTPS.
  • Інтеграція з Magento та перевірка інвалідації.
  • Навчання команди.

Наші інженери мають 10+ років досвіду з Magento та Varnish, реалізували більше 50 проектів з піковими навантаженнями до 10 000 RPS. Гарантуємо hit rate 85-95% або доопрацьовуємо безкоштовно. Замовте налаштування Varnish для вашого Magento 2 — отримайте консультацію протягом 1 дня. Зв'яжіться з нами, щоб обговорити ваш проект.

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

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060