Как правильно настроить кэширование через CDNvideo: TTL, Cache-Control и Vary
Как правильно настроить кэширование через CDNvideo: TTL, Cache-Control и Vary
Вы подключили CDN (сеть доставки контента), трафик идёт через edge-серверы, но TTFB почти не изменился. Или хуже - пользователи видят устаревшие данные после деплоя. Обе проблемы решаются одинаково: правильно настроенными заголовками кэширования в связке с настройками ресурса в личном кабинете.
CDN - не волшебная кнопка «сделать быстро». Это прокси с памятью, и то, что он запоминает, полностью под вашим контролем. В этом посте разберём механику изнутри: как наша сеть доставки контента принимает решения о кэшировании, какие директивы реально важны и где чаще всего ошибаются.
Первый шаг: выбор типа оптимизации
Прежде чем говорить о заголовках, важный момент специфики CDNvideo: при создании HTTP-ресурса вы выбираете режим оптимизации, и он влияет на то, как сеть обрабатывает контент.
Статика - для изображений, JS, CSS, шрифтов и аналогичных файлов. Текстовые файлы автоматически сжимаются gzip. Можно дополнительно включить Brotli или оптимизацию изображений.
Большие файлы - для дистрибутивов, архивов, видео, всего с весом более 20 МБ. CDNvideo загружает такие файлы с origin по частям через HTTP Range-запросы. Размер одной части (slice) - 16 МБ по умолчанию, но в настройках можно задать от 1 до 1024 МБ. Сжатие на стороне CDN в этом режиме не производится.
Важно: режим выбирается при создании ресурса. Если потом меняете размер slice - рекомендуется сбросить КЭШ ресурса через личный кабинет или API.
Как CDNvideo решает, что класть в КЭШ
Когда запрос приходит на edge-сервер, CDNvideo смотрит на метод запроса, URL и заголовки ответа от вашего origin. Тело запроса он не читает - только метаданные.
GET-запросы кэшируются, POST - нет. Дальше CDNvideo смотрит на заголовки ответа: если видит Cache-Control: no-store или Set-Cookie - скорее всего, не закэширует. Если видит Cache-Control: public, max-age=3600 - положит в КЭШ на час.
Ключевое понимание: Ваш origin-сервер управляет поведением CDNvideo через заголовки ответа. Настройки в личном кабинете идут вторым приоритетом - они задают поведение по умолчанию, когда origin не передаёт явных инструкций.
TTL - время жизни объекта в КЭШе
TTL определяет, как долго CDNvideo будет отдавать закэшированный ответ, не обращаясь к origin. Чем выше TTL - тем меньше нагрузка на сервер и быстрее ответ пользователю.
Наша сеть доставки берёт TTL из нескольких источников в порядке приоритета:
- Cache-Control: s-maxage - директива специально для CDN и shared-КЭШей
- Cache-Control: max-age - если s-maxage нет
- Expires - устаревший заголовок, но встречается в legacy-системах
- Значение TTL, заданное в настройках ресурса CDNvideo - когда origin не передаёт заголовков кэширования
Практические значения, которые работают для большинства проектов:
| Тип контента | TTL | Логика |
|---|---|---|
| JS, CSS, шрифты с хэшем в URL | 1 год (31536000) | URL меняется при обновлении - старый КЭШ не мешает |
| Изображения без версии | 7 дней | Баланс актуальности и хитрейта |
| HTML-страницы | 60 секунд | Часто меняются, нужна актуальность |
| API: публичные справочники | 5–60 минут | Зависит от частоты обновления данных |
| API: персонализированные | 0 | Не кэшировать на CDN вообще |
Персонализированные ответы - корзина, профиль, рекомендации - не должны попадать в shared-кэш CDNvideo. Для таких эндпоинтов используйте Cache‑Control: private, no‑store.
Cache-Control - три директивы, которые решают всё
public и private
public - разрешает кэшировать ответ на CDNvideo и в любых промежуточных прокси.
private - только в браузере пользователя, не на CDN. Используйте для персонализированных страниц.
Частая ошибка: поставить Cache-Control: max-age=3600 без public. Браузер закэширует, CDNvideo - нет. Хитрейт остаётся нулевым, нагрузка на origin не снизится.
max-age и s-maxage
s-maxage задаёт TTL только для shared-кэшей - CDNvideo, прокси. Браузер его игнорирует. Это позволяет держать разные TTL для CDN и браузера:
Cache-Control: public, max-age=300, s-maxage=3600
CDNvideo кэширует на час, браузер - на 5 минут. Пригодится, если надо контролировать инвалидацию через CDN, но не давать браузеру слишком долго держать устаревший ответ.
stale-while-revalidate
Когда TTL истёк, CDNvideo всё равно отдаёт закэшированный ответ пользователю без задержки - и одновременно в фоне обновляет КЭШ запросом к origin:
Cache-Control: public, s-maxage=60, stale-while-revalidate=600
CDNvideo держит свежий КЭШ 60 секунд. После истечения - ещё 600 секунд отдаёт устаревший ответ, при первом же запросе тихо обновляясь. Пользователь не ждёт ни миллисекунды.
no-store vs no-cache
Их часто путают. no-store - вообще не кэшировать нигде. no-cache - кэшировать, но перед каждой отдачей проверять у origin через ETag или Last-Modified. no-cache может снизить нагрузку: CDNvideo отдаёт 304 Not Modified вместо полного ответа.
Vary - самая недооценённая директива
Vary говорит CDNvideo: «для разных значений этого заголовка запроса держи разные версии кэша». Один URL - несколько записей в кэше.
Vary: Accept-Encoding нужен почти всегда. CDNvideo поддерживает gzip по умолчанию и Brotli - как отдельную опцию в экспертных настройках ресурса. Если включены оба формата, без Vary: Accept-Encoding сеть закэширует одну версию и будет отдавать её всем.
Vary: Accept-Language полезен для мультиязычных сайтов, где язык определяется заголовком, а не URL-сегментом. Но осторожно: Vary: Accept-Language принимает десятки вариантов, КЭШ раздробится и хитрейт упадёт. Лучше нормализовать язык на стороне сервера и добавить его в URL.
Vary: Authorization - антипаттерн. CDNvideo создаст отдельную запись КЭШа для каждого уникального токена. С тысячей пользователей - тысяча записей, хитрейт стремится к нулю. Для защищённых ресурсов используйте Cache-Control: private.
Правила CDNvideo - гибкая настройка без деплоя
Одна из сильных сторон CDNvideo - система правил. В личном кабинете можно задать отдельные настройки кэширования для разных путей без изменения кода на сервере.
Например, для одного ресурса можно настроить разные TTL для /api/*, /static/* и /images/* - каждое правило переопределяет глобальные настройки ресурса для своих путей. Это удобно, когда origin не может передавать нужные заголовки самостоятельно, или когда Вы хотите протестировать новые настройки на части трафика.
Важно учитывать: каждое применение изменений в CDNvideo занимает до 15 минут. Планируйте обновления заранее, по возможности группируйте несколько правок в одно применение.
Инвалидация кэша через API CDNvideo
CDNvideo предоставляет API для управления КЭШем - это три операции: предзагрузка файлов в КЭШ, точечная очистка по URL и полный сброс КЭШа ресурса.
Purge по URL - отправляете запрос в API с конкретными путями, CDNvideo удаляет записи. Лимиты: не более 300 путей за один запрос, не более 300 путей в минуту суммарно, не более 10 обращений к API в минуту. Операции выполняются асинхронно - в ответ приходит task_id, по которому можно проверить статус.
Предзагрузка - заранее загружает файлы в КЭШ до первого пользовательского запроса. Полезно перед крупными запусками или распродажами, когда нужно прогреть КЭШ и не допустить первого «холодного» запроса под нагрузкой. Лимит - до 10 путей за запрос.
Полный сброс - очищает весь КЭШ ресурса. Используйте с осторожностью: после сброса все запросы идут на origin до нового прогрева КЭШа. При высоком трафике это может создать пиковую нагрузку.
Автоматизировать инвалидацию при деплое можно через вызов API в CI/CD пайплайне - сразу после обновления кода передаёте CDNvideo список изменившихся файлов. Для Terraform-пользователей CDNvideo предоставляет провайдер - управление ресурсами и их конфигурацией как кодом.
Cache busting - самый надёжный способ для статики
Для статических ассетов - JS, CSS, шрифты, изображения - лучший подход не требует ни API, ни purge вообще. Вместо /app.js раздаёте /app.abc123.js, где хэш вычисляется из содержимого файла. При изменении файла меняется URL - старый КЭШ просто перестаёт запрашиваться, новый нарабатывается автоматически.
Большинство современных бандлеров (Vite, webpack, esbuild) делают это из коробки. Сочетайте с TTL в год и директивой immutable:
Cache-Control: public, max-age=31536000, immutable
Проверьте прямо сейчас
curl -I https//: your-site.com/
curl -I https//: your-site.com/assets/app.js
Смотрите на Cache-Control, Vary, Age (сколько секунд объект в КЭШе) и X-Cache (HIT или MISS).
Чеклист:
- Статика с хэшем в URL: Cache-Control: public, max-age=31536000, immutable
- HTML-страницы: Cache-Control: public, s-maxage=60, stale-while-revalidate=600
- Vary: Accept-Encoding стоит везде, где включено сжатие (gzip и/или Brotli)
- Нет Vary: Authorization или Vary: Cookie на публичных эндпоинтах
- Персонализированные ответы: Cache-Control: private, no-store
- Для разных типов контента настроены правила в личном кабинете CDNvideo
- Есть автоматический purge через API CDNvideo при деплое
- Хитрейт в статистике CDNvideo выше 80%
Если хитрейт ниже 80%:
- либо TTL слишком короткий,
- либо Vary дробит КЭШ на много вариантов,
- либо большая доля трафика идёт на некэшируемые эндпоинты.
Все три случая диагностируются через статистику логов в личном кабинете.
Сопутствующие продукты
CDN
CDN — сеть доставки контента
для ускорения сайтов и приложений
CDN для сайтов и приложений — это технология ускорения загрузки
веб-проектов у конечного пользователя. CDN расшифровывается
...