Loading...

Эксплуатация · 8 мин чтения

Как очистить кэш CDN, не сломав сайт

Вы выкатили изменение, а посетители по-прежнему видят старую версию. Это кэш делает ровно свою работу — edge держит копию, пока она не истечёт. Пурдж говорит edge забыть эту копию. В этом руководстве — что на самом деле происходит при очистке, чем отличается пурдж одного URL, целой папки или всех вариантов, почему «очистить всё» — грубый инструмент и как версионированные имена файлов делают очистку статики ненужной.

Обновлено

Как очистить кэш CDN, не сломав сайт

Видео на английском с русскими субтитрами.

Почему edge всё ещё отдаёт старый файл

Когда посетитель запрашивает файл, ближайшая edge-точка проверяет, есть ли у неё действительная копия. Если есть — она отвечает сразу, не обращаясь к вашему серверу; в этом весь смысл CDN и причина, по которой ваш сайт быстрый. Как долго копия считается «действительной», определяют заголовки кэширования, которые ваш источник отдал, когда edge впервые забрал файл, чаще всего Cache-Control: max-age.

Поэтому, когда вы загрузили новую версию, а видите старую, ничего не сломано. Вы поменяли файл на источнике, но edge всё ещё находится внутри окна, на которое вы сами велели ему хранить предыдущую копию. Выходов три: подождать истечения, очистить кэш сейчас или опубликовать под новым URL, чтобы устаревшему нечего было отдавать. Чему отдать предпочтение — об этом всё оставшееся руководство.

Точная, префиксная, вариантная — берите наименьший молоток

Как очистить кэш CDN, не сломав сайт — Точная, префиксная, вариантная — берите наименьший молоток
Page Purge — очистка изменённых страниц товаров и категорий по пути.

Точная очистка удаляет один конкретный URL. Это правильный вариант по умолчанию: вы заменили /images/hero.jpg — значит, пуржите /images/hero.jpg. Точно, мгновенно, всё остальное остаётся прогретым.

Префиксная очистка удаляет всё, что лежит под путём: /assets/ очищает каждый файл ниже. Используйте её после деплоя, переписавшего целый каталог. Инструмент мощный, поэтому целиться нужно аккуратно: очистка /images/ из-за одного изменившегося логотипа выбрасывает тысячи полезных закэшированных объектов.

Вариантная очистка удаляет каждую закэшированную версию одного ключа. Когда ваш источник отправляет заголовок Vary, edge может держать несколько копий одного URL, по одной на каждое значение этого заголовка — например, под разные устройства, — и если вы заменили исходный файл, вам нужно, чтобы исчезли все, а не только та, что совпала с вашим собственным браузером. Именно этот вариант упускают, когда пурдж «не сработал» для части посетителей, но сработал для вас самих.

Те же три варианта из командной строки

# one URL (the usual case)
cdnctl purge --account <uuid> --path /images/hero.jpg

# several at once
cdnctl purge --account <uuid> --paths "/css/app.css,/js/app.js"

# everything under a folder
cdnctl purge --account <uuid> --path /assets --type prefix

# every cached variant of one key
cdnctl purge --account <uuid> --path /index.html --type variants

# save this list to re-run after future deploys
cdnctl purge --account <uuid> --paths "/,/sitemap.xml" --save

Когда очищать всё (и чего это стоит)

Очистка кэша всего аккаунта уместна после изменения, затронувшего весь сайт: редизайн, правка шаблона, отражающаяся на каждой странице, миграция CMS. Это одна команда, и она честна в том, что делает: исчезает всё.

Сначала осознайте цену. Какое-то время после полной очистки edge не держит ничего, поэтому запросы, на которые раньше отвечали рядом с пользователем, идут к вашему источнику. Сайт, который спокойно отдаёт десять запросов в секунду за кэшем, вдруг может встретить их все сразу. На небольшом источнике это разница между «быстро» и «еле дышит». Именно потому, что инструмент намеренно грубый, CLI требует подтверждения.

Явное подтверждение обязательно — и это сделано специально

# clear the whole account cache
cdnctl purge all --account <uuid> --yes

# watch it complete
cdnctl purge all status --account <uuid>

Пурдж, который вам никогда не придётся делать

Лучшая стратегия инвалидации — не нуждаться в ней. Если имя файла меняется всякий раз, когда меняется его содержимое — app.a1b2c3.js, style.9f8e7d.css, — то деплой публикует новые URL. Старые всё ещё закэшированы, безвредны и ни на что не ссылаются; новые не кэшировались никогда, поэтому каждый посетитель мгновенно получает новую версию. Любой современный сборщик делает это за вас, и именно поэтому кэширование статики можно безопасно ставить на год.

Остаются файлы, чьи имена измениться не могут: ваши HTML-страницы, /sitemap.xml, robots.txt, JSON-фиды. Задайте им короткий max-age, чтобы они обновлялись сами, и пуржите их явно, когда изменение должно стать видимым немедленно. На практике в здоровой схеме после деплоя очищается несколько путей, а не тысячи.

Почему кажется, что пурдж не сработал

Почти каждое сообщение «очистка ничего не дала» — это одно из четырёх, и ни одно из них не о том, что edge ошибся.

Ваш собственный браузер тоже закэшировал файл. Cache-Control действует и на браузер: на edge уже свежая версия, а на вашем ноутбуке нет. Прежде чем эскалировать, проверьте в приватном окне или с добавленным к URL параметром.

Вы очистили не тот URL, который отдаётся. /page и /page/ могут быть разными ключами кэша, как и версии по http и https или URL с добавленными параметрами отслеживания. Пуржите тот URL, который на самом деле запрашивают пользователи.

Вы очистили один вариант. Когда ваш источник отправляет заголовок Vary, копии одного URL, которые он различает, — разные записи; если часть посетителей видит новую версию, а часть нет, пуржите с типом variants.

Или источник снова отдал старый файл. Пурдж лишь говорит edge забыть копию; следующий запрос заново забирает файл с вашего сервера. Если кэш вашего приложения или плагина всё ещё держит старую страницу, edge добросовестно закэширует устаревшую копию снова. Сначала очистите кэш приложения, затем пуржите edge.

Сделайте это частью деплоя, а не тем, что нужно помнить

Как очистить кэш CDN, не сломав сайт — Сделайте это частью деплоя, а не тем, что нужно помнить
REST API cdn.com.tr — endpoints для cache purge.

Ручная очистка после каждого релиза — шаг, который кто-нибудь однажды забудет, обычно на самом важном релизе. Положите его в пайплайн: после успешного деплоя запускайте пурдж для тех немногих путей, чьи имена никогда не меняются. На cdn.com.tr это можно сделать из панели, через REST API или с помощью cdnctl в CI-задаче — команда одна и та же, запускается она из вашего терминала или из раннера. Сохранённые списки путей (--save) превращают это в однострочник, который вы храните, вместо списка, который приходится набирать заново.

Как настроить

Пошаговые руководства в справочном центре:

Частые вопросы

Сколько времени применяется пурдж?

Быстро — edge удаляет закэшированную запись, и уже следующий запрос к этому URL заново забирает файл с вашего источника. Не мгновенен ваш собственный браузерный кэш: это отдельная копия, которой управляет тот же заголовок Cache-Control.

Вредно ли очищать весь кэш?

Не вредно, но и не бесплатно: пока кэш не наполнится снова, запросы доходят до вашего источника вместо того, чтобы поглощаться рядом с пользователем. Это правильный инструмент после изменения на всём сайте и неправильный — для одной отредактированной картинки.

Чем пурдж отличается от жёсткого обновления страницы?

Жёсткое обновление (Ctrl+F5) очищает только ВАШУ браузерную копию — оно чинит то, что видите вы, и ничего для остальных. Пурдж очищает общую копию на edge, а именно её и получает каждый посетитель.

Можно ли очищать кэш автоматически после деплоя?

Да, и это рекомендуемая схема. Вызывайте API очистки или запускайте cdnctl последним шагом вашего пайплайна деплоя, указывая пути, имена файлов которых не меняются (HTML-страницы, карта сайта, фиды).