GH GambleHub

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 - і ви отримаєте швидкий, економний і стійкий периметр, готовий до пікових навантажень і «чорних лебедів».

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Telegram
@Gamble_GC
Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.