CDN і edge-кешування
CDN і edge-кешування
1) Цілі
CDN (Content Delivery Network) знижує латентність і навантаження на origin: кешує статичний і умовно динамічний контент на edge-вузлах, забезпечує масштаб, стійкість і безпеку (DDoS/WAF), додає edge-логіку (переписування відповідей/запитів, автентифікація, A/B).
2) Модель кешування та ключі
Ключ кеша = `scheme + host + path +?(selected query params) + headers (Vary)`
Рекомендується:- Нормалізувати query ('utm _'виключити, залишити'v','lang','country'і т.п.).
- Мінімізувати'Vary'( наприклад,'Vary: Accept-Encoding, Accept-Language'), уникати'Vary: `.
- Для API - ключ з маршруту + ідентифікатор версії (semver, hash, build id) + потрібні query/headers (наприклад,'X-Tenant').
- Для персоналізованих сторінок - edge-сегментація (по cookie/гео) або Skip-Cache.
3) Політики TTL і заголовки
Базові заголовки:- `Cache-Control: public, max-age=300, s-maxage=3600, stale-while-revalidate=60, stale-if-error=300`
- «Surrogate-Control» (якщо підтримується) - окрема політика для CDN, відмінна від браузера.
- «ETag »/« Last-Modified» - умовні запити (304) і економія трафіку.
- Для приватного: `Cache-Control: private, no-store', якщо не можна кешувати.
- API, які допускають кеш: `Cache-Control: public, s-maxage = 60'+ ключ за версією.
Рекомендований підхід: «вічні» ресурси (з fingerprint в імені файлу) →'max-age = 31536000, immutable'; «сторінки/JSON» → короткий TTL + SWR.
4) Інвалідація: purge/soft-purge
Purge by URL: точково.
Purge by tag/key: групові чистки (використовуйте'Surrogate-Key: products:42 category:food`).
Soft-purge: позначає контент «застарілим», edge віддає stale до отримання нової версії.
«Теплий» прогрів: після деплоя дерніть основні сторінки з регіонів.
5) Edge-патерни продуктивності
Stale-While-Revalidate: швидка відповідь «застарілою» копією + фонове оновлення.
Prefetch критичних ресурсів (preload, preconnect, dns-prefetch).
Compression: gzip/br (для текстових), zstd якщо підтримується CDN.
HTTP/2/3 (QUIC): мультиплексування і менша латентність.
TLS session resumption і OCSP stapling на периметрі.
6) Зображення та відео
Image optimization at edge: resize/format negotiation (`Accept: image/avif, webp'), авто-WebP/AVIF, DPR-варіанти.
Lazy-load и responsive (`srcset`, `sizes`).
Video: HLS/DASH, fragmented MP4, origin-shield (центральний кеш) для зниження «штормів».
Thumbnail-сервіси та signed URLs для приватних зображень.
7) Безпека периметра
WAF: правила OWASP, блокування країн/ASN, rate-limits з ключем (IP + cookie + token).
DDoS: L3/4 scrubbing, L7-чекери, JS-челленджі/turnstile.
Підписані URL/куки для приватних ресурсів (відео/звіти): TTL + HMAC/EdDSA.
Geo-fencing і комплаєнс (наприклад, заборона регіонів).
8) Edge-compute (логіка на краю)
Кейси:- Персоналізація без пробою кешу: сегменти (A/B), гео, мова на edge, а контент - кешований.
- Переписування відповідей/заголовків, редиректи, AB-спліти.
- Токенна автентифікація: перевірка підпису JWT, прив'язка до ключа.
- Canary по cookie/percent: частина трафіку - в новий backend.
Приклади технологій: Cloudflare Workers/Durable Objects, Fastly Compute@Edge, AWS Lambda@Edge.
9) Multi-CDN і глобальний периметр
Причини: покриття, SLA, вартість, регіональні обмеження, ізоляція інцидентів.
GSLB/Traffic Steering: з гео/latency/реальних помилок; health-checks з декількох vantage-точок.
Єдина схема ключів/заголовків (Surrogate-Key), синхронізовані правила purge.
Origin-shield загальний для всіх CDN, щоб не «вдаряти» origin при інвалідаціях.
10) Логування та метрики
Збирайте:- Hit ratio (cache, CDN → edge/origin), byte hit ratio.
- Latency p50/p95/p99, error-rate за кодом/маршрутом.
- Origin fetches: RPS/байти/помилки (захист від надлишкових промахів).
- Регіональні графіки (по POP/ASN/країні).
- Інтегруйте з Observability: Prometheus (pull через експортери), Grafana/OTel (push з edge-логів).
11) SEO и SPA/SSR
SEO-сторінки з SWR і коротким TTL - швидко і «свіжо».
Sitemap/robots - кешуємо довго, але допускайте soft-purge.
Service Worker: offline-кешування, prefetch критичних шляхів, цільові оновлення.
12) Приклади конфігурацій і заголовків
12. 1 Cache-Control профілі
Статика з fingerprint:
Cache-Control: public, max-age=31536000, immutable
HTML/SSR:
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=60, stale-if-error=600
Surrogate-Control: max-age=600, stale-while-revalidate=120
API (кешована вітрина):
Cache-Control: public, s-maxage=60
Vary: Accept-Encoding
12. 2 NGINX (origin) - нормалізація query/headers
nginx map $arg_utm_source $utm_skip { default 1; "" 0; }
map $args $normalized_args {
default "";
"~(^ &)v=([a-z0-9]+)(& $)" "v=$2";
}
proxy_cache_key "$scheme://$host$request_uri?$normalized_args";
add_header Surrogate-Key "product:{{id}} category:{{cat}}";
12. 3 Fastly VCL - soft-purge і ключі
vcl sub vcl_recv {
set req. hash += req. http. host req. url. path;
set req. hash += querystring. decode(req. url, "v,lang");
if (req. method == "PURGE") {
if (req. http. Fastly-Soft-Purge) { softpurge; } else { purge; }
return (synth(200, "purged"));
}
}
sub vcl_deliver {
set resp. http. Surrogate-Key = "product:42 category:food";
}
12. 4 Cloudflare Workers - підписані URL
js export default {
async fetch(req, env) {
const url = new URL(req. url);
if (url. pathname. startsWith("/private/")) {
const token = url. searchParams. get("token");
if (!token! verify(token, env. SIGNING_KEY)) return new Response("Forbidden", { status: 403 });
}
return fetch(req);
}
}
12. 5 Lambda @Edge - гео-варіанти
js exports. handler = async (event) => {
const req = event. Records[0].cf. request;
const country = req. headers['cloudfront-viewer-country']?.[0]?.value 'US';
if (country === 'DE') req. headers['accept-language'] = [{ key:'Accept-Language', value:'de' }];
return req;
};
13) Приватні дані та API
Ніколи не кешуйте приватні відповіді без ізоляції ключа (пер-користувач/пер-токен).
Використовуйте Signed Cookies/Headers і'Vary: Authorization'тільки при строгому контролі (інакше - cache-bust).
Безпечна альтернатива: поділяйте публічний шар (кешований) і приватні інклюди (ESI/edge-композиція).
14) Гео/правила контенту
Ліцензійні обмеження: geo-deny на edge, плейсхолдери замість блокування origin.
Вікові/регуляторні банери - рендер на edge (не пробивати кеш).
15) Анти-патерни
'no-cache, no-store'для всього сайту → втрата CDN-ефекту.
«Vary» за нестабільними заголовками (наприклад, «User-Agent») → кардинальність.
Очищення всього кешу при кожному релізі.
Короткі TTL без SWR → «шторм» на origin.
Персональні сторінки кешуються без сегментації/токен-ключів.
Відсутність origin-shield → множинні паралельні промахи.
16) Чек-лист впровадження (0-45 днів)
0-10 днів
Категоризувати ресурси: статика (immutable )/HTML/API.
Включити gzip/br, HTTP/2/3, нормалізацію query,'Surrogate-Key'.
Ввести SWR/IFE і базовий purge.
11-25 днів
Edge-оптимізація зображень (resize/format), origin-shield.
Підписані URL для приватного медіа, WAF/DDoS-профілі.
Дашборди: hit ratio, origin fetches, p95 по POP.
26-45 днів
Multi-CDN або GSLB-стратегія, канарні ваги на периметрі.
Edge-compute для сегментації/АВ/гео, soft-purge за ключами.
Авто-прогрів і інтеграція purge в CI/CD.
17) Метрики зрілості
Byte hit ratio ≥ 85% для статики, ≥ 60% для HTML/умовної динаміки.
Origin RPS стабільний при піках (немає «штормів»).
p95 TTFB знижений на ≥ 30% по основних регіонах.
% відповідей stale при інцидентах> 90% (користувач майже не помітив).
Повна автоматизація purge-по-ключах в реліз-пайплайні.
18) Висновок
Ефективний контур CDN - це ключі/TTL/варіанти, дисципліна інвалідації та edge-логіка. Додайте SWR/IFE, origin-shield, оптимізацію медіа та сувору безпеку (WAF, підписані URL). Стандартизуйте метрики та інтегруйте purge в CI/CD - і ви отримаєте швидкий, економний і стійкий периметр, готовий до пікових навантажень і «чорних лебедів».