Uygulama içeriğini önbelleğe alma

Cloud CDN, App Hosting'nın web uygulamanız için verdiği desteğin önemli bir parçasıdır. Arka uçunuza yapılan her istek önce Cloud CDN'den geçer. CDN'de önbelleğe alınmış içerikler, web uygulamanızın sunucu kodunu çalıştıran Cloud Run hizmetine gitmeden doğrudan kullanıcıya sunulur. CDN'lerin genel avantajları hakkında daha fazla bilgiyi web.dev adresinde bulabilirsiniz.

Temel Cloud CDN yapılandırması App Hosting tarafından ayarlanır ve değiştirilemez. Ancak sayfa yükleme hızlarını artırmak, faturalandırılan önbelleğe alınmamış içeriği azaltmak ve Cloud Run'a yönelik trafiği en aza indirmek için önbelleğe alma işleminizi optimize etmek üzere yapabileceğiniz çeşitli işlemler vardır.

Önbelleğe alınabilir içerik

Aşağıdaki koşulların TÜMÜ doğruysa Cloud CDN yanıtları önbellekte depolar:

  1. İstek bir GET isteğidir.

  2. Yanıtın durum kodu 200, 203, 204, 206, 300, 301, 302, 307, 308, 404, 405, 410, 421, 451 veya 501.

  3. Yanıt, max-age veya s-maxage yönergesi içeren bir Cache-Control üstbilgisine ya da gelecekteki bir zaman damgası içeren bir Expires üstbilgisine sahip.

  4. Yanıt, Age başlığına veya açık bir public yönergesi içeren Cache-Control başlığına sahip.

  5. Yanıtın boyutu 10 MiB'ten küçük veya bu boyuta eşit olmalıdır.

Ayrıca aşağıdakilerden HİÇBİRİ doğru olmamalıdır:

  1. Yanıtın Set-Cookie başlığı var

  2. Yanıt, 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 veya Next-Router-Segment-Prefetch dışında bir değere sahip Vary başlığı içeriyor.

  3. Yanıtta no-store veya private yönergesini içeren bir Cache-Control üstbilgisi var.

  4. İstek, no-store yönergesine sahip bir Cache-Control başlığı içeriyor.

  5. Yanıt açık bir önbellek kontrol yönergesi içermediği sürece istekte Authorization üstbilgisi bulunur.

Önbellek kontrolü yönergeleriyle davranışı özelleştirme

Next.js

Next.js, bir dizi faktöre bağlı olarak önbellek kontrolü yönergelerini örtülü olarak ayarlar. Ancak, next.config.js dosyanızda üstbilgiyi manuel olarak ayarlayarak bu ayarları geçersiz kılabilirsiniz. Örneğin, bir sayfanın Cloud CDN'de önbelleğe alınmadığından emin olmak için:

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

Angular

Angular SSR, kutudan çıkarıldığında açıkça belirtilmiş cache-control yönergeleri ayarlamaz. Sunucu rotalarınızda cache-control üstbilgilerini belirterek kendi üstbilgilerinizi ekleyebilirsiniz. Örneğin, Cloud CDN'nin tüm sayfaları bir saat boyunca önbelleğe almasına izin vermek için:

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

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

Veya belirli bir sayfanın önbelleğe alınmamasını sağlamak için:

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

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

Uyum sağlanan yönergeler

Firebase'in App Hosting Cloud CDN örneği aşağıdaki önbellek kontrolü yönergelerine uyar:

Yönerge İstek Yanıt
no-store İsteklerde mevcut olduğunda yanıt önbelleğe alınmaz. no-store içeren yanıtlar önbelleğe alınmaz.
no-cache İstemcilerin, kaynağa yeniden doğrulama başlatmasını veya bunu zorlamasını önlemek için no-cache istek yönergesi yoksayılır. no-cache içeren bir yanıt önbelleğe alınır ancak sunulmadan önce kaynakla yeniden doğrulanması gerekir.
public Yok Bu yönerge, önbelleğe alınabilirlik için gerekli değildir ancak proxy'ler tarafından önbelleğe alınması gereken içerikler için bu yönergenin eklenmesi en iyi uygulamadır.
private Yok private yönergesi içeren bir yanıt, başka bir şekilde önbelleğe alınabilir olarak kabul edilse bile Cloud CDN tarafından önbelleğe alınmaz. İstemciler (ör. tarayıcılar) sonucu önbelleğe almaya devam edebilir. Yanıtların önbelleğe alınmasını engellemek için no-store kullanın.
max-age=SECONDS max-age istek yönergesi yoksayılır. Önbelleğe alınmış bir yanıt, bu üstbilgi istekte yer almıyormuş gibi döndürülür. max-age yönergesi içeren bir yanıt, tanımlanan SECONDS süresine kadar önbelleğe alınır.
s-maxage=SECONDS Yok s-maxage yönergesi içeren bir yanıt, tanımlanan SECONDS süresine kadar önbelleğe alınır. Hem max-age hem de s-maxage varsa Cloud CDN tarafından s‑maxage kullanılır. Bu yönergeye sahip yanıtlar eski olarak sunulmaz. s-max-age (iki kısa çizgi), önbelleğe alma amacıyla geçerli değil.
max-stale=SECONDS max-stale istek yönergesi, istemcinin kabul etmeye istekli olduğu maksimum eski (saniye cinsinden) yanıtı belirler. Cloud CDN bunu dikkate alır ve yalnızca yanıtın eskime süresi max-stale yönergesinden kısaysa eski bir önbelleğe alınmış yanıt döndürür. Aksi takdirde, isteği sunmadan önce yeniden doğrular. Yok
stale-while-revalidate=SECONDS Yok Yeniden doğrulama eşzamansız olarak gerçekleşirken stale-while-revalidate içeren bir yanıt, istemciye en fazla SECONDS boyunca sunulur.
must-revalidate Yok must-revalidate içeren bir yanıt, süresi dolduktan sonra kaynak sunucuyla yeniden doğrulanır. Bu yönergeye sahip yanıtlar eski olarak sunulmaz.
proxy-revalidate proxy-revalidate içeren bir yanıt, süresi dolduktan sonra kaynak sunucuyla yeniden doğrulanır. Bu yönergeye sahip yanıtlar eski olarak sunulmaz.
no-transform Yok Cloud CDN tarafından herhangi bir dönüşüm uygulanmaz.

Önbelleğe alınmış ve alınmamış trafiği ölçme

App Hosting konsolunun Kullanım sekmesindeki "Cloud CDN - Giden Bant Genişliği" grafiğinde, sunulan önbelleğe alınmış ve alınmamış baytlar gösterilir ve her kullanıma sunma işlemi için bir işaret bulunur. Bu grafiği, önbellek optimizasyonu çalışmalarınızın etkinliğini ölçmek için kullanabilirsiniz.