Cache CDN e ottimizzazione TTL
Breve riepilogo
La cache CDN è un acceleratore + scudo tra l'utente e l'origin. Funziona bene quando:1. La chiave cache (cache key) è stabile e non contiene rumore.
2. Criteri di carico TTL: «s-maxage »/« max-age» + «stale-while-revalidate/if-error».
3. Disabilità guidata da tag/prefissi + purge morbide.
4. Incluse tiered-cache/origin-shield e negative-cache.
5. C'è osservabilità: hit-ratio per strati, p95 TTFB, quota di restituzione 304.
Header di base e cosa significano
`Cache-Control`:- «max-age =
» - TTL per il browser. - «s-maxage =
» - TTL per CDN/proxy (sovrappone «max-age»). - «stale-while-revalidate =
» - Restituiamo a quelli obsoleti, contemporaneamente aggiorniamo. - «stale-if-error =
» - Restituisci l'ultimo errore origin. - «immutabile» - La risorsa non cambia (adatta per gli assetti versionati).
- «ETAG »/« Last-Modified» - condizioni per 304, risparmiando byte/CPU origin.
- «Vary» è un elenco di titoli che influenzano la chiave della cache (usare discretamente!).
- «Surrogate-Control» - Cache-Control avanzato per CDN (se supportato).
- «Expires» è obsoleto, ma è ancora considerato dai clienti.
Cache-Control: public, max-age=31536000, immutable
Esempio (mezza dinamica con obsolescenza sicura):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
Chiave cache: progettazione e normalizzazione
L'obiettivo è che le stesse richieste finiscano nello stesso oggetto.
Regolazione URL: maiuscole, doppie slash, trailing slash, ordine dei parametri query.
Ignora «rumore»: «utm _», «fbclid», «gclid», tag rife casuali.
Varietà limitata: solo titoli reali («Accept-Encoding», talvolta «Accept», «Accept-Language» per i locali).
Device-class: se necessario, utilizzare 2-3 classi (mobile/desktop/tablet), non i rami user-agente infiniti.
Contesto Auth: per impostazione predefinita, non memorizzare il contesto privato; Utilizzare signed-URWS/cookies-bypass o separare percorsi pubblici/privati.
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
TTL per tipo di contenuto
Criteri di invalidità
By URL/Preferix: «Pulire tutto sotto »/static/2025-11-05/«».
By Tag/Key: «Togliere tutto» catalog «e» product: 123 «».
Soft purge: contrassegnare come obsoleto, non cancellare l'oggetto - più veloce del riempimento.
Event-driven: CI/CD o admine-evento chiama webhook «invalidate tags».
Raccomandazione: combinare entrambe le tattiche: versioning dei percorsi per asset + tag-purge per contenuti/pagine.
Tiered-cache, origin-shield и prewarm
Tered-cache - I livelli CDN regionali hanno meno richieste di origin.
Origin-shield: un POP a origin «scudo» - migliora la località e l'hit-ratio.
Prewarm (pre-fetch) - Scalda gli URL/cache hot prima dell'ivent/release.
Negative-cache: annulla in breve tempo 5xx/Timeout (30-120 s) per evitare di essere abbattuto da una tempesta di retrai origin.
Api Kesh quando è possibile
Solo GET/HEAD e idipotenti.
Chiave: percorso + query sostanziale (ad esempio, '? category =... & page =...').
Valida: 'ETag '/' Last-Modified'e's-maxage'.
Filtri utente: inserisci la personalizzazione su client/edge-funzione o usi signed-richiesti + risposta pubblica.
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
Protezione da avvelenamento cache (cache poisoning)
Regolazione rigida degli URL/titoli; l'elenco bianco dei parametri in chiave.
Ritaglia intestazioni/duplicati sospetti («X-Forwarded», «Accept»).
Vincolo «Vary» e controllo delle dimensioni e delle intestazioni.
Separazione domini: privato/admine su un nome separato senza cache.
Convalida delle risposte: non memorizzare 4xx nella cache (tranne 404 per gli statici), non memorizzare pagine personalizzate senza criteri espliciti.
Compressione e formati
Brotli per testo (js/css/json), gzip - fallback; gli assetti pre-compressi sono validi.
Immagini: webp/avif dove è supportato; Usate «Vary: Accept» + derivati derivati.
Range-richiesti per video/audio: CDN memorizza la cache.
Content-Negotion - Tenere basso il cardinale chiave (device-class invece di UA crude).
Osservabilità e SLO
Metriche chiave
Hit-ratio (by bytes/requests) на edge/tier/shield.
p50/95/99 TTFB per regione e tipo (statico/API).
Fill-rate/Origin egress - Quanto va all'origin.
304 rate e la dimensione media della risposta.
Errore budget: parte «stale-if-error »/« SWR» delle erogazioni; frequenza purge.
Esempi SLO
«p95 TTFB» statico regionale di 120-150 ms, API GET di 200-250 mc.
Edge hit-ratio statico è al 90%, mezza dinamica al 60%.
La percentuale di risposte da un ramo stale quando si verifica un errore è 0. Cinque per cento in 30 giorni.
Scorciatoie Config
Nginx (reverse-proxy prima del CDN o nel self-PoP)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CDN:512m max_size=100g inactive=7d;
map $args $clean_args {
"~(^ &)(utm_ gclid fbclid) """; # default $ args simplified example;
}
server {
listen 443 ssl http2;
set $cache_key "$scheme$request_method$host$uri?$clean_args $http_accept $http_accept_encoding";
location /static/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_ignore_headers Set-Cookie;
add_header Cache-Control "public, s-maxage=86400, max-age=3600, stale-while-revalidate=600" always;
proxy_pass https://origin_static;
}
location /api/public/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_cache_valid 200 30s;
add_header Cache-Control "public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600" always;
proxy_set_header If-None-Match $upstream_http_etag;
proxy_pass https://origin_api;
}
}
Avvoy (SWR + negative-cache, concept)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. cache. simple_http_cache. v3. SimpleHttpCacheConfig
Cache-Control/Surrogate-Control Header Cache Policies
We cache 5xx errors briefly via route/retry policy + local_rate_limit
Heder per assetti «veloci»
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
Heder per mezza dinamica (directory)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps Come la cache risparmia denaro
Egress origin ↓, meno carichi CPU/DB → sotto i costi di infrastruttura.
Meno richieste fino a backend paganti (search/index/image).
Target metrica: $/riduzione p95 e $/riduzione egress di 1 GB - Monitorare l'effetto post-accelerazione.
Specifico per iGaming/Fintech
Cataloghi provider/asset: percorsi versionati + TTL annuo.
Landing eventi/tornei: 1-5 min «s-maxage» + «SWR» per 10-30 min; tag-purge durante l'aggiornamento.
Pagine liv (coefficienti/tabelle): cache parziale dei blocchi JSON, TTL brevi (5-30 s), per blocchi personali - render client.
PSP/endpoint di pagamento: No cache, rigoroso'no-store '; nella cache solo le tabelle di riferimento (BIN, states).
Antibot: cache statica/GET, percorsi «grigi» per ASN sospette; Non permetteré Vary "per i titoli rumorosi.
Assegno foglio di implementazione
- La chiave della cache è la normalizzazione dell'URL, l'elenco delle query consentite, 'Vary', solo in base a quanto desiderato.
- Percorsi pubblici/privati separati; privato - «no-store» e bypass CDN.
- Immessi scale TTL per tipo di contenuto; configurato'SWR/if-errore '.
- Configurato tiered-cache + origin-shield; attivato negative-cache 5xx (breve).
- C'è un tag/URL purge, soft purge; integrazione con CI/CD.
- Compressione abilitata (br/gzip), formati di immagine Web e range-risposte.
- Metrici: hit-ratio by layer, p95 TTFB, 304 rate, origin egress; Gli alert per i fallimenti.
- Playbook: riscaldamento della cache prima dei picchi, emergenza purge, degrado origin.
Errori tipici
Un assetto senza versioni con un grande TTL ha usato le bande «piegate» degli utenti.
L'eccessivo'Vary '(«User-Agente», per tutti i titoli) ha → un'esplosione di radicalità e un basso hit-ratio.
Cache 4xx/401/403/privacy.
L'assenza di negative-cache è una valanga di richieste di origin degradato.
Niente tag-purge, purge di massa e «tempesta» re-fill.
La chiave cache include le impostazioni UTM/ref rumorose.
TTL troppo breve per la statica → un carico eccessivo per CDN e origin.
Mini playbook
1) Riscaldamento della cache prima dell'evento
1. Raccoglie la top-N URL per → 2) Prefetch parallelo (rate-limited) per regione → 3) Verifica hit-ratio ↑ e p95 ↓.
2) Emergenza soft-purge catologi
1. Invia «PURGE »/tag-clear 2) Il CDN dà stale e lo sfondo allunga freschi 3) Controlla l'assenza di spine sull'origin.
3) Errore origin
1. 'stale-if-error'salva X ore (2) Abilita lo striscione «lavorazioni» su edge 3) Per il ripristino - target warm-up.
Totale
Forte strategia CDN = chiave di cache corretta + TTL sensibili con SWR/if-errore + disabilità guidata + tiered/shield + osservabilità. Fissare la politica negli heder e negli heder, misurare gli hit-ratio e i p95, pianificare il riscaldamento sotto i picchi - e gli utenti avranno sempre una risposta rapida e l'origin sarà ancora vivo anche nell'ora più calda.