محتوای برنامه کش

Cloud CDN بخش مهمی از پشتیبانی App Hosting برای برنامه وب شما است. هر درخواستی که به backend شما ارسال می‌شود، ابتدا از Cloud CDN عبور می‌کند. محتوایی که از قبل در CDN ذخیره شده است، بلافاصله به کاربر بازگردانده می‌شود و نیازی به مراجعه به سرویس Cloud Run که کد سرور برنامه وب شما را اجرا می‌کند، نیست. می‌توانید در web.dev درباره مزایای کلی CDNها بیشتر بدانید.

اگرچه پیکربندی اولیه 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. حجم پاسخ کمتر یا مساوی 10 مگابایت است.

و هیچ یک از موارد زیر صحیح نیست:

  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 header) است، مگر اینکه پاسخ دارای یک دستورالعمل کنترل حافظه پنهان (cache control directive) صریح باشد.

سفارشی‌سازی رفتار با دستورالعمل‌های کنترل حافظه پنهان

بعدی.js

Next.js دستورالعمل‌های کنترل حافظه پنهان را به طور ضمنی و بر اساس تعدادی از عوامل تنظیم می‌کند. با این حال، می‌توانید با تنظیم دستی هدر در فایل 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 دستورالعمل‌های کنترل حافظه پنهان (cache-control) را به صورت پیش‌فرض تنظیم نمی‌کند. می‌توانید با مشخص کردن هدرهای کنترل حافظه پنهان (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 request) نادیده گرفته می‌شود تا از شروع یا اعمال اعتبارسنجی مجدد به مبدا توسط کلاینت‌ها جلوگیری شود. پاسخی که no-cache کش می‌شود اما قبل از ارائه باید توسط مبدا مجدداً اعتبارسنجی شود.
public ناموجود این دستورالعمل برای قابلیت ذخیره‌سازی در حافظه پنهان (cacheability) الزامی نیست، اما بهترین روش این است که آن را برای محتوایی که باید توسط پروکسی‌ها ذخیره‌سازی شوند، لحاظ کنید.
private ناموجود پاسخی که با دستورالعمل private ارائه شده باشد، توسط Cloud CDN ذخیره نمی‌شود، حتی اگر پاسخ از جهات دیگر قابل ذخیره در حافظه پنهان در نظر گرفته شود. کلاینت‌ها (مانند مرورگرها) ممکن است همچنان نتیجه را ذخیره کنند. برای جلوگیری از ذخیره کامل پاسخ‌ها no-store استفاده کنید.
max-age=SECONDS دستورالعمل درخواست max-age نادیده گرفته می‌شود. یک پاسخ ذخیره‌شده برگردانده می‌شود، انگار که این هدر در درخواست گنجانده نشده است. پاسخی که شامل دستورالعمل max-age باشد، تا ثانیه‌های تعریف‌شده در حافظه پنهان (cache) ذخیره می‌شود.
s-maxage=SECONDS ناموجود پاسخی که شامل دستورالعمل s-maxage باشد، تا ثانیه‌های تعریف‌شده در حافظه پنهان (cache) ذخیره می‌شود. اگر هر دو max-age و s-maxage موجود باشند، s‑maxage توسط Cloud CDN استفاده می‌شود. پاسخ‌های حاوی این دستورالعمل، بی‌کیفیت ارائه نمی‌شوند. 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 ارسال می‌شود، پس از انقضا، توسط سرور مبدا مجدداً اعتبارسنجی می‌شود. پاسخ‌هایی که با این دستورالعمل ارائه می‌شوند، قدیمی (stale) ارائه نمی‌شوند.
no-transform ناموجود هیچ تبدیلی توسط Cloud CDN اعمال نمی‌شود.

اندازه‌گیری ترافیک ذخیره‌شده و ذخیره‌نشده

نمودار «Cloud CDN - پهنای باند خروجی» در تب Usage کنسول App Hosting ، بایت‌های کش‌شده و کش‌نشده‌ی ارائه شده را نشان می‌دهد و برای هر مرحله یک علامت دارد. می‌توانید از این نمودار برای سنجش اثربخشی تلاش‌های بهینه‌سازی کش خود استفاده کنید.

همچنین می‌توانید با استفاده از Route-based Monitoring، میزان موفقیت در کش را برای مسیرهای خاص در برنامه وب خود مشاهده کنید.