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 для сегментации/AB/гео, 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).

Нажимая кнопку, вы соглашаетесь на обработку данных.