Облачная CDN — это важнейшая часть поддержки вашего веб-приложения со стороны App Hosting . Каждый запрос к вашему бэкэнду сначала проходит через облачную CDN. Контент, уже кэшированный в CDN, немедленно передается пользователю, минуя службу Cloud Run, выполняющую серверный код вашего веб-приложения. Подробнее об общих преимуществах CDN можно узнать на сайте web.dev .
Хотя базовая конфигурация Cloud CDN задается App Hosting и не может быть изменена, существует ряд мер, которые можно предпринять для оптимизации кэширования с целью увеличения скорости загрузки страниц, сокращения платного некэшированного контента и минимизации трафика к Cloud Run.
кэшируемый контент
Облачная CDN сохраняет ответы в кэше, если выполняются ВСЕ следующие условия:
Запрос выполнен методом GET.
Ответ имеет код состояния
200,203,204,206,300,301,302,307,308,404,405,410,421,451или501.В ответе присутствует заголовок
Cache-Controlс директивойmax-ageилиs-maxage, либо заголовокExpiresс меткой времени в будущем.В ответе присутствует заголовок
Ageили заголовокCache-Controlс явной директивойpublic.Размер ответа составляет менее или равен 10 МиБ.
И НИ ОДНО из следующих утверждений не соответствует действительности:
В ответе присутствует заголовок
Set-CookieВ ответе присутствует заголовок
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.В ответе присутствует заголовок
Cache-Controlс директивойno-storeилиprivate.Запрос содержит заголовок
Cache-Controlс директивойno-store.Запрос содержит заголовок
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 отображает объем переданных кэшированных и некэшированных байтов и имеет отметку для каждого развертывания. Вы можете использовать этот график для оценки эффективности ваших усилий по оптимизации кэширования.
С помощью мониторинга на основе маршрутов вы также можете просмотреть коэффициент попадания в кэш для конкретных маршрутов в вашем веб-приложении.