הגבר את ביצועי Magento 2 פי 50 באמצעות Varnish Cache

Magento 2 ללא Varnish הופך כל עמוד לבקשה דינמית כבדה שאינה עומדת בעומסי שיא ומאבדת לקוחות. אנו מגדירים Varnish עבור הפרויקט שלכם: מפתחים VCL, מיישמים ESI ו-invalidation כדי להאיץ את התגובה ולהקל על השרת. הצוות שלנו מספק הכל turnkey—מביקורת ועד תמיכה—ומבטיח פעילות יציבה גם בעומסי תנועה.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
הגבר את ביצועי Magento 2 פי 50 באמצעות Varnish Cache
מורכב
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1502
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1344
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1052
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1307
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1050
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1033

מבוא: למה 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 צריכים להיות רק עבור תוכן דינמי

תהליך ולוחות זמנים

  1. ביקורת על הארכיטקטורה הנוכחית (VCL, Nginx, PHP-FPM).
  2. התקנה והגדרה של Varnish עם malloc ו-thread_pools אופטימליים.
  3. התאמת VCL עבור Magento (ESI, BAN, grace).
  4. הגדרת סיום SSL (Nginx/HAProxy) עם העברת כותרת beresp.do_esi = true.
  5. אינטגרציה עם Magento: בחירת Varnish בניהול, הפעלת מטמון דפים מלא.
  6. בדיקת שיעור פגיעות (יעד 85-95%) ופסילה.
  7. תיעוד והדרכה על פעולות בסיסיות (X-Esi: 1, curl -I https://myshop.ru/ | grep X-Cache # Ожидается: HIT curl -I https://myshop.ru/checkout/cart/ | grep X-Cache # Ожидается: MISS (корзина не кэшируется) ).
  8. חודש תמיכה לאחר ההתקנה.

לוחות זמנים: התקנה והגדרה בסיסית — 1-2 ימים, בדיקות ואופטימיזציה — יום אחד, בדיקת עומס — 0.5-1 יום.

מה כלול

  • ביקורת מלאה ובחירת פרמטרים.
  • התקנה, VCL, ESI, הגדרת HTTPS.
  • אינטגרציה עם Magento ואימות פסילה.
  • הדרכת צוות.

למהנדסים שלנו יש ניסיון של 10+ שנים עם Magento ו-Varnish, והם השלימו מעל 50 פרויקטים עם עומסי שיא של עד 10,000 RPS. אנו מבטיחים שיעור פגיעות של 85-95% או נתאים ללא עלות. הזמינו הגדרת Varnish עבור Magento 2 שלכם — קבלו ייעוץ תוך יום אחד. צרו קשר כדי לדון בפרויקט שלכם.