Логотип seo-prodvizhenie-biznesa.ru
+7 (921) 333-77-45

Что такое серверное кэширование и как его настроить

Что такое серверное кэширование и как его настроить
Анатолий Кузнецов
Анатолий Кузнецов
SEO-оптимизатор с 20-летним стажем. Автор блога seo-prodvizhenie-biznesa.ru о продвижении и доработке сайтов.

Серверное кэширование убирает из ответа сайта самую дорогую его часть — работу, которую сервер уже проделал вчера и которую заставляют повторять при каждом обращении. Пока кэша нет, на каждый запрос заново компилируется код, заново опрашивается база, заново собирается один и тот же HTML для тысячи разных людей. Пока кэш настроен правильно, готовый ответ отдаётся из памяти за считанные миллисекунды. Разница в скорости ответа между этими двумя состояниями измеряется не процентами, а разами, и видна она не только посетителю, но и поисковому роботу, который оценивает время до первого байта.

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

Чем серверный кэш отличается от браузерного

Эти два механизма постоянно путают, хотя решают они противоположные задачи и приносят пользу разным людям.

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

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

Что сравниваем Браузерный кэш Серверный кэш
Где хранится На устройстве посетителя На вашем сервере
Кому помогает Тому, кто пришёл повторно Всем, включая первого гостя и робота
Что ускоряет Загрузку файлов страницы Формирование самого ответа
Влияет на нагрузку сервера Слабо Радикально
Влияет на время до первого байта Нет Да, это его основной эффект
Кто управляет Заголовки ответа, решает браузер Полностью вы

Практический вывод: если время ответа сервера у вас измеряется сотнями миллисекунд и больше, никакие манипуляции с картинками и шрифтами картину не спасут. Начинать надо с серверной части.

Четыре уровня серверного кэша

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

  1. Кэш скомпилированного кода. Хранит готовые к исполнению инструкции, чтобы не разбирать исходные файлы заново при каждом обращении. Работает на уровне интерпретатора, о самом сайте ничего не знает.
  2. Кэш объектов и данных. Хранит результаты дорогих операций: тяжёлых запросов к базе, ответов внешних сервисов, собранных фрагментов страницы. Живёт в отдельном хранилище в оперативной памяти.
  3. Кэш готовых страниц на веб-сервере. Хранит целиком собранный ответ. Обращение к сайту при попадании в кэш вообще не доходит до кода приложения и базы.
  4. Кэш перед сервером. Отдельный кэширующий узел или сеть доставки содержимого, стоящая перед вашим сервером. Работает по тем же принципам, но снимает ещё и сетевую задержку.

Отдача от уровней распределена неравномерно. Первый включается за десять минут и почти ничего не ломает. Третий даёт самый заметный выигрыш и требует самого внимательного отношения к исключениям. Четвёртый имеет смысл, когда первые три уже сделаны.

Кэш скомпилированного кода: с чего начинать всегда

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

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

Если нужны детали, смотрите «Индексация сайта: что это такое и как она работает».

Настраивать здесь надо немного, но настраивать надо. Значения по умолчанию рассчитаны на маленькие приложения и на крупном сайте упираются в потолок.

  • Объём памяти под кэш. Для типового сайта на системе управления 128 мегабайт хватает с запасом, для магазина с большим числом расширений разумно ставить 192–256.
  • Максимальное число кэшируемых файлов. Обязательно должно превышать реальное число файлов с кодом на сайте. Посчитайте их командой поиска по расширению и поставьте значение с запасом вдвое. При нехватке кэш начинает вытеснять сам себя, и весь смысл теряется.
  • Буфер под общие строки. 16 мегабайт — рабочее значение почти для всех.
  • Проверка времени изменения файлов. На боевом сервере её отключают ради скорости, но тогда после любой правки кода кэш надо сбрасывать вручную или при выкладке. Если выкладка не автоматизирована — оставьте проверку включённой и задайте интервал перепроверки в несколько десятков секунд. Забытый отключённый флаг стоил не одному владельцу сайта дня разбирательств, почему правки не появляются.
  • Сохранение комментариев в коде. Отключать нельзя: многие современные системы читают служебные пометки из комментариев, и без них сайт просто перестаёт работать.

Здесь же стоит упомянуть режим динамической компиляции, о котором много пишут. На обычном сайте, где время уходит на базу и на ввод-вывод, прирост от него скромный. Заметную пользу он приносит вычислительным задачам: обработке изображений, разбору больших массивов данных. Включать его на сайте услуг ради цифр в отчёте смысла нет.

Кэш готовых страниц на веб-сервере

Помогу с продвижением: SEO-продвижение под ключ — вывожу сайты в топ Яндекса белыми методами.

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

Механизм устроен так. Задаётся каталог хранения и зона в памяти под индекс ключей. Задаётся ключ кэша — набор признаков, по которым ответы считаются одинаковыми: обычно это протокол, метод, домен и адрес запроса. Задаётся срок жизни для разных кодов ответа: успешные страницы держат дольше, ответы об отсутствии страницы — минуты, чтобы ошибка не залипла надолго. И задаются условия обхода кэша, о которых ниже.

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

Если интересно направление с сайтами — базу даю в своём курсе:

Два условия, без которых включать этот уровень нельзя:

  • Обход кэша по признаку авторизации. Если в запросе есть служебная метка сессии, вошедшего пользователя, непустой корзины — ответ формируется заново и в общий кэш не кладётся.
  • Запрет сохранять ответы, которые выдают метку сессии. Это не оптимизация, а вопрос безопасности: сохранённый в общем кэше ответ с чужой сессией достанется следующему посетителю, и он окажется в чужом личном кабинете. Правило простое — ответ, устанавливающий сессию, в кэш не попадает никогда.

Существует и промежуточный вариант — полностраничный кэш средствами самой системы управления. Он медленнее, потому что запрос всё же доходит до кода сайта, зато умеет сам сбрасывать нужные страницы при правке материала и не требует доступа к конфигурации сервера. Для небольшого сайта на массовой платформе это разумный компромисс.

Подробнее об этом — в статье «Как настроить robots.txt».

Хранилище объектов: что выбрать

Там, где страницу целиком сохранить нельзя, работает кэш данных. Из базы вынимаются меню каталога, счётчики товаров в разделах, подборки похожих материалов, права доступа, настройки — всё, что меняется редко, а считается при каждой сборке. Результат кладётся в быстрое хранилище в памяти на минуты или часы.

Кандидатов два, и выбор между ними зависит от того, что ещё вы собираетесь туда положить.

Свойство Простое хранилище пар Хранилище со структурами данных
Что умеет хранить Только строки Строки, списки, множества, словари, счётчики
Переживает перезапуск Нет, всё теряется Да, при включённом сохранении на диск
Подходит для сессий С оговорками Да, штатный сценарий
Очереди и фоновые задачи Нет Да
Использование ядер процессора Несколько потоков Основные операции в одном потоке
Сложность настройки Минимальная Выше, но в пределах разумного

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

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

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

Если нужна помощь по теме — обучение SEO-продвижению.

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

Что нельзя отдавать из кэша

Список короткий, но каждый пункт в нём оплачен чьей-то поломанной неделей.

Тему разбирал отдельно: «Что такое сертификат SSL».

  • Корзина, оформление заказа, личный кабинет, панель управления сайтом.
  • Любой ответ, устанавливающий метку сессии.
  • Страницы с индивидуальными ценами и персональными скидками.
  • Результаты поиска по сайту — либо не кэшировать вовсе, либо на считанные минуты, иначе хранилище забьётся мусорными ключами.
  • Страницы с формами, защищёнными одноразовым ключом. Ключ живёт ограниченное время, а из кэша посетитель получит вчерашний — форма его не примет, и заявка не уйдёт. Внешне сайт исправен, а поток обращений падает до нуля. Лечится исключением таких страниц или подгрузкой ключа отдельным запросом при открытии формы.
  • Ответы с кодами ошибок сервера — им место в кэше только на десятки секунд, чтобы разовый сбой не превратился в сутки недоступности.

Порядок включения на своём сайте

Соблазн включить всё сразу велик, но тогда при первой же поломке вы не поймёте, какой из уровней виноват. Работающий порядок — по одному, с проверкой на каждом шаге.

  1. Замерить исходное время ответа сервера на трёх типах страниц: главная, страница раздела, страница материала. Записать цифры.
  2. Включить и настроить кэш скомпилированного кода. Проверить, что сайт работает, замерить снова.
  3. Настроить буферный пул базы под доступную память. Замерить.
  4. Подключить хранилище объектов, если система управления умеет с ним работать. Проверить админку и формы.
  5. Включить кэш готовых страниц с исключениями по авторизации и корзине. Проверить в двух браузерах: в одном войти в личный кабинет, в другом открыть тот же адрес анонимно и убедиться, что чужих данных не видно.
  6. Настроить сброс кэша при публикации материалов и при выкладке кода.
  7. Только после этого — сеть доставки или отдельный кэширующий узел, если объёмы того требуют.

Как проверить, что кэш действительно работает

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

Уровень Что смотреть Признак, что всё в порядке
Кэш кода Статус кэша интерпретатора Доля попаданий выше 99 процентов, перезапусков по нехватке памяти нет
Хранилище объектов Статистика попаданий и промахов Попаданий кратно больше промахов, вытеснений мало
Кэш страниц Служебный заголовок статуса в ответе Первый запрос — промах, второй по тому же адресу — попадание
Общий эффект Время до первого байта Стабильно ниже 200 миллисекунд на кэшируемых страницах
Исключения Тот же заголовок на странице корзины Всегда обход кэша, никогда попадание

Заголовок со статусом кэша веб-сервер не выводит по умолчанию — его добавляют одной строкой в конфигурацию, и он бесценен при отладке. Значения читаются буквально: промах — ответ собран заново и сохранён, попадание — отдан из кэша, обход — сработало правило исключения, устарел — копия была, но просрочена.

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

Ошибки, которые ломают кэш

Симптом Причина Что делать
Правки на сайте не видны Отдаётся сохранённая копия Сбросить кэш, настроить автосброс при публикации
Заявки перестали приходить Закэширован одноразовый ключ формы Исключить страницы с формами или подгружать ключ отдельно
Посетитель видит чужое имя в шапке В общий кэш попал ответ с меткой сессии Немедленно отключить кэш страниц, добавить запрет, очистить хранилище
Кэш работает утром и не работает днём Хранилище переполняется и вытесняет записи Увеличить лимит памяти, сократить сроки жизни мусорных ключей
Сервер начал падать после включения Хранилище объектов без ограничения памяти Задать предел и политику вытеснения
Доля попаданий у кода низкая Мал лимит на число файлов Поднять лимит выше реального числа файлов сайта

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

Нужен ли серверный кэш на сайте с посещаемостью в сто человек в день? Кэш кода — да, он бесплатен и снижает время ответа независимо от нагрузки. Кэш страниц — по ситуации: если сервер отвечает за 150 миллисекунд, острой нужды нет.

Можно ли включить всё это на обычном виртуальном хостинге? Кэш кода обычно уже включён, но на дешёвых тарифах встречается отключённым — стоит проверить. Хранилище объектов доступно не везде. Кэш страниц на уровне веб-сервера почти всегда требует своего сервера, зато полностраничный кэш средствами системы управления работает где угодно.

Кэш поможет, если сайт тормозит из-за тяжёлых картинок? Нет. Серверный кэш ускоряет формирование ответа, а не передачу файлов. Это разные задачи, и решать их надо разными средствами.

Как часто сбрасывать кэш? По событию, а не по расписанию: при публикации материала сбрасывается страница материала, раздел и главная. Полный сброс по расписанию — признак того, что автосброс не настроен.

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

Не устареет ли выдача из кэша для поискового робота? При правильно настроенном сбросе — нет. Робот получает ту же копию, что и посетители, и она обновляется при изменении материала.

Коротко

  • Серверный кэш экономит работу сервера для всех, браузерный — трафик для повторного визита одного человека; путать их нельзя.
  • Уровней четыре: код, объекты, готовые страницы, узел перед сервером. Включают по одному, с замером на каждом шаге.
  • Кэш скомпилированного кода — первое, что стоит настроить: даёт кратный выигрыш и не требует правок в сайте.
  • Кэш готовых страниц самый быстрый, но обязателен запрет на сохранение ответов с меткой сессии — иначе посетитель попадёт в чужой кабинет.
  • Хранилищу объектов всегда задают предел памяти и политику вытеснения, иначе оно уронит сервер.
  • Работоспособность проверяют по служебному заголовку статуса и времени до первого байта, а не по наличию строк в конфигурации.

Если время ответа сервера у вас держится выше полусекунды и непонятно, за какой уровень браться первым, приходите на SEO-консультацию — посмотрим замеры на ваших страницах и определим, где именно уходит время: в коде, в базе или в сборке страницы.

Увеличьте позиции и продажи вашего сайта

Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:

Анатолий Кузнецов — SEO-оптимизатор

Остались вопросы по продвижению?

Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.

Связаться со мной →

Комментарии

Аркадий Ропотов

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

Анатолий Кузнецов автор

Это самая дорогая ловушка на всём уровне кэша страниц, потому что она не даёт никаких внешних признаков: сайт открывается, форма рисуется, кнопка нажимается. Чтобы не полагаться на память, заведите привычку после каждого изменения в кэше проходить короткий сценарий: отправить тестовую заявку с чистого браузера, проверить, что письмо пришло, и посмотреть запись в базе. Занимает две минуты. И поставьте себе внешний контроль на поток заявок — простое уведомление, если за сутки не пришло ни одной, притом что обычно приходит пять. Такой сторож стоит копейки и ловит не только кэш, но и упавшую почту, и сломанную интеграцию.

Денис Рудченко

Про лимит на число файлов у кэша кода — попадание в точку. У нас магазин с полутора сотнями расширений, файлов больше тридцати тысяч, а лимит стоял из коробки. Кэш вытеснял сам себя, доля попаданий болталась около шестидесяти процентов. Поднял лимит — время ответа упало почти вдвое.

Полина Сакулина

Сомневаюсь насчёт совета отдавать под буферный пул две трети памяти. У нас на одном сервере и база, и сайт, и почта. Если отдать столько базе, остальному не хватит. Как считать долю в такой ситуации?

Анатолий Кузнецов автор

Две трети — ориентир для выделенного сервера базы, и на совмещённой машине он действительно не подходит. Считайте от обратного. Сначала оцените, сколько памяти нужно всему остальному под пиковой нагрузкой: процессы обработки запросов умножьте на их реальный расход, добавьте веб-сервер, почту и запас гигабайта на систему. Что осталось — отдайте базе, оставив ещё 15 процентов свободными на всплески. Есть и второй ориентир, более полезный: посмотрите суммарный объём данных и индексов в вашей базе. Если он меньше доступной памяти, нет смысла выделять пул больше этого объёма — данные и так поместятся целиком. У большинства сайтов услуг база весит меньше гигабайта, и вопрос снимается сам собой.

Эдуард Смекалин

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

Ксения Скокова

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

Анатолий Кузнецов автор

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

Матвей Сурганов

Добавлю про отдачу устаревшей копии при сбое приложения. У нас база падала пару раз в месяц из-за тяжёлых отчётов, и посетители видели ошибку. После настройки отдачи старой копии сайт при тех же падениях остаётся на ногах. Функция недооценённая, я про неё узнал случайно.

Регина Салиева

У нас хостинг без доступа к конфигурации веб-сервера, только панель. Из всего списка доступен, похоже, только кэш кода и плагин полностраничного кэша. Стоит ли вообще переезжать ради остального или разница не окупит хлопот?

Анатолий Кузнецов автор

Решение принимается по замеру, а не по списку доступных возможностей. Померьте время ответа сервера на трёх типах страниц с включённым кэшем кода и плагином полностраничного кэша. Если получается меньше 300 миллисекунд, переезд ничего заметного не даст, и деньги лучше вложить в содержимое сайта. Если держится выше секунды и плагин не помогает, причина обычно не в отсутствии продвинутого кэша, а в том, что вы делите процессор с сотней соседей по тарифу — и вот тогда переезд оправдан. Промежуточный вариант, который часто выручает: тот же хостинг, но тариф с выделенными ресурсами. Он дешевле своего сервера и снимает основную часть проблемы без администрирования.

Юрий Свалов

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

Марина Сударикова

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

Артур Самедов

Не соглашусь с тем, что режим динамической компиляции бесполезен на обычных сайтах. У нас каталог с расчётом цен в реальном времени, там как раз вычисления, и прирост был вполне ощутимый. Так что смотреть надо на характер нагрузки, а не на тип сайта.

Анатолий Кузнецов автор

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

Нина Слепухина

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

Глеб Стерлигов

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 Нажимая «оставить комментарий» вы принимаетеправила конфиденциальности 

Прокрутить вверх