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

‫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 לא מחיל טרנספורמציות.

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

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