Вступ: чому 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-блоки повинні бути тільки для динаміки |
Процес роботи та строки
- Аудит поточної архітектури (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 дня. Зв'яжіться з нами, щоб обговорити ваш проект.







