Вступление: почему 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-блоки должны быть только для динамики |
Процесс работы и сроки
- Аудит текущей архитектуры (VCL, Nginx, PHP-FPM).
- Установка и настройка Varnish с оптимальным malloc и thread_pools.
- Адаптация VCL под Magento (ESI, BAN, grace).
- Настройка SSL termination (Nginx/HAProxy) с передачей
Ssl-Offloaded. - Интеграция с Magento: выбор Varnish в админке, включение FPC.
- Тестирование hit rate (цель 85-95%) и инвалидации.
- Документация и обучение базовым операциям (
varnishadm,varnishlog). - Поддержка 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 дня. Свяжитесь с нами, чтобы обсудить ваш проект.







