Loading...

دراسات الحالة

دراسة حالة: تنظيم رؤوس التخزين المؤقت في موقع إخباري

يدير موقع إخباري رياضي تركي عالي الزيارات التخزين المؤقت من الخادم الأصلي (origin) الخاص به وليس من اللوحة. أربعة مستويات من المحتوى، وأربعة رؤوس Cache-Control مختلفة، وكلها قابلة للتحقق من الخارج.

العودة إلى مساعدة المنصة
ما الذي تشرحه هذه الصفحة

رؤوس الاستجابة الفعلية لحساب حقيقي، وسبب اختيار كل رأس منها بهذا الشكل. لا يُذكر اسم العميل؛ وكل رأس مذكور هنا مكتوب بحيث يمكنك التحقق منه على موقعك بتشغيل الأمر نفسه.

أربعة مستويات، أربع مدد مختلفة

لا تكفي مدة تخزين مؤقت واحدة لموقع إخباري: الصفحة الرئيسية تتغيّر كل دقيقة، والشعار لا يتغيّر لسنوات. هذا الحساب يفصل المحتوى حسب سرعة تغيّره.

المحتوى الرأس المُرسَل من origin السبب
الصفحة الرئيسية public, max-age=30, s-maxage=30, stale-while-revalidate=60 تتجدد الأخبار العاجلة كل 30 ثانية؛ وعند انتهاء المدة لا ينبغي أن ينتظر الزائر — يقدّم الـ edge النسخة القديمة بينما يجدّدها في الخلفية.
صفحات الأقسام والقوائم public, max-age=300, s-maxage=300, stale-while-revalidate=600 صفحات التصنيفات لا تتغيّر بقدر ما تتغيّر الصفحة الرئيسية. خمس دقائق ليست تأخيرًا سيلاحظه فريق التحرير، وهي تخفّض الحِمل على الـ edge بشكل ملحوظ.
ملف ثابت مرقّم بإصدار public, max-age=31536000, s-maxage=31536000, immutable اسم الملف يحمل رقم إصدار، لذا لا يتغيّر محتواه أبدًا. يمنع immutable المتصفح من إعادة السؤال حتى قبل انتهاء max-age.
صورة مُحسَّنة max-age=31536000 + public في سطر منفصل هذا السطر يكتبه الـ edge وليس origin — فعندما تكون Image Optimization مفعّلة في قاعدة ما يُعاد توليد الرأس دون شرط.

كيفية إعداد النظام نفسه على موقعك

1

افصل المحتوى حسب سرعة تغيّره

قرّر أولًا أي مسار يتغيّر وبأي وتيرة، لا المدد — فالمدة نتيجة لهذا القرار.

  • يتغيّر خلال دقائق: الصفحة الرئيسية، النتائج المباشرة، شريط الأخبار العاجلة
  • يتغيّر خلال ساعات: صفحات التصنيفات، قوائم الأرشيف
  • لا يتغيّر أبدًا: CSS وJS والخطوط والشعار — أي ملف يحمل رقم إصدار في اسمه
  • شخصي: الصفحات بعد تسجيل الدخول، السلة، الحساب — هذه لا تُخزَّن مؤقتًا ويجب ألا تُخزَّن
2

انشر الرؤوس من origin الخاص بك

الرأس يُرسله تطبيقك أو خادم الويب لديك. لا حاجة لإدخال مدة في اللوحة؛ فالطريقتان لا تعملان معًا على القاعدة نفسها.

  • s-maxage مخصص للتخزين المؤقت المشترك (أي الـ CDN)، وmax-age للمتصفح؛ يمكنك منحهما قيمتين مختلفتين
  • stale-while-revalidate يمنع انتظار الزائر عند انتهاء المدة — تُقدَّم النسخة القديمة بينما تُجلب نسخة جديدة في الخلفية
  • لا يُعطى immutable إلا إذا كان اسم الملف مرقّمًا بإصدار؛ فإن أُعطي لملف غير مرقّم بقي في المتصفح لسنة كاملة
3

اترك القاعدة متوافقة مع origin

في Delivery Rules، يجب أن تكون **Use browser cache time** مفعّلة في قاعدة هذا المسار، وأن يبقى **Cache Expire Time** فارغًا.

  • إن أدخلت مدة، تُتجاهَل رؤوس origin في تلك القاعدة، ويُعاد كتابة الرأس المُرسَل إلى المتصفح أيضًا
  • يمكنك فصل القواعد حسب المسار: قاعدة للملفات الثابتة وأخرى للصفحات
4

قِس، ثم وسّع

جرّب أولًا على مسار واحد. بعد أن ترى الرأس المتوقَّع يعود وتحصل على HIT، انتقل إلى المستويات الأخرى.

كيف تتحقق من أن كل شيء يعمل

كل شيء يظهر في رؤوس الاستجابة؛ لا حاجة للنظر إلى اللوحة. اطلب الرابط نفسه مرتين:

curl -sI https://mawqeak.com/safha | grep -iE "cache-control|x-proxy-cache-mt"
  • ظهور X-Proxy-Cache-MT: MISS أمر طبيعي في الطلب الأول — المحتوى يُخزَّن مؤقتًا في تلك اللحظة. الطلب الثاني ينبغي أن يعيد HIT.
  • STALE ليس خطأً: فهو يعني أن stale-while-revalidate يعمل كما ينبغي — يحصل الزائر على النسخة القديمة بينما تُجلب نسخة جديدة في الخلفية.
  • إن رأيت BYPASS فأنت غالبًا مسجّل الدخول إلى الموقع؛ فكوكي الجلسة يتجاوز التخزين المؤقت عمدًا. أعد المحاولة في نافذة خاصة (تصفح متخفٍ).
  • إن كان Cache-Control العائد مختلفًا عمّا أرسلته، فهذا يعني أن مدة ثابتة أُدخلت في تلك القاعدة.
  • إن أردت أيضًا رؤية ما يرسله origin، فعّل رؤوس تشخيص origin في القاعدة؛ يُظهر X-Upstream-CacheControl ما يقوله origin، بينما يُظهر Cache-Control ما يراه الزائر.

ثلاثة أمور تجعل الرأس الصحيح عديم الفائدة

  • الاستجابة التي ترسل Set-Cookie لا تُخزَّن مؤقتًا أبدًا. لا يهم مدى صحة Cache-Control. هذا هو السبب الأكثر شيوعًا لعدم تسخين التخزين المؤقت مطلقًا: التطبيق يضع كوكي جلسة في كل طلب.
  • عندما تكون Image Optimization مفعّلة في قاعدة ما، تُحفظ الصور 365 يومًا ويُتجاهل رأس origin. إن أردت إدارة الصور بنفسك، عطّل هذا الإعداد في تلك القاعدة.
  • لا تُعطِ immutable لملف غير مرقّم بإصدار. إن لم يتغيّر اسم الملف، يستخدم المتصفح النسخة القديمة لمدة سنة، ولا يصلح purge الـ CDN ذلك — فالـ purge ينظّف الـ edge فقط، لا قرص الزائر.

التالي