Разбираемся в статусах кеша CDN

a61dbb017d241e743d59d7ad7512a2fd.jpeg

Привет, Хабр! Cегодня мы разберемся с одним из ключевых аспектов работы CDN — статусами кеша (cache). Если вы когда-нибудь заглядывали в заголовки ответа сервера или анализировали логи CDN, то наверняка встречали загадочные аббревиатуры HIT, MISS или EXPIRED. Давайте разберемся, что они означают и почему так важны для понимания работы CDN. 

Как работает кеширование в CDN

Прежде чем мы углубимся в статусы кеша, давайте вспомним как, вообще, работает кеширование в CDN.

CDN (Content Delivery Network) — это распределенная сеть серверов, размещенных в различных географических точках. Основная задача CDN — ускорить доставку контента конечным пользователям, расположив его ближе к ним.

Когда пользователь запрашивает файл через CDN, то происходит следующее:

  1. Запрос попадает на ближайший к пользователю сервер CDN (его называют edge server или просто «эдж»).

  2. Эдж проверяет, есть ли запрашиваемый файл в его локальном кеше.

  3. Если файл есть в кеше и он актуален, эдж отдает его пользователю.

  4. Если файла нет в кеше или он устарел, эдж запрашивает его у исходного сервера, сохраняет в свой кеш и отдает пользователю.

Именно на шаге 2 и возникают различные статусы кеша, о которых мы сегодня поговорим.

Статусы кеша: HIT, MISS и EXPIRED

Теперь давайте разберем основные статусы кеша и что они означают:

  1. HIT

HIT — это хороший парень в мире CDN. Когда вы видите HIT, это означает, что запрошенный файл был найден в кеше CDN и отдан пользователю напрямую оттуда. Это самый быстрый сценарий, так как не требуется обращения к исходному серверу.

Пример:

X-Edge-Cache: HIT
  1. MISS

MISS — это когда файла нет в кеше CDN. Такое может произойти по нескольким причинам:

  • Файл запрашивается впервые.

  • Файл был в кеше, но был удален из-за неиспользования.

  • Кеш был очищен вручную.

При MISS CDN запрашивает файл у исходного сервера, сохраняет его в кеш и отдает пользователю. Это медленнее чем HIT, так как CDN всё равно обращается к исходному серверу. Однако при последующих запросах файл будет отдаваться из кеша, что ускорит их обработку.

Пример:

X-Edge-Cache: MISS
  1. EXPIRED

EXPIRED означает, что файл есть в кеше, но он устарел согласно настройкам кеширования. В этом случае CDN запросит актуальную версию у исходного сервера, обновит кеш и отдаст файл пользователю.

Пример:  

X-Edge-Cache: EXPIRED
  • Есть еще другие статусы (их следовое количество обычно): UPDATING, REVALIDATED, STALE

cb504aa65ecf132dc8736139dd180134.png

Модуль для работы с большими файлами

Когда мы говорим о CDN, важно учитывать, что речь идет не всегда только о «файлах» как целых объектах. В случаях, когда запрашиваются большие файлы (например, размером в 1 ТБ), пользователю не приходится ждать полного скачивания файла на эдж-сервер. Для таких ситуаций используется модуль NGINX ngx_http_slice_module, который разбивает файл на части и позволяет передавать их пользователю по мере получения.

Это важно, так как при отсутствии этого модуля пользователи могли бы сталкиваться с длительными задержками, дожидаясь загрузки всего файла. Поэтому корректнее говорить о запросе файла и/или его части, что лучше отражает реальную работу CDN.

Статус REVALIDATED

Ещё один статус, который стоит упомянуть — это REVALIDATED. Этот заголовок используется в том случае, когда эдж-сервер проверяет у исходного сервера, изменился ли файл с момента последнего запроса. Если сервер возвращает ответ 304 Not Modified и заголовок etag не изменился, то файл (или его часть) остаётся в кеше на новый срок, и нет необходимости заново загружать его с исходного сервера.

Статус STALE

Заголовок STALE указывает на то, что файл был отдан из кеша, даже если эдж-сервер не смог достучаться до исходного сервера. Это возможно благодаря настройке proxy_cache_use_stale в NGINX, которая позволяет отдавать закешированный контент в случае проблем с доступом к источнику.

Почему может быть много MISS?

Частый вопрос, который мы слышим от клиентов: «Почему у меня так много MISS в статистике?». Действительно, высокий процент MISS может показаться проблемой, но это не всегда так. Вот несколько причин, почему может быть много MISS:

  1. Низкая посещаемость сайта в определенных регионах. Если на какой-то эдж приходит мало запросов, файлы могут удаляться из кеша из-за неиспользования или вовсе не появится на некоторых эджах, так как оттуда ещё не заходили.

  2. Частое обновление контента. Например, владелец сайта может регулярно очищать кеш вручную или использовать версионность файлов. Версионность — это способ обновления файлов без изменения их имен, но с добавлением параметров к URL. Например, файл style.css может получить в URL параметр ? v=20240909 — где 20240909 указывает на дату обновления (или любой набор символов, которые отличаются от предыдущей версии по желанию клиента). Этот параметр заставляет браузер и CDN воспринимать файл как новый, даже если его имя (style.css) не изменилось. Благодаря этому старая версия файла игнорируется и новая версия загружается с исходного сервера, что приводит к увеличению количества запросов типа MISS. Таким образом, контент кешируется, но новые версии файлов требуют обновления кеша при каждом изменении параметра версии.

  3. Неправильные настройки кеширования на стороне исходного сервера. Например, слишком короткое время жизни кеша или заголовки, запрещающие кеширование. В некоторых случаях файл может быть закеширован, но не пригодится другим пользователям, если, например, генерируется уникальный контент для каждого запроса.
    Если каждый запрос генерирует уникальный ответ, его можно закешировать, но этот кеш не будет полезен другим пользователям. Таким образом, каждый новый запрос будет приводить к MISS для следующего пользователя, даже если файл закеширован для предыдущего.

  4. Большое разнообразие контента. Если у вас миллионы уникальных файлов, не все они могут поместиться в кеш одновременно.

Еще хотим отметить, что если у пользователя нет возможности на своей стороне управлять заголовком cache-control (например, по какой-то причине у файлов на его сервере стоит cache-control: no-cache), но он хочет кешировать файлы в CDN — у нас в ЛК можно поставить галки «игнорировать заголовки cache-control и Expires» клиента.

  • Пример:

c18d3d4a707c8d292c1453cfbaf6199b.png

Как проверить статус кеша для конкретного файла?

Проверить статус кеша для конкретного файла довольно просто:

  1. Откройте файл через адрес CDN в отдельном окне браузера.

  2. Нажмите F12, чтобы открыть инструменты разработчика.

  3. Перейдите на вкладку Network.

  4. Обновите страницу.

  5. Найдите нужный файл в списке запросов и кликните на него.

  6. В заголовках ответа (response headers) ищите строки вида:

X-Edge-Cache: HIT
X-Edge-Ip: 192.168.0.1

Здесь X-Edge-Cache покажет статус кеша, а X-Edge-IP — адрес конкретного эджа, который обработал запрос.

Если контент на сайте изменился, но CDN все еще отдает старую версию файла (например, файл style.css был изменен, но CDN возвращает старую версию, так как она находится в кеше с HIT), владелец сайта может очистить кеш. Это можно сделать для всего проекта или конкретных файлов, через ЛК или по API. После очистки кеша запрос на style.css вернет MISS, и новая версия файла будет загружена с исходного сервера.

Где посмотреть историю статусов кеша?

Если вам нужна более детальная статистика по статусам кеша, вы можете обратиться к логам CDN. В cdnnow! это делается так:

  1. Зайдите в панель управления вашим проектом.

  2. Перейдите на вкладку «Логи».

  3. Выберите интересующий вас период и скачайте логи.

  4. В скачанном файле найдите колонку upstream_cache_status. Именно она содержит статусы кеша для каждого запроса.

Кроме того, в Личном Кабинете доступна подробная статистика по количеству и процентному распределению статусов кеша (HIT, MISS, EXPIRED и другие). Эти данные можно просматривать с разбивкой по дням и часам, что позволяет оценить эффективность кеширования в различные периоды времени.

Также для удобства вы можете настроить свой браузер так, чтобы сразу видеть статусы кеша. 

72fd3e58a66bbe68b76f5cef16516d9e.png

В инструментах разработчика на вкладке Network можно добавить колонку 'Домен' (Domain), чтобы отсортировать запросы по домену CDN. Для отображения заголовков X-Edge-Ip и X-Edge-Cache необходимо скопировать название интересующего заголовка, нажать правой кнопкой мыши на заголовке колонок, выбрать 'Response Headers' (заголовки ответа) и далее 'Manage header columns'. После этого нажмите 'Add custom header' и вставьте название заголовка (например, X-Edge-Cache или другой в зависимости от вашего CDN-провайдера). Установив галки для отображения этих данных, вы сможете сразу видеть, какие файлы находятся в кеше, а какие нет.

fa4a410506b5a4f5137b91cb409fc387.png

Заключение

Понимание статусов кеша CDN — ключ к оптимизации производительности вашего сайта. HIT, MISS и EXPIRED — это не просто загадочные аббревиатуры, а важные индикаторы того, как работает ваша система доставки контента.
Высокий процент HIT обычно означает, что ваш CDN работает эффективно. Но не пугайтесь, если видите много MISS — это нормально для определенных сценариев использования. Главное — понимать причины и уметь интерпретировать эти данные в контексте вашего конкретного проекта.
А какой у вас был опыт во взаимодействие с кешированием в CDN? Будет интересно почитать в комментариях и спасибо за прочтение!

© Habrahabr.ru