שמירת תוכן האפליקציה במטמון

‫Cloud CDN הוא חלק חשוב בתמיכה של App Hosting באפליקציית האינטרנט שלכם. כל בקשה לשרת העורפי עוברת קודם דרך Cloud CDN. תוכן שכבר נמצא במטמון ב-CDN מוחזר למשתמש באופן מיידי, בלי לעבור דרך שירות Cloud Run שמריץ את קוד השרת של אפליקציית האינטרנט. מידע נוסף על היתרונות הכלליים של רשתות CDN אפשר למצוא בכתובת web.dev.

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

תוכן שניתן לשמור במטמון

‫Cloud CDN מאחסן תשובות במטמון אם כל התנאים הבאים מתקיימים:

  1. הבקשה היא GET

  2. התגובה כוללת קוד סטטוס של 200,‏ 203,‏ 204,‏ 206,‏ 300,‏ 301,‏ 302,‏ 307,‏ 308,‏ 404,‏ 405,‏ 410,‏ 421,‏ 451 או 501.

  3. התשובה כוללת כותרת Cache-Control עם הנחיה max-age או s-maxage, או כותרת Expires עם חותמת זמן עתידית.

  4. בתשובה יש כותרת Age או כותרת Cache-Control עם הוראה מפורשת public.

  5. גודל התשובה הוא 10MiB או פחות.

וגם אף אחד מהתנאים הבאים לא מתקיים:

  1. בתשובה יש כותרת Set-Cookie

  2. בתגובה יש כותרת Vary עם ערך שאינו Accept,‏ Accept-Encoding,‏ Access-Control-Request-Headers,‏ Access-Control-Request-Method,‏ Origin,‏ Sec-Fetch-Dest,‏ Sec-Fetch-Mode,‏ Sec-Fetch-Site,‏ X-Goog-Allowed-Resources,‏ X-Origin,‏ RSC,‏ Next-Router-State-Tree,‏ Next-Router-Prefetch או Next-Router-Segment-Prefetch.

  3. בתשובה יש כותרת Cache-Control עם ההנחיה no-store או private.

  4. לבקשה יש כותרת Cache-Control עם הוראה no-store.

  5. לבקשה יש כותרת Authorization, אלא אם לתגובה יש הוראה מפורשת של בקרת מטמון.

התאמה אישית של ההתנהגות באמצעות הוראות לשליטה במטמון

Next.js

‫Next.js מגדיר הנחיות של cache-control באופן מרומז על סמך מספר גורמים. עם זאת, אפשר לבטל את ההגדרות האלה על ידי הגדרת הכותרת באופן ידני בקובץ next.config.js. לדוגמה, כדי לוודא שדף לא נשמר במטמון ב-Cloud CDN:

  /** @type {import('next').NextConfig} */
  const nextConfig = {
      headers: async () => [{
          source: "/YOUR_PRIVATE_PAGE",
          headers: [{
              key: "Cache-Control",
              value: "private"
          }],
      }],
  };

Angular

ה-SSR של Angular לא מגדיר הנחיות מפורשות של cache-control כברירת מחדל. אפשר להוסיף משלכם על ידי ציון כותרות של בקרת מטמון בנתיבי השרת. לדוגמה, כדי לאפשר ל-Cloud CDN לשמור במטמון את כל הדפים למשך שעה:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  {
    path: '**',
    renderMode: RenderMode.Prerender,
    headers: {
      'Cache-Control': 'public, max-age=3600',
    }
  }
];

או כדי לוודא שדף ספציפי לא יישמר במטמון:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  // ... other routes
  {
    path: 'YOUR_PRIVATE_PAGE',
    renderMode: RenderMode.Server,
    headers: {
      'Cache-Control': 'private',
    }
  }
];

הוראות שהמערכת פועלת לפיהן

מופע Cloud CDN של Firebase App Hostingמכבד את ההנחיות הבאות של בקרת מטמון:

הוראה בקשה תשובה
no-store אם הפרמטר הזה מופיע בבקשה, התגובה לא תישמר במטמון. תשובה עם no-store לא נשמרת במטמון.
no-cache ההנחיה לבקשה no-cache מתעלמת כדי למנוע מלקוחות לאתחל או לכפות אימות מחדש למקור. תגובה עם no-cache נשמרת במטמון, אבל צריך לאמת אותה מחדש מול המקור לפני שהיא מוגשת.
public לא רלוונטי ההנחיה הזו לא נדרשת כדי לאפשר שמירה במטמון, אבל מומלץ לכלול אותה בתוכן שצריך להישמר במטמון על ידי שרתי proxy.
private לא רלוונטי תגובה עם ההנחיה private לא נשמרת במטמון של Cloud CDN, גם אם התגובה נחשבת ככזו שאפשר לשמור במטמון. יכול להיות שעדיין יהיה שמור במטמון של לקוחות (כמו דפדפנים) את התוצאה. כדאי להשתמש ב-no-store כדי למנוע שמירה במטמון של כל התגובות.
max-age=SECONDS המערכת מתעלמת מהוראת הבקשה max-age. תגובה שנשמרה במטמון מוחזרת כאילו הכותרת הזו לא נכללה בבקשה. תגובה עם ההנחיה max-age נשמרת במטמון למשך מספר השניות שמוגדר.
s-maxage=SECONDS לא רלוונטי תגובה עם ההנחיה s-maxage נשמרת במטמון למשך מספר השניות שמוגדר. אם יש גם max-age וגם s-maxage, ‏ Cloud CDN משתמש ב-s‑maxage. תשובות עם ההנחיה הזו לא מוצגות כשהן לא עדכניות. הערך s-max-age (שני מקפים) לא תקין למטרות שמירה במטמון.
max-stale=SECONDS ההנחיה max-stale בבקשה קובעת את הטריות המקסימלית (בשניות) שהלקוח מוכן לקבל. ‫Cloud CDN מכבד את ההנחיה הזו ומחזיר תגובה מאוחסנת במטמון שהתיישנה רק אם משך הזמן שחלף מאז שהתגובה אוחסנה במטמון קטן מההנחיה max-stale. אחרת, המערכת תבצע אימות מחדש לפני שתטפל בבקשה. לא רלוונטי
stale-while-revalidate=SECONDS לא רלוונטי תשובה עם stale-while-revalidate מוגשת ללקוח למשך עד שניות בזמן שמתבצעת אימות מחדש באופן אסינכרוני.
must-revalidate לא רלוונטי תגובה עם must-revalidate מאומתת מחדש בשרת המקור אחרי שהיא פגה. תשובות עם ההנחיה הזו לא מוצגות כשהן לא עדכניות.
proxy-revalidate תגובה עם proxy-revalidate מאומתת מחדש בשרת המקור אחרי שהיא פגה. תשובות עם ההנחיה הזו לא מוצגות כשהן לא עדכניות.
no-transform לא רלוונטי ‫Cloud CDN לא מחיל טרנספורמציות.

מדידת תנועה במטמון ותנועה שלא במטמון

בכרטיסייה App Hosting > Usage במסוף Firebase, בתרשים Cloud CDN - Outgoing Bandwidth מוצגים בייטים ששירתו ממטמון ובייטים שלא שירתו ממטמון, ויש סימון לכל השקה. אפשר להשתמש בתרשים הזה כדי למדוד את היעילות של מאמצי האופטימיזציה של המטמון.

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