Кеширование - это хранение уже готового результата, чтобы не считать его заново. Сайт без кеша при каждом открытии страницы обращается к базе данных, собирает шаблон, пересчитывает меню и только потом отдаёт ответ. Сайт с кешем в большинстве случаев отдаёт заранее подготовленный файл. Разница во времени ответа часто десятикратная, и именно она вытягивает показатели скорости в зелёную зону.
Четыре слоя кеша
- Браузерный. Картинки, стили и скрипты сохраняются на компьютере посетителя. При повторном визите они не скачиваются заново.
- Кеш CMS. WordPress и похожие системы умеют сохранять готовый HTML страницы и отдавать его вместо сборки на лету.
- Серверный. Nginx или Varnish держат ответы в памяти и отвечают, даже не будя PHP.
- CDN. Сеть серверов по миру хранит копии файлов ближе к пользователю. Посетитель из Таллина получает ответ из Европы, а не с другого континента.
Слои складываются. Страница может быть закеширована одновременно в CDN, на сервере и в браузере, и тогда обновление контента доходит до посетителя не сразу. Отсюда и берётся классическая жалоба: у меня всё поменялось, а у клиента нет.
Как управлять временем жизни кеша
Для файлов, которые почти не меняются - шрифтов, логотипа, скомпилированных стилей - ставят долгий срок хранения, вплоть до года. Чтобы обновления всё же доходили, к имени файла добавляют версию или хеш: при изменении меняется имя, браузер считает его новым файлом и скачивает. Этот приём называется cache busting и в современных сборщиках работает автоматически.
Для HTML-страниц срок делают коротким, от нескольких минут до часа, либо используют схему, при которой кеш живёт долго, но сбрасывается по сигналу от CMS при сохранении материала. Второй вариант надёжнее для интернет-магазинов, где цена и наличие меняются в течение дня.
Что нельзя кешировать
Из кеша обязательно исключают корзину, личный кабинет, страницу оформления заказа и любые ответы, зависящие от конкретного пользователя. Иначе один посетитель увидит чужую корзину - это не только неприятно, но и прямое нарушение правил обработки персональных данных. Плагины кеширования обычно знают стандартные адреса магазинов, но кастомные разделы приходится добавлять в исключения вручную.
Как сбрасывать кеш правильно
Порядок сброса идёт снизу вверх: сначала CMS, затем сервер, затем CDN. Если сбросить только CDN, он заберёт с сервера ту же самую старую копию. Полезно иметь в админке одну кнопку, которая чистит все слои разом, и обязательно проверять результат в режиме инкогнито - ваш собственный браузер почти всегда держит свою копию дольше всех.
Если после сброса страница всё равно старая, проверьте заголовки ответа через инструменты разработчика в браузере. Строка с пометкой HIT говорит, что ответ пришёл из кеша, MISS - что он собран заново. Это самый быстрый способ понять, на каком именно слое застряло обновление, вместо того чтобы гадать и чистить всё подряд по второму кругу.
Кеш и поисковая выдача
Поисковый робот получает ту же закешированную копию, что и обычный посетитель. Обычно это плюс: быстрый ответ сервера помогает обходу сайта. Но если кеш настроен слишком агрессивно, робот может неделями видеть старую цену или снятый с продажи товар, и в выдаче будет показываться неактуальная информация. Для интернет-магазина это чревато не только отказами, но и предупреждениями в Merchant Center из-за расхождения цены в фиде и на странице.
Отдельная ловушка - кеширование ответов с ошибкой. Если сервер на минуту отдал код 500 и этот ответ попал в CDN с длинным сроком хранения, часть посетителей будет видеть ошибку ещё долго после того, как сайт починили. Правило простое: ответы с кодами 4xx и 5xx либо не кешируются вовсе, либо живут не больше нескольких секунд.
Раз в квартал полезно пройтись по настройкам заново: проверить, что исключения актуальны, сроки хранения соответствуют реальной частоте обновлений, а кнопка сброса действительно чистит все слои. Кеш почти всегда настраивают один раз при запуске и забывают, а сайт за год успевает обрасти новыми разделами, которые в эти правила не попали.