Кэшировать содержимое приложения

Облачная CDN — это важнейшая часть поддержки вашего веб-приложения со стороны App Hosting . Каждый запрос к вашему бэкэнду сначала проходит через облачную CDN. Контент, уже кэшированный в CDN, немедленно передается пользователю, минуя службу Cloud Run, выполняющую серверный код вашего веб-приложения. Подробнее об общих преимуществах CDN можно узнать на сайте web.dev .

Хотя базовая конфигурация Cloud CDN задается App Hosting и не может быть изменена, существует ряд мер, которые можно предпринять для оптимизации кэширования с целью увеличения скорости загрузки страниц, сокращения платного некэшированного контента и минимизации трафика к Cloud Run.

кэшируемый контент

Облачная 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 , если только в ответе нет явной директивы управления кэшированием.

Настройте поведение с помощью директив управления кэшированием.

Next.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',
    }
  }
];

Уважаемые директивы

Экземпляр облачной CDN-сети Firebase App Hosting учитывает следующие директивы управления кэшированием:

Директива Запрос Ответ
no-store Если этот параметр присутствует в запросе, ответ не будет кэшироваться. Ответ без no-store не кэшируется.
no-cache Директива запроса no-cache игнорируется, чтобы предотвратить потенциальную возможность инициирования или принудительной повторной проверки подлинности у источника со стороны клиентов. Ответ no-cache кэшируется, но перед отправкой должен быть повторно проверен у источника.
public Н/Д Эта директива не является обязательной для кэширования, но рекомендуется включать её для контента, который должен кэшироваться прокси-серверами.
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 request определяет максимально допустимое время ожидания ответа (в секундах), которое клиент готов принять. Cloud CDN учитывает это и возвращает кэшированный ответ только в том случае, если время ожидания ответа меньше значения директивы max-stale . В противном случае, перед обработкой запроса выполняется повторная проверка. Н/Д
stale-while-revalidate=SECONDS Н/Д Ответ с stale-while-revalidate отправляется клиенту в течение нескольких секунд, пока происходит асинхронная повторная проверка.
must-revalidate Н/Д Ответ с директивой must-revalidate проходит повторную проверку на исходном сервере после истечения срока его действия. Ответы с этой директивой не отправляются как устаревшие.
proxy-revalidate Ответ с proxy-revalidate повторно проверяется на исходном сервере после истечения срока его действия. Ответы с этой директивой не отправляются устаревшим.
no-transform Н/Д Облачная CDN не применяет никаких преобразований.

Измеряйте объем кэшированного и некэшированного трафика.

График «Cloud CDN — Исходящая пропускная способность» на вкладке « Использование » в консоли App Hosting отображает объем переданных кэшированных и некэшированных байтов и имеет отметку для каждого развертывания. Вы можете использовать этот график для оценки эффективности ваших усилий по оптимизации кэширования.

С помощью мониторинга на основе маршрутов вы также можете просмотреть коэффициент попадания в кэш для конкретных маршрутов в вашем веб-приложении.