Cloud CDN to kluczowy element wsparcia App Hosting dla Twojej aplikacji internetowej. Każde żądanie do backendu przechodzi najpierw przez Cloud CDN. Treści, które są już buforowane w CDN, są natychmiast przesyłane do użytkownika, co pozwala uniknąć wysyłania żądania do usługi Cloud Run, w której działa kod serwera aplikacji internetowej. Więcej informacji o ogólnych zaletach sieci CDN znajdziesz w witrynie web.dev.
Podstawowa konfiguracja Cloud CDN jest ustawiana przez App Hosting i nie można jej modyfikować. Istnieje jednak wiele sposobów na optymalizację zapisywania w pamięci podręcznej, aby zwiększyć szybkość wczytywania stron, zmniejszyć ilość treści niepobranych z pamięci podręcznej, za które naliczane są opłaty, i zminimalizować ruch w Cloud Run.
Treści, które można przechowywać w pamięci podręcznej
Cloud CDN przechowuje odpowiedzi w pamięci podręcznej, jeśli WSZYSTKIE z tych warunków są spełnione:
Żądanie to GET
Odpowiedź ma kod stanu
200
,203
,204
,206
,300
,301
,302
,307
,308
,404
,405
,410
,421
,451
lub501
.Odpowiedź zawiera nagłówek
Cache-Control
z dyrektywąmax-age
lubs-maxage
albo nagłówekExpires
ze znacznikiem czasu w przyszłości.Odpowiedź zawiera nagłówek
Age
lub nagłówekCache-Control
z wyraźną dyrektywąpublic
.Rozmiar odpowiedzi nie przekracza 10 MiB.
i ŻADNE z tych stwierdzeń nie jest prawdziwe:
Odpowiedź zawiera nagłówek
Set-Cookie
Odpowiedź zawiera nagłówek
Vary
o wartości innej niż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
lubNext-Router-Segment-Prefetch
.Odpowiedź zawiera nagłówek
Cache-Control
z dyrektywąno-store
lubprivate
.Żądanie zawiera nagłówek
Cache-Control
z dyrektywąno-store
.Żądanie ma nagłówek
Authorization
, chyba że odpowiedź zawiera wyraźną dyrektywę kontroli pamięci podręcznej.
Dostosowywanie działania za pomocą dyrektyw sterowania pamięcią podręczną
Next.js
Next.js niejawnie ustawia dyrektywy cache-control na podstawie wielu czynników. Możesz jednak zastąpić te wartości, ręcznie ustawiając nagłówek w pliku next.config.js
. Aby na przykład mieć pewność, że strona nie jest buforowana w Cloud CDN:
/** @type {import('next').NextConfig} */
const nextConfig = {
headers: async () => [{
source: "/YOUR_PRIVATE_PAGE",
headers: [{
key: "Cache-Control",
value: "private"
}],
}],
};
Angular
Angular SSR nie ustawia domyślnie jawnych dyrektyw cache-control. Możesz dodać własne, określając nagłówki cache-control w trasach serwera. Aby na przykład zezwolić Cloud CDN na zapisywanie w pamięci podręcznej wszystkich stron przez godzinę:
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
{
path: '**',
renderMode: RenderMode.Prerender,
headers: {
'Cache-Control': 'public, max-age=3600',
}
}
];
Aby mieć pewność, że określona strona nie będzie przechowywana w pamięci podręcznej:
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
// ... other routes
{
path: 'YOUR_PRIVATE_PAGE',
renderMode: RenderMode.Server,
headers: {
'Cache-Control': 'private',
}
}
];
Obowiązujące dyrektywy
Instancja Cloud CDN w Firebase App Hostingprzestrzega tych dyrektyw sterowania pamięcią podręczną:
Dyrektywa | Żądanie | Odpowiedź |
---|---|---|
no-store |
Jeśli ten parametr występuje w żądaniu, odpowiedź nie będzie buforowana. | Odpowiedź z wartością no-store nie jest zapisywana w pamięci podręcznej. |
no-cache |
Dyrektywa żądania no-cache jest ignorowana, aby zapobiec potencjalnemu inicjowaniu lub wymuszaniu ponownej weryfikacji przez klienty. |
Odpowiedź z wartością no-cache jest zapisywana w pamięci podręcznej, ale przed wyświetleniem musi zostać ponownie zweryfikowana w źródle. |
public |
Nie dotyczy | Ta dyrektywa nie jest wymagana w przypadku możliwości buforowania, ale zalecamy jej dodanie w przypadku treści, które powinny być buforowane przez serwery proxy. |
private |
Nie dotyczy | Odpowiedź z dyrektywą private nie jest przechowywana w pamięci podręcznej Cloud CDN, nawet jeśli w innym przypadku byłaby uznawana za odpowiedź, którą można umieścić w pamięci podręcznej. Klienci (np. przeglądarki) mogą nadal przechowywać wynik w pamięci podręcznej. Użyj no-store , aby zapobiec buforowaniu wszystkich odpowiedzi. |
max-age=SECONDS |
Dyrektywa żądania max-age jest ignorowana. Odpowiedź z pamięci podręcznej jest zwracana tak, jakby tego nagłówka nie było w żądaniu. |
Odpowiedź z dyrektywą max-age jest przechowywana w pamięci podręcznej przez określony czas w SEKUNDACH. |
s-maxage=SECONDS |
Nie dotyczy | Odpowiedź z dyrektywą s-maxage jest przechowywana w pamięci podręcznej przez określony czas w SEKUNDACH. Jeśli występują oba warunki max-age i s-maxage , Cloud CDN używa warunku s‑maxage . Odpowiedzi z tą dyrektywą nie są serwowane jako nieaktualne. s-max-age (dwa łączniki) nie jest prawidłowym znakiem do celów buforowania. |
max-stale=SECONDS |
Dyrektywa żądania max-stale określa maksymalną nieaktualność (w sekundach), którą klient jest gotów zaakceptować. Cloud CDN uwzględnia tę dyrektywę i zwraca nieaktualną odpowiedź z pamięci podręcznej tylko wtedy, gdy jej nieaktualność jest mniejsza niż dyrektywa max-stale . W przeciwnym razie przed obsłużeniem żądania ponownie sprawdza ważność. |
Nie dotyczy |
stale-while-revalidate=SECONDS |
Nie dotyczy | Klient otrzymuje odpowiedź z wartością stale-while-revalidate przez maksymalnie SECONDS, podczas gdy ponowna weryfikacja odbywa się asynchronicznie. |
must-revalidate |
Nie dotyczy | Odpowiedź z must-revalidate jest ponownie weryfikowana na serwerze pierwotnym po wygaśnięciu. Odpowiedzi z tą dyrektywą nie są serwowane jako nieaktualne. |
proxy-revalidate |
Odpowiedź z proxy-revalidate jest ponownie weryfikowana na serwerze pierwotnym po wygaśnięciu. Odpowiedzi z tą dyrektywą nie są serwowane jako nieaktualne. |
|
no-transform |
Nie dotyczy | Cloud CDN nie stosuje żadnych przekształceń. |
Mierzenie ruchu z pamięci podręcznej i bez niej
Wykres „Cloud CDN – przepustowość wychodząca” na karcie Użycie w konsoliApp Hosting pokazuje liczbę bajtów z pamięci podręcznej i bez niej, a także oznaczenie dla każdego wdrożenia. Za pomocą tego wykresu możesz mierzyć skuteczność optymalizacji pamięci podręcznej.