מבוא: למה Magento 2 ללא Varnish הוא צוואר בקבוק
אנו משלבים Varnish עם Magento 2 כדי להשיג האצת מהירות של עד פי 50 ולהפחית את עומס השרת פי 10-50, תוך חיסכון של עד 10,000 דולר לחודש בעלויות אירוח. עבור חנות טיפוסית עם 10,000 מוצרים, Varnish חוסך 7,500 דולר לחודש בעלויות אירוח. Magento 2 היא מערכת CMS כבדה: כל עמוד נוצר דינמית דרך PHP-FPM ו-MySQL. עם יותר מ-500 מבקרים במקביל, ה-CPU מגיע ל-100% וזמן התגובה עולה על 5 שניות, מה שמוביל לאובדן המרות. Varnish פותר זאת: הוא שומר דפי HTML מוכנים ב-RAM ומגיש אותם במיקרו-שניות. חיסכון במשאבי השרת מגיע עד 70%, ועלויות האירוח יורדות פי 3-5. בפרויקט אחד עם 50,000 מוצרים, שיעור הפגיעות (hit rate) עלה מ-40% ל-93% לאחר כוונון VCL. אנו מגדירים Varnish עבור הפרויקט שלך עם שיעור פגיעות מובטח של 85-95%. קבלו ייעוץ — אנו מעריכים את הפרויקט שלך תוך יום אחד.
כיצד Varnish מאיץ את Magento 2
Varnish מאחסן מטמון ב-RAM (-s malloc), שהוא מהיר פי 100 ממטמון קבצים או Redis. זה חיוני למטמון דפים מלא ב-Magento 2. אפילו במהלך פסילה מלאה (עדכוני מחירים בכמות גדולה), Varnish מתחמם תוך 1-2 דקות הודות למצב grace (הגשת עותקים מיושנים) ומצב saint (דילוג על שרתי backend תקולים). זה קריטי לחנויות מסחר אלקטרוני עם עומסי שיא: ללא Varnish, השרת לא יכול להתמודד אפילו עם 10% מהתנועה המתוכננת.
למה VCL סטנדרטי דורש עידון
Magento מייצר VCL דרך הניהול, אך הוא לא מצליח לטפל ב:
- העברת IP אמיתי דרך X-Forwarded-For;
- עיבוד בקשות BAN עם תבניות תגים;
- מטמון עבור HTTP/HTTPS דרך כותרת
Ssl-Offloaded; - נורמליזציה של URLs (תגי 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
הקצו 2-4 GB malloc עבור Magento. פחות מ-1 GB אינו יעיל: דפים שוקלים 80-200 KB, ועם מטמון קטן, שיעור הפגיעות יורד.
חלקים מרכזיים ב-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 (Edge Side Includes) עבור בלוקים מותאמים אישית (עגלה, שם משתמש). ב-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 , ש-Magento מגדיר עם כותרת 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); } . בדקו:
curl -I https://myshop.ru/ | grep X-Cache # Ожидается: HIT
curl -I https://myshop.ru/checkout/cart/ | grep X-Cache # Ожидается: MISS (корзина не кэшируется) השוואה בין Varnish למטמון המובנה של Magento
| פרמטר | Varnish | מובנה (Files/Redis) |
|---|---|---|
| אחסון | RAM | קבצים או Redis |
| מהירות הגשה | מיקרו-שניות | מילי-שניות |
| פסילה | לפי X-Magento-Tags (BAN) | לפי תגים (flush מלא) |
| שיעור פגיעות | 85-95% | 70-80% |
| מצב Grace/Saint | + | - |
Varnish מהיר פי 3-5 ומשיג שיעור פגיעות גבוה ב-15-20%.
טעויות נפוצות והפתרונות שלהן
| בעיה | סימפטום | פתרון |
|---|---|---|
| שיעור פגיעות < 70% | הרבה MISS ביומנים | בדקו חסימת עוגיות, הגדילו גודל malloc, הסירו עוגיות מיותרות מבקשות הניתנות למטמון |
| פסילה לא עובדת | העמוד נשאר ישן לאחר עדכון מוצר | בדקו ACL עבור PURGE/BAN; ודאו שבקשות BAN מגיעות ל-Varnish |
| ESI לא מתעדכן | העגלה מציגה נתונים מיושנים | בדקו ש-VCL לא מסיר את כותרת X-Esi; בלוקי ESI צריכים להיות רק עבור תוכן דינמי |
תהליך ולוחות זמנים
- ביקורת על הארכיטקטורה הנוכחית (VCL, Nginx, PHP-FPM).
- התקנה והגדרה של Varnish עם malloc ו-thread_pools אופטימליים.
- התאמת VCL עבור Magento (ESI, BAN, grace).
- הגדרת סיום SSL (Nginx/HAProxy) עם העברת כותרת
beresp.do_esi = true. - אינטגרציה עם Magento: בחירת Varnish בניהול, הפעלת מטמון דפים מלא.
- בדיקת שיעור פגיעות (יעד 85-95%) ופסילה.
- תיעוד והדרכה על פעולות בסיסיות (
X-Esi: 1,curl -I https://myshop.ru/ | grep X-Cache # Ожидается: HIT curl -I https://myshop.ru/checkout/cart/ | grep X-Cache # Ожидается: MISS (корзина не кэшируется)). - חודש תמיכה לאחר ההתקנה.
לוחות זמנים: התקנה והגדרה בסיסית — 1-2 ימים, בדיקות ואופטימיזציה — יום אחד, בדיקת עומס — 0.5-1 יום.
מה כלול
- ביקורת מלאה ובחירת פרמטרים.
- התקנה, VCL, ESI, הגדרת HTTPS.
- אינטגרציה עם Magento ואימות פסילה.
- הדרכת צוות.
למהנדסים שלנו יש ניסיון של 10+ שנים עם Magento ו-Varnish, והם השלימו מעל 50 פרויקטים עם עומסי שיא של עד 10,000 RPS. אנו מבטיחים שיעור פגיעות של 85-95% או נתאים ללא עלות. הזמינו הגדרת Varnish עבור Magento 2 שלכם — קבלו ייעוץ תוך יום אחד. צרו קשר כדי לדון בפרויקט שלכם.







