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

‫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 מוגשת ללקוח למשך עד SECONDS בזמן שמתבצעת אימות מחדש באופן אסינכרוני.
must-revalidate לא רלוונטי תגובה עם must-revalidate מאומתת מחדש בשרת המקור אחרי שהתוקף שלה פג. תשובות עם ההנחיה הזו לא מוצגות כשהן לא עדכניות.
proxy-revalidate תגובה עם proxy-revalidate מאומתת מחדש בשרת המקור אחרי שהתוקף שלה פג. תשובות עם ההנחיה הזו לא מוצגות כשהן לא עדכניות.
no-transform לא רלוונטי ‫Cloud CDN לא מבצע טרנספורמציות.

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

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

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