INTEGRITY Документация

Отладка

Если кеширование работает не так, как вы ожидаете, Cf-Cache-Status заголовок ответа стоит проверить в первую очередь. Он присутствует в каждом ответе, и его значение точно показывает, что произошло с этим запросом.

Изучите Cf-Cache-Status

Отправьте два запроса на один и тот же URL и сравните заголовки:

curl -I https://my-worker.example.workers.dev/api/users/42
curl -I https://my-worker.example.workers.dev/api/users/42

Сопоставьте значение статуса со сценариями ниже.

Мой Worker запускается при каждом запросе

Cf-Cache-Status отсутствует. Убедитесь, что версия wrangler не ниже 4.69.0 и что wrangler.toml или wrangler.jsonc содержит cache.enabled = true для этого воркера.

Cf-Cache-Status это MISS при каждом запросе, или DYNAMIC, или BYPASS. Кеш ничего не сохраняет, либо срабатывает правило обхода.

Проверьте Cache-Control заголовок. Ответ должен содержать директивы, которые делают его кешируемым:

Ответ с Cache-Control: private или no-store не сохраняется, и Cf-Cache-Status это BYPASS.

Ответ с Cache-Control: no-cache является сохранён, но Cloudflare считает каждый последующий запрос устаревшим и обращается к вашему Worker перед его отдачей. Точный Cf-Cache-Status зависит от того, stale-while-revalidate также задан:

Если вам нужны долгоживущие попадания в кэш, используйте max-age вместо этого. См. no-cache не является обходом.

Если ответ содержит нет Cache-Control заголовка вообще, поведение зависит от кода статуса: Workers Caching применяет Эвристическая свежесть (RFC 9111) и кеширует коды состояния, кешируемые по умолчанию, на эвристический TTL: например, 200 кешируется на 2 часа, а 404 в течение 3 минут. Полную таблицу значений TTL по умолчанию см. в Ответы без Cache-Control заголовка по-прежнему кэшируются в справочнике по конфигурации. Если не хотите применять ни одно из этих значений по умолчанию, задайте Cache-Control явно в ответе.

Проверьте метод запроса. Только GET и HEAD запросы кешируются. Всё остальное относится к BYPASS. GET и HEAD запросы к одному и тому же URL используют одну и ту же запись кеша: см. Ключи кеша о том, как Cloudflare заполняет кеш в обоих случаях.

Проверьте условия автоматического обхода кеша. Cloudflare обходит кеш в следующих случаях:

Если ваш Worker безусловно устанавливает Set-Cookie (например, cookie сессии в каждом ответе), ответ никогда не кэшируется. Либо удалите cookie из кэшируемых ответов, либо разделите установку cookie и кэшируемые ответы на разные маршруты.

Проверьте код статуса. Workers Caching следует RFC 9111. Ответы со статус-кодами, которые по умолчанию не кэшируются (например, 401, 403, 500) не сохраняются, если вы явно не пометите их директивами кеширования.

Некоторые коды состояния никогда не кэшируются, даже при явном Cache-Control:

Мой Worker продолжает работать даже после первого запроса

Cf-Cache-Status это MISS при первом запросе, но всё же MISS при последующих запросах.

Кэш, скорее всего, разделён на части. Ключ кеша включает путь запроса, целевую точку входа и параметр вызова ctx.props. Два запроса, которые выглядят одинаково, могут давать разные ключи кеша, если хотя бы один из этих параметров отличается.

Частые причины:

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

Мой коэффициент попаданий в кэш снизился после деплоя

Это ожидаемое поведение при конфигурации по умолчанию. По умолчанию Версия Worker входит в состав ключа кеша, поэтому каждая новая версия начинается с холодного кеша и не может повторно использовать закешированные ответы предыдущей версии. Первые запросы после деплоя оказываются промахами, пока кеш новой версии заполняется, после чего доля попаданий восстанавливается.

Если вы часто выполняете развертывание, а ваши ответы между развертываниями почти не меняются, включите cache.cross_version_cache чтобы совместно использовать кешированные ответы для разных версий и избежать сброса кеша при каждом развёртывании. Обратная сторона в том, что изменения, влияющие на кеш, перестают применяться сразу же; подробнее см. ниже.

Мой кэш все еще отдает старый контент после деплоя

По умолчанию развёртывание вступает в силу немедленно, поскольку версия Worker входит в ключ кеша, а новая версия начинает работу с холодного кеша. Если вы всё ещё видите ответы от предыдущей версии, значит у вас cache.cross_version_cache включено, что позволяет использовать общие записи кеша между версиями. Чтобы деплой вступил в силу немедленно, сохранив при этом cross_version_cache при:

Мой кэш никогда не обновляется после изменения контента

Если данные источника изменились, а запросы всё ещё возвращают устаревший контент:

Два вызова получают кешированные ответы друг друга

Этого не должно происходить, если вы используете ctx.props для контекста авторизации конкретного вызывающего. Если это так, верно одно из следующего:

Cf-Cache-Status: UPDATING появляется постоянно

UPDATING означает, что ответ был отдан из кеша, хотя и устаревший, а ваш Worker в фоновом режиме обновляет его. Это ожидаемое поведение при использовании stale-while-revalidate.

Если вы видите UPDATING чаще, чем вы ожидаете:

Cf-Cache-Status: UPDATING никогда не появляется

UPDATING генерируется только тогда, когда all из следующих условий выполняется:

Если хотя бы одно из этих условий не выполняется, запросы к устаревшим записям обрабатываются через встроенную ревалидацию, что приводит к EXPIRED (Worker вернул новое тело ответа) либо REVALIDATED (Worker вернул 304 Not Modified).

Частые причины UPDATING не отображается:

Cf-Cache-Status: STALE появляется неожиданно

STALE означает, что Cloudflare отдал ранее закешированный ответ, потому что при запросе, который должен был его обновить, в Worker произошла ошибка: например, Worker выбросил исключение, превысил время ожидания или вернул 5xx ответ. Это stale-if-error поведение. См. Отдавайте устаревший контент при ошибке с stale-if-error.

Если вы видите STALE и не ожидали этого:

Чтобы отличить STALE от обычного HIT в системе наблюдаемости на стороне клиента логируйте Cf-Cache-Status вместе с ответом: STALE это единственный сигнал того, что Worker выходит из строя, а клиенты этого не видят.

Мой ответ превышает лимит размера

Если ответ слишком большой для кеширования, Cloudflare не сохраняет его. Вы увидите Cf-Cache-Status: MISS при каждом запросе, даже если ответ в остальном выглядит кешируемым.

Ограничения размера ответа по тарифным планам см. в Ограничения размера для кеширования. Обратите внимание, что на момент запуска все ответы Workers Caching подчиняются ограничению размера тарифа Free, см. Размер ответа для получения подробностей.

Мне нужна дополнительная видимость

На момент запуска основными инструментами отладки являются Cf-Cache-Status заголовок ответа и информацию о попаданиях в кеш для каждого вызова в Панель наблюдаемости Workers.