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

‫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 לא מגדיר הנחיות מפורשות של בקרת מטמון ללא הגדרה מראש. אפשר להוסיף משלכם על ידי ציון כותרות של בקרת מטמון בנתיבי השרת. לדוגמה, כדי לאפשר ל-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 מוצגים בייטים ששירתו ממטמון ובייטים שלא שירתו ממטמון, ויש סימון לכל השקה. אפשר להשתמש בתרשים הזה כדי למדוד את היעילות של מאמצי האופטימיזציה של המטמון.

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