
Серверное кэширование убирает из ответа сайта самую дорогую его часть — работу, которую сервер уже проделал вчера и которую заставляют повторять при каждом обращении. Пока кэша нет, на каждый запрос заново компилируется код, заново опрашивается база, заново собирается один и тот же HTML для тысячи разных людей. Пока кэш настроен правильно, готовый ответ отдаётся из памяти за считанные миллисекунды. Разница в скорости ответа между этими двумя состояниями измеряется не процентами, а разами, и видна она не только посетителю, но и поисковому роботу, который оценивает время до первого байта.
В SEO я с 2005 года и вижу одну и ту же ошибку порядка: владелец сайта сжимает картинки, откладывает скрипты, покупает премиальный шаблон — а сервер по-прежнему думает над каждой страницей по полторы секунды, и всё остальное на этом фоне не имеет значения. Ниже — какие уровни серверного кэша существуют, в каком порядке их включать, что категорически нельзя отдавать из кэша и как убедиться, что кэш действительно работает, а не просто прописан в конфигурации.
Чем серверный кэш отличается от браузерного
Эти два механизма постоянно путают, хотя решают они противоположные задачи и приносят пользу разным людям.
Браузерный кэш живёт на устройстве посетителя. Он хранит картинки, стили и скрипты, чтобы при следующем визите не скачивать их заново. Экономит трафик и время повторного визита одного конкретного человека. Первому посетителю он не помогает вообще, поисковому роботу — почти никогда, потому что робот приходит с чистым состоянием.
Серверный кэш живёт на вашей стороне. Он хранит результаты работы сервера, чтобы не повторять её для каждого следующего обращения. Помогает всем: первому посетителю, тысячному, роботу поисковой системы, вашему собственному сайту в момент наплыва трафика. И, что важнее для продвижения, влияет напрямую на время ответа сервера — единственный показатель скорости, который поисковая система измеряет сама, без всяких скриптов на странице.
| Что сравниваем | Браузерный кэш | Серверный кэш |
|---|---|---|
| Где хранится | На устройстве посетителя | На вашем сервере |
| Кому помогает | Тому, кто пришёл повторно | Всем, включая первого гостя и робота |
| Что ускоряет | Загрузку файлов страницы | Формирование самого ответа |
| Влияет на нагрузку сервера | Слабо | Радикально |
| Влияет на время до первого байта | Нет | Да, это его основной эффект |
| Кто управляет | Заголовки ответа, решает браузер | Полностью вы |
Практический вывод: если время ответа сервера у вас измеряется сотнями миллисекунд и больше, никакие манипуляции с картинками и шрифтами картину не спасут. Начинать надо с серверной части.
Четыре уровня серверного кэша
Серверное кэширование — не один переключатель, а несколько независимых механизмов, работающих на разной глубине. Они не заменяют друг друга и не конфликтуют: каждый снимает свой слой работы.
- Кэш скомпилированного кода. Хранит готовые к исполнению инструкции, чтобы не разбирать исходные файлы заново при каждом обращении. Работает на уровне интерпретатора, о самом сайте ничего не знает.
- Кэш объектов и данных. Хранит результаты дорогих операций: тяжёлых запросов к базе, ответов внешних сервисов, собранных фрагментов страницы. Живёт в отдельном хранилище в оперативной памяти.
- Кэш готовых страниц на веб-сервере. Хранит целиком собранный ответ. Обращение к сайту при попадании в кэш вообще не доходит до кода приложения и базы.
- Кэш перед сервером. Отдельный кэширующий узел или сеть доставки содержимого, стоящая перед вашим сервером. Работает по тем же принципам, но снимает ещё и сетевую задержку.
Отдача от уровней распределена неравномерно. Первый включается за десять минут и почти ничего не ломает. Третий даёт самый заметный выигрыш и требует самого внимательного отношения к исключениям. Четвёртый имеет смысл, когда первые три уже сделаны.
Кэш скомпилированного кода: с чего начинать всегда
Сайт на распространённой системе управления состоит из тысяч файлов с кодом. При каждом обращении интерпретатор читает нужные файлы с диска, разбирает их и превращает в набор внутренних инструкций. Результат этой работы после ответа выбрасывается, и на следующий запрос всё повторяется.
Кэш скомпилированного кода сохраняет результат разбора в разделяемой памяти. Со второго обращения этап разбора исчезает целиком. Прирост скорости на типовом сайте — от полутора до трёх раз по времени формирования ответа, и достигается он без единой правки в коде сайта.
Если нужны детали, смотрите «Индексация сайта: что это такое и как она работает».
Настраивать здесь надо немного, но настраивать надо. Значения по умолчанию рассчитаны на маленькие приложения и на крупном сайте упираются в потолок.
- Объём памяти под кэш. Для типового сайта на системе управления 128 мегабайт хватает с запасом, для магазина с большим числом расширений разумно ставить 192–256.
- Максимальное число кэшируемых файлов. Обязательно должно превышать реальное число файлов с кодом на сайте. Посчитайте их командой поиска по расширению и поставьте значение с запасом вдвое. При нехватке кэш начинает вытеснять сам себя, и весь смысл теряется.
- Буфер под общие строки. 16 мегабайт — рабочее значение почти для всех.
- Проверка времени изменения файлов. На боевом сервере её отключают ради скорости, но тогда после любой правки кода кэш надо сбрасывать вручную или при выкладке. Если выкладка не автоматизирована — оставьте проверку включённой и задайте интервал перепроверки в несколько десятков секунд. Забытый отключённый флаг стоил не одному владельцу сайта дня разбирательств, почему правки не появляются.
- Сохранение комментариев в коде. Отключать нельзя: многие современные системы читают служебные пометки из комментариев, и без них сайт просто перестаёт работать.
Здесь же стоит упомянуть режим динамической компиляции, о котором много пишут. На обычном сайте, где время уходит на базу и на ввод-вывод, прирост от него скромный. Заметную пользу он приносит вычислительным задачам: обработке изображений, разбору больших массивов данных. Включать его на сайте услуг ради цифр в отчёте смысла нет.
Кэш готовых страниц на веб-сервере
Помогу с продвижением: SEO-продвижение под ключ — вывожу сайты в топ Яндекса белыми методами.
Самый мощный уровень. Веб-сервер сохраняет ответ, полученный от приложения, и все следующие обращения по тому же адресу получают его напрямую, не запуская ни строчки кода сайта.
Механизм устроен так. Задаётся каталог хранения и зона в памяти под индекс ключей. Задаётся ключ кэша — набор признаков, по которым ответы считаются одинаковыми: обычно это протокол, метод, домен и адрес запроса. Задаётся срок жизни для разных кодов ответа: успешные страницы держат дольше, ответы об отсутствии страницы — минуты, чтобы ошибка не залипла надолго. И задаются условия обхода кэша, о которых ниже.
Отдельно настраивается поведение при сбое приложения: веб-сервер можно научить отдавать устаревшую копию, если код сайта не отвечает или вернул ошибку. Это превращает кэш ещё и в страховку — сайт продолжает работать при упавшей базе, пусть и не самыми свежими данными.
Если интересно направление с сайтами — базу даю в своём курсе:
Два условия, без которых включать этот уровень нельзя:
- Обход кэша по признаку авторизации. Если в запросе есть служебная метка сессии, вошедшего пользователя, непустой корзины — ответ формируется заново и в общий кэш не кладётся.
- Запрет сохранять ответы, которые выдают метку сессии. Это не оптимизация, а вопрос безопасности: сохранённый в общем кэше ответ с чужой сессией достанется следующему посетителю, и он окажется в чужом личном кабинете. Правило простое — ответ, устанавливающий сессию, в кэш не попадает никогда.
Существует и промежуточный вариант — полностраничный кэш средствами самой системы управления. Он медленнее, потому что запрос всё же доходит до кода сайта, зато умеет сам сбрасывать нужные страницы при правке материала и не требует доступа к конфигурации сервера. Для небольшого сайта на массовой платформе это разумный компромисс.
Подробнее об этом — в статье «Как настроить robots.txt».
Хранилище объектов: что выбрать
Там, где страницу целиком сохранить нельзя, работает кэш данных. Из базы вынимаются меню каталога, счётчики товаров в разделах, подборки похожих материалов, права доступа, настройки — всё, что меняется редко, а считается при каждой сборке. Результат кладётся в быстрое хранилище в памяти на минуты или часы.
Кандидатов два, и выбор между ними зависит от того, что ещё вы собираетесь туда положить.
| Свойство | Простое хранилище пар | Хранилище со структурами данных |
|---|---|---|
| Что умеет хранить | Только строки | Строки, списки, множества, словари, счётчики |
| Переживает перезапуск | Нет, всё теряется | Да, при включённом сохранении на диск |
| Подходит для сессий | С оговорками | Да, штатный сценарий |
| Очереди и фоновые задачи | Нет | Да |
| Использование ядер процессора | Несколько потоков | Основные операции в одном потоке |
| Сложность настройки | Минимальная | Выше, но в пределах разумного |
Для нового проекта в подавляющем большинстве случаев берут второй вариант: он закрывает и кэш, и хранение сессий, и очереди одним сервисом. Первый остаётся оправдан там, где он уже стоит и работает, и трогать его нет причин.
Две настройки обязательны при любом выборе. Первая — ограничение объёма памяти. Без него хранилище будет расти, пока не съест всю оперативную память сервера, после чего система начнёт убивать процессы, и первым под нож пойдёт не кэш, а база или веб-сервер. Вторая — политика вытеснения: при достижении предела старые записи должны удаляться автоматически, а не приводить к ошибкам записи.
Ещё одна деталь, которая даёт бесплатный выигрыш: подключение через файловый сокет вместо сетевого. На одном сервере это заметно быстрее и не расходует порты.
Если нужна помощь по теме — обучение SEO-продвижению.
Про кэш запросов внутри самой базы стоит сказать отдельно, потому что советы из старых статей до сих пор гуляют по сети. Отдельного кэша результатов запросов в современных версиях распространённой базы данных больше нет — его убрали как источник блокировок. Вместо него работает буферный пул: область памяти, куда база складывает страницы данных и индексов. На выделенном сервере под него отдают порядка двух третей оперативной памяти, и это одна из самых результативных настроек вообще.
Что нельзя отдавать из кэша
Список короткий, но каждый пункт в нём оплачен чьей-то поломанной неделей.
Тему разбирал отдельно: «Что такое сертификат SSL».
- Корзина, оформление заказа, личный кабинет, панель управления сайтом.
- Любой ответ, устанавливающий метку сессии.
- Страницы с индивидуальными ценами и персональными скидками.
- Результаты поиска по сайту — либо не кэшировать вовсе, либо на считанные минуты, иначе хранилище забьётся мусорными ключами.
- Страницы с формами, защищёнными одноразовым ключом. Ключ живёт ограниченное время, а из кэша посетитель получит вчерашний — форма его не примет, и заявка не уйдёт. Внешне сайт исправен, а поток обращений падает до нуля. Лечится исключением таких страниц или подгрузкой ключа отдельным запросом при открытии формы.
- Ответы с кодами ошибок сервера — им место в кэше только на десятки секунд, чтобы разовый сбой не превратился в сутки недоступности.
Порядок включения на своём сайте
Соблазн включить всё сразу велик, но тогда при первой же поломке вы не поймёте, какой из уровней виноват. Работающий порядок — по одному, с проверкой на каждом шаге.
- Замерить исходное время ответа сервера на трёх типах страниц: главная, страница раздела, страница материала. Записать цифры.
- Включить и настроить кэш скомпилированного кода. Проверить, что сайт работает, замерить снова.
- Настроить буферный пул базы под доступную память. Замерить.
- Подключить хранилище объектов, если система управления умеет с ним работать. Проверить админку и формы.
- Включить кэш готовых страниц с исключениями по авторизации и корзине. Проверить в двух браузерах: в одном войти в личный кабинет, в другом открыть тот же адрес анонимно и убедиться, что чужих данных не видно.
- Настроить сброс кэша при публикации материалов и при выкладке кода.
- Только после этого — сеть доставки или отдельный кэширующий узел, если объёмы того требуют.
Как проверить, что кэш действительно работает
Прописать директивы в конфигурации и получить работающий кэш — не одно и то же. Проверка занимает пять минут и обязательна на каждом уровне.
| Уровень | Что смотреть | Признак, что всё в порядке |
|---|---|---|
| Кэш кода | Статус кэша интерпретатора | Доля попаданий выше 99 процентов, перезапусков по нехватке памяти нет |
| Хранилище объектов | Статистика попаданий и промахов | Попаданий кратно больше промахов, вытеснений мало |
| Кэш страниц | Служебный заголовок статуса в ответе | Первый запрос — промах, второй по тому же адресу — попадание |
| Общий эффект | Время до первого байта | Стабильно ниже 200 миллисекунд на кэшируемых страницах |
| Исключения | Тот же заголовок на странице корзины | Всегда обход кэша, никогда попадание |
Заголовок со статусом кэша веб-сервер не выводит по умолчанию — его добавляют одной строкой в конфигурацию, и он бесценен при отладке. Значения читаются буквально: промах — ответ собран заново и сохранён, попадание — отдан из кэша, обход — сработало правило исключения, устарел — копия была, но просрочена.
Замерять время ответа лучше не в браузере, а консольной утилитой запроса с выводом таймингов: браузер добавляет собственные задержки и путает картину. И обязательно проверяйте без служебных параметров в адресе — обращение с параметром часто проходит мимо кэша и создаёт ложное впечатление, что всё в порядке.
Ошибки, которые ломают кэш
| Симптом | Причина | Что делать |
|---|---|---|
| Правки на сайте не видны | Отдаётся сохранённая копия | Сбросить кэш, настроить автосброс при публикации |
| Заявки перестали приходить | Закэширован одноразовый ключ формы | Исключить страницы с формами или подгружать ключ отдельно |
| Посетитель видит чужое имя в шапке | В общий кэш попал ответ с меткой сессии | Немедленно отключить кэш страниц, добавить запрет, очистить хранилище |
| Кэш работает утром и не работает днём | Хранилище переполняется и вытесняет записи | Увеличить лимит памяти, сократить сроки жизни мусорных ключей |
| Сервер начал падать после включения | Хранилище объектов без ограничения памяти | Задать предел и политику вытеснения |
| Доля попаданий у кода низкая | Мал лимит на число файлов | Поднять лимит выше реального числа файлов сайта |
Частые вопросы
Нужен ли серверный кэш на сайте с посещаемостью в сто человек в день? Кэш кода — да, он бесплатен и снижает время ответа независимо от нагрузки. Кэш страниц — по ситуации: если сервер отвечает за 150 миллисекунд, острой нужды нет.
Можно ли включить всё это на обычном виртуальном хостинге? Кэш кода обычно уже включён, но на дешёвых тарифах встречается отключённым — стоит проверить. Хранилище объектов доступно не везде. Кэш страниц на уровне веб-сервера почти всегда требует своего сервера, зато полностраничный кэш средствами системы управления работает где угодно.
Кэш поможет, если сайт тормозит из-за тяжёлых картинок? Нет. Серверный кэш ускоряет формирование ответа, а не передачу файлов. Это разные задачи, и решать их надо разными средствами.
Как часто сбрасывать кэш? По событию, а не по расписанию: при публикации материала сбрасывается страница материала, раздел и главная. Полный сброс по расписанию — признак того, что автосброс не настроен.
Влияет ли кэширование на индексирование? Влияет положительно и косвенно: робот успевает обойти больше страниц за отведённое время, потому что сервер отвечает быстрее. Прямого фактора «есть кэш» в ранжировании нет.
Не устареет ли выдача из кэша для поискового робота? При правильно настроенном сбросе — нет. Робот получает ту же копию, что и посетители, и она обновляется при изменении материала.
Коротко
- Серверный кэш экономит работу сервера для всех, браузерный — трафик для повторного визита одного человека; путать их нельзя.
- Уровней четыре: код, объекты, готовые страницы, узел перед сервером. Включают по одному, с замером на каждом шаге.
- Кэш скомпилированного кода — первое, что стоит настроить: даёт кратный выигрыш и не требует правок в сайте.
- Кэш готовых страниц самый быстрый, но обязателен запрет на сохранение ответов с меткой сессии — иначе посетитель попадёт в чужой кабинет.
- Хранилищу объектов всегда задают предел памяти и политику вытеснения, иначе оно уронит сервер.
- Работоспособность проверяют по служебному заголовку статуса и времени до первого байта, а не по наличию строк в конфигурации.
Если время ответа сервера у вас держится выше полусекунды и непонятно, за какой уровень браться первым, приходите на SEO-консультацию — посмотрим замеры на ваших страницах и определим, где именно уходит время: в коде, в базе или в сборке страницы.
Увеличьте позиции и продажи вашего сайта
Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:
Остались вопросы по продвижению?
Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.
Связаться со мной →
Комментарии
Аркадий Ропотов
Включил кэш готовых страниц на веб-сервере и через два дня обнаружил, что перестали приходить заявки. Ровно тот случай с одноразовым ключом формы, про который написано. Обидно, что нигде в документации это не вынесено в начало — узнаёшь, только когда уже потерял неделю обращений.
Анатолий Кузнецов автор
Это самая дорогая ловушка на всём уровне кэша страниц, потому что она не даёт никаких внешних признаков: сайт открывается, форма рисуется, кнопка нажимается. Чтобы не полагаться на память, заведите привычку после каждого изменения в кэше проходить короткий сценарий: отправить тестовую заявку с чистого браузера, проверить, что письмо пришло, и посмотреть запись в базе. Занимает две минуты. И поставьте себе внешний контроль на поток заявок — простое уведомление, если за сутки не пришло ни одной, притом что обычно приходит пять. Такой сторож стоит копейки и ловит не только кэш, но и упавшую почту, и сломанную интеграцию.
Денис Рудченко
Про лимит на число файлов у кэша кода — попадание в точку. У нас магазин с полутора сотнями расширений, файлов больше тридцати тысяч, а лимит стоял из коробки. Кэш вытеснял сам себя, доля попаданий болталась около шестидесяти процентов. Поднял лимит — время ответа упало почти вдвое.
Полина Сакулина
Сомневаюсь насчёт совета отдавать под буферный пул две трети памяти. У нас на одном сервере и база, и сайт, и почта. Если отдать столько базе, остальному не хватит. Как считать долю в такой ситуации?
Анатолий Кузнецов автор
Две трети — ориентир для выделенного сервера базы, и на совмещённой машине он действительно не подходит. Считайте от обратного. Сначала оцените, сколько памяти нужно всему остальному под пиковой нагрузкой: процессы обработки запросов умножьте на их реальный расход, добавьте веб-сервер, почту и запас гигабайта на систему. Что осталось — отдайте базе, оставив ещё 15 процентов свободными на всплески. Есть и второй ориентир, более полезный: посмотрите суммарный объём данных и индексов в вашей базе. Если он меньше доступной памяти, нет смысла выделять пул больше этого объёма — данные и так поместятся целиком. У большинства сайтов услуг база весит меньше гигабайта, и вопрос снимается сам собой.
Эдуард Смекалин
Таблица с отличиями браузерного и серверного кэша закрыла давний спор с разработчиком. Он две недели доказывал, что раз стоят заголовки на статику, то серверный кэш не нужен. Теперь понятно, что робот от заголовков не получает ничего.
Ксения Скокова
Вопрос про многоязычный сайт. У нас язык определяется по служебной метке в запросе, адрес при этом один и тот же. Если веб-сервер строит ключ кэша только по адресу, все получат один язык. Как быть, не разводя языки по разным адресам?
Анатолий Кузнецов автор
Технически задача решается добавлением метки языка в ключ кэша: ключ перестаёт быть только адресом и включает значение этой метки, после чего для каждого языка хранится своя копия. Но я бы сначала оспорил саму схему. Один адрес на несколько языков — плохая конструкция и для поиска тоже: робот видит одну страницу и одну версию содержимого, а вторая для него не существует. Правильное решение — разнести языки по разным адресам, через раздел или отдельный поддомен, и связать их указанием языковых соответствий. Тогда и кэш работает штатно по адресу, и обе версии попадают в индекс. Если переделка невозможна прямо сейчас, добавляйте метку в ключ как временную меру, но помните, что число копий в кэше умножится на число языков.
Матвей Сурганов
Добавлю про отдачу устаревшей копии при сбое приложения. У нас база падала пару раз в месяц из-за тяжёлых отчётов, и посетители видели ошибку. После настройки отдачи старой копии сайт при тех же падениях остаётся на ногах. Функция недооценённая, я про неё узнал случайно.
Регина Салиева
У нас хостинг без доступа к конфигурации веб-сервера, только панель. Из всего списка доступен, похоже, только кэш кода и плагин полностраничного кэша. Стоит ли вообще переезжать ради остального или разница не окупит хлопот?
Анатолий Кузнецов автор
Решение принимается по замеру, а не по списку доступных возможностей. Померьте время ответа сервера на трёх типах страниц с включённым кэшем кода и плагином полностраничного кэша. Если получается меньше 300 миллисекунд, переезд ничего заметного не даст, и деньги лучше вложить в содержимое сайта. Если держится выше секунды и плагин не помогает, причина обычно не в отсутствии продвинутого кэша, а в том, что вы делите процессор с сотней соседей по тарифу — и вот тогда переезд оправдан. Промежуточный вариант, который часто выручает: тот же хостинг, но тариф с выделенными ресурсами. Он дешевле своего сервера и снимает основную часть проблемы без администрирования.
Юрий Свалов
Про подключение хранилища через файловый сокет вместо сетевого — деталь мелкая, а эффект заметный. У нас на нагруженном каталоге переключение дало около десяти процентов по времени ответа, и это буквально одна строка в настройках.
Марина Сударикова
Отдельно ценю пункт про запрет кэшировать ответы с меткой сессии. Читала про случай в чужом магазине, где посетители попадали в чужие кабинеты, и думала, что это редкая экзотика. Оказывается, это ровно то, что происходит при включении кэша страниц без исключений.
Артур Самедов
Не соглашусь с тем, что режим динамической компиляции бесполезен на обычных сайтах. У нас каталог с расчётом цен в реальном времени, там как раз вычисления, и прирост был вполне ощутимый. Так что смотреть надо на характер нагрузки, а не на тип сайта.
Анатолий Кузнецов автор
Ваша поправка точнее моей формулировки, принимаю. Правило стоит переписать так: режим динамической компиляции окупается там, где заметная доля времени уходит на вычисления внутри кода, а не на ожидание базы, диска и внешних сервисов. Расчёт цен в реальном времени, пересчёт корзины по сложным правилам, обработка изображений — как раз такие случаи. На сайте услуг, где страница собирается из десятка запросов к базе и шаблона, прироста почти нет, потому что процессор там простаивает в ожидании. Проверить принадлежность своего сайта к первой или второй группе можно замером: если время ответа падает при отключении части внешних вызовов сильнее, чем при ускорении самого кода, вы во второй группе. И отдельно предупрежу: включать этот режим стоит только после того, как вы проверили сайт на тестовой копии — совместимость с расширениями бывает неполной.
Нина Слепухина
Порядок включения по шагам с замерами оказался главным в статье. Раньше включали всё пакетом, потом при поломке откатывали тоже пакетом и никогда не знали, что именно виновато. Теперь ведём табличку с замерами после каждого шага, стало видно, что даёт эффект, а что нет.
Глеб Стерлигов
Проверка через два браузера с входом в кабинет в одном из них — простая и правильная. Добавлю от себя: полезно ещё проверить в режиме без сохранения истории, потому что обычный браузер может подсунуть свою копию и создать ложное ощущение, что всё хорошо.