Настройка 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-страницы в оперативной памяти и отдаёт их за микросекунды. Экономия на серверных ресурсах — до 70%, а затраты на хостинг снижаются в 3–5 раз. На одном из проектов с каталогом 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 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
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060