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







