اتخطّى للمحتوى

إزاي تشغّل Varnish كـ Full Page Cache في Magento 2؟

عشان تشغّل Varnish كـ Full Page Cache في Magento 2، اختار Varnish Caching في إعداد Caching Application، وولّد ملف الـ VCL بأمر varnish:vcl:generate، وعرّف Magento بعنوان Varnish بخيار --http-cache-hosts عشان يقدر يمسح الكاش. بعدها Varnish بيقدّم الصفحات المتخزّنة قبل ما الطلب يوصل لـ PHP، وصفحات زي الـ checkout بتفضل من غير كاش.

عشان تشغّل Varnish كـ Full Page Cache في Magento 2 بتعمل تلات حاجات: تختار Varnish Caching كـ Caching Application، وتولّد ملف الـ VCL من Magento نفسه، وتعرّف Magento بعنوان Varnish عشان يمسح الكاش لما منتج أو صفحة تتغيّر. النتيجة إن الصفحة المتخزّنة بتطلع من Varnish مباشرة، من غير ما الطلب يوصل لـ PHP.

الكلام ده على Magento Open Source و Adobe Commerce المتثبّتين على سيرفراتك. Adobe Commerce on Cloud بيستخدم Fastly بدل Varnish، فالخطوات دي مش ليه.

ليه Varnish أحسن من الـ Full Page Cache المدمج؟

Magento فيه Full Page Cache مدمج بيحفظ الصفحات في الـ cache backend بتاعه، بس الطلب لسه بيوصل لـ PHP عشان Magento يدوّر على الصفحة ويرجّعها. Varnish بيقف قدّام Magento، فلو الصفحة موجودة عنده بيرجّعها فورًا. عشان كده Adobe بتوصي بـ Varnish في الـ production.

الكاش المدمج Varnish
الصفحة بتتخزّن فين في cache backend بتاع Magento (ملفات، أو Redis/Valkey) في ذاكرة Varnish
الطلب بيوصل لـ PHP؟ أيوه، Magento بيشتغل عشان يرجّع الصفحة من الكاش لأ، لو الصفحة متخزّنة
مسح الكاش Magento بيمسح من الـ backend بتاعه Magento بيبعت طلبات purge لـ Varnish
مناسب لـ التطوير والمتاجر الصغيرة الـ production، وده توصية Adobe

والسرعة هنا فلوس: دراسة Deloitte لـ Google لقت إن تحسين سرعة موقع الموبايل بـ 0.1 ثانية بس زوّد التحويلات في متاجر التجزئة بنسبة 8.4%. ولو عايز تفهم أنواع الكاش في Magento من الأساس، راجع درس قاعدة البيانات والأداء.

أنهي إصدار Varnish يمشي مع Magento 2؟

متطلبات Adobe لآخر patches (من 2.4.6 لحد 2.4.9) بتذكر Varnish 8، والـ patches الأقدم كانت بتذكر Varnish 7.7. بس فيه تفصيلة مهمة: أمر توليد الـ VCL في Magento عنده templates لإصدارات 4 و 5 و 6 و 7 بس، ومفيش template لـ Varnish 8.

الحل العملي: ولّد الـ VCL بـ --export-version=7 واختبره كويس على الـ staging قبل الـ production، لأن Adobe مابتوثّقش التركيبة دي بشكل صريح.

إزاي تفعّل Varnish من الأدمن أو الـ CLI؟

من الأدمن: Stores › Settings › Configuration › Advanced › System › Full Page Cache، وفي Caching Application اختار Varnish Caching. في نفس المكان هتلاقي TTL for public content وإعدادات Varnish Configuration.

ومن الـ CLI، وده الأنسب في الـ production والـ deployment scripts:

bash
bin/magento config:set --scope=default --scope-code=0 system/full_page_cache/caching_application 2

وعشان Magento يعرف يمسح الكاش، عرّفه بعنوان Varnish، أو أكتر من سيرفر مفصولين بفاصلة:

bash
bin/magento setup:config:set --http-cache-hosts=192.0.2.10:6081

إزاي تولّد ملف الـ VCL الصح؟

bash
bin/magento varnish:vcl:generate \
  --export-version=7 \
  --access-list=192.0.2.20 \
  --backend-host=192.0.2.20 \
  --backend-port=8080 \
  --grace-period=300 \
  --output-file=/etc/varnish/default.vcl
  • --access-list: الأجهزة المسموح لها تبعت purge، يعني سيرفرات Magento. من 2.4.9 تقدر تكتب نطاق CIDR.
  • --backend-host و --backend-port: الـ web server اللي Magento شغّال عليه ورا Varnish.
  • --grace-period: المدة اللي Varnish يفضل يقدّم فيها النسخة القديمة وهو بيجيب الجديدة، والافتراضي 300 ثانية.
  • لو ماحددتش الخيارات، الافتراضي localhost على بورت 8080، وإصدار التصدير 6.

بعد ما الملف يتولّد، أعد تحميل Varnish عشان يقرا الإعدادات الجديدة.

الـ grace mode بيحميك من إيه؟

لما صفحة متخزّنة تنتهي مدتها، Varnish مابيخلّيش الزائر يستنّى. بيقدّم النسخة القديمة شوية، وفي نفس الوقت بيجيب نسخة جديدة من Magento. ده بيمنع ضغط مفاجئ على PHP لما صفحات كتير تنتهي في نفس اللحظة، وبيخلّي المتجر يرد حتى لو الـ backend بطيء لحظيًا.

إيه اللي Varnish مش المفروض يكاشه؟

  • الـ checkout وصفحات حساب العميل: أي block عليه cacheable="false" بيخلّي الصفحة كلها ماتتكاشش، وده مقصود في الصفحات دي. والبيانات الخاصة بكل عميل زي السلة بتتحمّل بعد الصفحة بالـ JavaScript.
  • الملفات الثابتة: الـ VCL الافتراضي بيعدّيها من غير كاش. Adobe بتقول تكاشها في Varnish بس لو عندك لغات قليلة ومفيش CDN، وغير كده الـ CDN أنسب.

خلّي بالك من الفخ ده: cacheable="false" على block في layout عام زي default.xml بيقفل الكاش على كل صفحات الموقع. لو Varnish مش بيكاش أي حاجة، دوّر على السبب ده الأول. السيناريو ده بيتسأل في الإنترفيو، وتلاقي أمثلة زيه في درس Redis و RabbitMQ و Indexing.

إزاي تتأكد إن Varnish بيكاش فعلًا؟

  • اطلب نفس الصفحة مرتين بـ curl -I وبص على هيدر Age: لو قيمته أكبر من صفر في المرة التانية، الصفحة جاية من الكاش.
  • استخدم varnishlog أو varnishstat على سيرفر Varnish عشان تشوف الـ hits والـ misses.
  • اديله ذاكرة كفاية تشيل أكتر الصفحات زيارة، وإلا هيطرد صفحات مهمة من الكاش بدري.

وعشان تشوف Varnish في مكانه وسط باقي المعمارية، من الـ load balancer لقاعدة البيانات، راجع درس System Design لمتجر e-commerce. ولو بتنقل كاش Magento نفسه لـ Valkey، شوف مقال التحويل من Redis لـ Valkey.

إيه الجديد في Magento 2.4.9؟

  • Magento بقى بيرتّب الـ query parameters قبل ما يخزّن الصفحة، فنفس الرابط بترتيب parameters مختلف مابيعملش نسخة كاش زيادة.
  • الـ access list بتاعة الـ purge بقت تقبل نطاقات CIDR.

Checklist قبل ما تشغّل Varnish في الـ production

  • Caching Application متظبط على Varnish Caching
  • --http-cache-hosts فيه كل سيرفرات Varnish
  • ملف الـ VCL متولّد بـ --export-version=7 ومجرّب على الـ staging
  • الـ access list فيها سيرفرات Magento بس
  • الـ grace period متحدد
  • مفيش cacheable="false" في layout عام
  • الطلب التاني لنفس الصفحة بيرجع بـ Age أكبر من صفر
  • Varnish عنده ذاكرة كفاية لأكتر الصفحات زيارة

المصادر

المعلومات التقنية في المقال اتراجعت على المصادر دي:

  1. Adobe — Configure Varnish for Commerce
  2. Adobe — Performance best practices: configuration
  3. Adobe — System requirements
  4. Adobe Commerce 2.4.9 release notes
  5. Magento source — GenerateVclCommand.php (2.4-develop)
  6. Varnish documentation — Grace mode
  7. web.dev — Milliseconds make millions (Deloitte for Google)

أسئلة شائعة

هل Adobe Commerce on Cloud بيستخدم Varnish؟

لأ. Adobe Commerce on Cloud بيستخدم Fastly بدل Varnish، والخطوات هنا خاصة بـ Magento Open Source و Adobe Commerce المتثبّتين على سيرفراتك.

أنهي إصدار Varnish أستخدمه مع Magento 2.4.9؟

متطلبات Adobe بتذكر Varnish 8، بس أمر varnish:vcl:generate عنده templates لحد إصدار 7 بس. ولّد الـ VCL بـ --export-version=7 واختبره على الـ staging قبل الـ production.

إزاي أولّد ملف VCL لـ Varnish في Magento 2؟

استخدم bin/magento varnish:vcl:generate مع --export-version و --access-list و --backend-host و --backend-port و --output-file. تقدر كمان تصدّر الملف من صفحة إعدادات الـ Full Page Cache في الأدمن لإصدارات Varnish 6 و 7.

ليه Varnish مش بيكاش أي صفحة في متجر Magento؟

أشهر سبب block عليه cacheable="false" في layout عام زي default.xml، وده بيقفل الكاش على كل الصفحات. اتأكد كمان إن Caching Application متظبط على Varnish وإن Varnish شغّال بالـ VCL اللي Magento ولّده.

هل محتاج Varnish لو عندي CDN؟

غالبًا أيوه. الـ CDN بيقدّم الملفات الثابتة والصور، و Varnish بيكاش صفحات الـ HTML نفسها قدّام Magento عشان الطلب مايوصلش لـ PHP، فالاتنين بيكمّلوا بعض.

دروس مرتبطة

كاتب المقال

Abdulrahman Masoud

عندك سؤال على المقال أو محتاج مساعدة في أداء متجر Magento؟ كلّمني.