Основы веб-кэширования: терминология, HTTP-заголовки и стратегии кэширования

Вступление

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

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

Что такое кеширование?

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

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

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

Выгоды

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

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

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

  • Increased performance on the same hardware: для сервера, на котором был создан контент, можно добиться большей производительности от того же оборудования, разрешив агрессивное кэширование. Владелец контента может использовать мощные серверы на пути доставки, чтобы принять на себя основную нагрузку на контент.

  • Availability of content during network interruptions: с помощью определенных политик кэширование может использоваться для предоставления контента конечным пользователям, даже если он может быть недоступен в течение коротких периодов времени с исходных серверов.

терминология

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

  • Origin server: исходный сервер - это исходное расположение содержимого. Если вы действуете как администратор веб-сервера, это компьютер, которым вы управляете. Он отвечает за обслуживание любого контента, который не может быть извлечен из кэша по маршруту запроса, и за настройку политики кэширования для всего контента.

  • Cache hit ratio: эффективность кеша измеряется с точки зрения коэффициента попадания в кеш или скорости попадания. Это отношение запросов, которые можно извлечь из кэша, к общему количеству выполненных запросов. Высокий коэффициент попадания в кэш означает, что большой процент контента можно было извлечь из кеша. Обычно это желаемый результат для большинства администраторов.

  • Freshness: Свежесть - это термин, используемый для описания того, считается ли элемент в кэше по-прежнему кандидатом для обслуживания клиента. Содержимое в кэше будет использоваться только для ответа, если оно находится в пределах времени обновления, указанного в политике кэширования.

  • Stale content: срок действия элементов в кэше истекает в соответствии с настройками актуальности кеша в политике кэширования. Контент с истекшим сроком действия является «устаревшим». Как правило, просроченный контент не может использоваться для ответа на запросы клиентов. С исходным сервером необходимо повторно связаться, чтобы получить новый контент или, по крайней мере, убедиться, что кэшированный контент все еще точен.

  • Validation: устаревшие элементы в кэше можно проверить, чтобы обновить время их истечения. Проверка включает в себя проверку на сервере происхождения, чтобы увидеть, представляет ли кэшированное содержимое самую последнюю версию элемента.

  • Invalidation: Недействительность - это процесс удаления содержимого из кеша до указанной даты истечения срока его действия. Это необходимо, если элемент был изменен на исходном сервере, и наличие устаревшего элемента в кэше может вызвать значительные проблемы для клиента.

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

Что можно кэшировать?

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

  • Логотипы и изображения брендов

  • Невращающиеся изображения в целом (например, значки навигации)

  • Таблицы стилей

  • Общие файлы Javascript

  • Загружаемый контент

  • Медиа файлы

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

Вот некоторые вещи, которые вы должны соблюдать при кэшировании:

  • HTML-страницы

  • Вращающиеся изображения

  • Часто модифицируемые Javascript и CSS

  • Контент, запрошенный с помощью куки

Некоторые элементы, которые почти никогда не должны кэшироваться:

  • Активы, связанные с конфиденциальными данными (банковская информация и т. Д.)

  • Контент, который зависит от пользователя и часто изменяется

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

Места, где веб-контент кэшируется

Контент может кэшироваться в разных точках цепочки доставки:

  • Browser cache: сами веб-браузеры поддерживают небольшой кеш. Как правило, браузер устанавливает политику, которая диктует наиболее важные элементы для кэширования. Это может быть пользовательский контент или контент, который считается дорогим для загрузки и может быть запрошен снова.

  • Intermediary caching proxies: Любой сервер между клиентом и вашей инфраструктурой может по желанию кэшировать определенный контент. Эти кэши могут поддерживаться интернет-провайдерами или другими независимыми сторонами.

  • Reverse Cache: ваша серверная инфраструктура может реализовать собственный кеш для внутренних служб. Таким образом, контент может обслуживаться через точку контакта, а не по заданным серверам при каждом запросе.

Каждое из этих мест может и часто делает элементы кэширования в соответствии со своими политиками кэширования и политиками, установленными в источнике контента.

Заголовки кэширования

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

Большая часть поведения кэширования определяется политикой кэширования, которая устанавливается владельцем контента. Эти политики в основном сформулированы посредством использования определенных заголовков HTTP.

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

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

  • Cache-Control: это более современная замена заголовкаExpires. Он хорошо поддерживается и реализует гораздо более гибкий дизайн. Почти во всех случаях это предпочтительнее, чемExpires, но может не помешать установить оба значения. Мы обсудим особенности параметров, которые вы можете установить с помощьюCache-Control, немного позже.

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

  • Last-Modified: этот заголовок указывает, когда в последний раз элемент был изменен. Это может использоваться как часть стратегии проверки для обеспечения свежего контента.

  • Content-Length: заголовокContent-Length, хотя он специально не участвует в кэшировании, важно установить при определении политик кэширования. Определенное программное обеспечение откажется кэшировать содержимое, если оно не знает заранее размер содержимого, для которого ему потребуется резервировать место.

  • Vary: кэш обычно использует запрошенный хост и путь к ресурсу в качестве ключа для хранения элемента кеша. ЗаголовокVary может использоваться для указания кешам обращать внимание на дополнительный заголовок при принятии решения о том, относится ли запрос к тому же элементу. Это чаще всего используется, чтобы указать кешам на ключ с помощью заголовкаAccept-Encoding, чтобы кеш знал, как различать сжатый и несжатый контент.

В стороне о различных заголовках

ЗаголовокVary дает вам возможность хранить разные версии одного и того же контента за счет разбавления записей в кэше.

В случаеAccept-Encoding установка заголовкаVary позволяет провести критическое различие между сжатым и несжатым содержимым. Это необходимо для правильной передачи этих элементов браузерам, которые не могут обрабатывать сжатый контент, и необходимо для обеспечения простоты использования. Одна характеристика, которая говорит вам, чтоAccept-Encoding может быть хорошим кандидатом наVary, заключается в том, что он имеет только два или три возможных значения.

Такие элементы, какUser-Agent, на первый взгляд могут показаться хорошим способом различить мобильные и настольные браузеры для обслуживания разных версий вашего сайта. Однако, поскольку строкиUser-Agent нестандартны, результатом, скорее всего, будет много версий одного и того же содержимого в промежуточных кэшах с очень низким коэффициентом попадания в кеш. ЗаголовокVary следует использовать с осторожностью, особенно если у вас нет возможности нормализовать запросы в промежуточных кэшах, которые вы контролируете (что может быть возможно, например, если вы используете сеть доставки контента).

Как флаги Cache-Control влияют на кэширование

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

Вот некоторые из параметровCache-Control, которые вы можете использовать для определения политики кэширования вашего контента:

  • no-cache: эта инструкция указывает, что любой кэшированный контент должен повторно проверяться при каждом запросе перед тем, как он будет передан клиенту. По сути, это немедленно отмечает содержимое как устаревшее, но позволяет использовать методы повторной проверки, чтобы избежать повторной загрузки всего элемента снова.

  • no-store: эта инструкция указывает, что содержимое не может быть кэшировано каким-либо образом. Это целесообразно установить, если ответ представляет конфиденциальные данные.

  • public: это помечает контент как общедоступный, что означает, что он может кэшироваться браузером и любыми промежуточными кешами. Для запросов, использующих HTTP-аутентификацию, ответы по умолчанию помечаютсяprivate. Этот заголовок переопределяет этот параметр.

  • private: помечает содержимое какprivate. Частный контент может храниться в браузере пользователя, ноnot должны кэшироваться любыми промежуточными сторонами. Это часто используется для пользовательских данных.

  • max-age: этот параметр настраивает максимальный возраст, в течение которого контент может быть кэширован, прежде чем он должен будет повторно проверить или повторно загрузить контент с исходного сервера. По сути, он заменяет заголовокExpires для современного просмотра и является основой для определения свежести фрагмента контента. Эта опция принимает значение в секундах с максимальным допустимым временем обновления в один год (31536000 секунд).

  • s-maxage: это очень похоже на настройкуmax-age, поскольку указывает количество времени, в течение которого контент может быть кэширован. Разница в том, что эта опция применяется только к промежуточным кешам. Сочетание этого с вышеизложенным позволяет более гибко строить политику.

  • must-revalidate: это указывает, что информация о свежести, указанная вmax-age,s-maxage или заголовкеExpires, должна строго соблюдаться. Просроченное содержание не может быть подано ни при каких обстоятельствах. Это предотвращает использование кэшированного содержимого в случае прерывания работы сети и подобных сценариев.

  • proxy-revalidate: действует так же, как и вышеупомянутый параметр, но применяется только к промежуточным прокси. В этом случае браузер пользователя может потенциально использоваться для обслуживания устаревшего контента в случае прерывания сети, но промежуточные кэши не могут использоваться для этой цели.

  • no-transform: эта опция сообщает кешам, что им не разрешено изменять полученный контент по причинам производительности ни при каких обстоятельствах. Это означает, например, что кэш не может отправлять сжатые версии контента, которые он не получил от сжатого исходного сервера и не разрешен.

Их можно комбинировать различными способами для достижения различного поведения кэширования. Некоторые взаимоисключающие значения:

  • no-cache,no-store и обычное поведение кэширования, на которое указывает отсутствие

  • public иprivate

Параметрno-store заменяетno-cache, если оба присутствуют. Для ответов на неаутентифицированные запросы подразумеваетсяpublic. Для ответов на аутентифицированные запросы подразумеваетсяprivate. Их можно изменить, включив противоположную опцию в заголовокCache-Control.

Разработка стратегии кеширования

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

Общие проблемы

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

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

Общие рекомендации

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

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

  • Establish specific directories for images, css, and shared content: размещение контента в выделенных каталогах позволит вам легко ссылаться на них с любой страницы вашего сайта.

  • Use the same URL to refer to the same items: поскольку кэширует ключ и хоста, и путь к запрошенному контенту, убедитесь, что вы ссылаетесь на свой контент одинаково на всех своих страницах. Предыдущая рекомендация делает это значительно проще.

  • Use CSS image sprites where possible: CSS-спрайты изображений для таких элементов, как значки и навигация, уменьшают количество циклов, необходимых для рендеринга вашего сайта, и позволяют вашему сайту кэшировать этот единственный спрайт в течение длительного времени.

  • Host scripts and external resources locally where possible: если вы используете сценарии javascript и другие внешние ресурсы, рассмотрите возможность размещения этих ресурсов на своих серверах, если правильные заголовки не предоставляются в восходящем направлении. Обратите внимание, что вам нужно быть в курсе любых обновлений, сделанных в вышестоящем ресурсе, чтобы вы могли обновить свою локальную копию.

  • Fingerprint cache items: для статического содержимого, такого как файлы CSS и Javascript, может быть уместно отпечаток каждого элемента. Это означает добавление уникального идентификатора к имени файла (часто это хеш файла), чтобы в случае изменения ресурса можно было запрашивать новое имя ресурса, в результате чего запросы правильно обходили кеш. Существует множество инструментов, которые могут помочь в создании отпечатков пальцев и изменении ссылок на них в документах HTML.

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

  • Allow all caches to store generic assets: Статический контент и контент, не зависящий от пользователя, могут и должны кэшироваться во всех точках цепочки доставки. Это позволит промежуточным кешам отвечать контентом для нескольких пользователей.

  • Allow browsers to cache user-specific assets: для пользовательского контента часто приемлемо и полезно разрешить кеширование в браузере пользователя. Хотя этот контент не подходит для кэширования на каких-либо промежуточных прокси-серверах кэширования, кэширование в браузере позволит пользователям мгновенно получать данные во время последующих посещений.

  • Make exceptions for essential time-sensitive content: если у вас есть контент, который зависит от времени, сделайте исключение из приведенных выше правил, чтобы устаревший контент не обслуживался в критических ситуациях. Например, если на вашем сайте есть корзина для покупок, он должен немедленно отражать товары в корзине. В зависимости от характера содержимого для этого в заголовкеCache-Control можно установить параметрыno-cache илиno-store.

  • Always provide validators: Валидаторы позволяют обновлять устаревший контент без повторной загрузки всего ресурса. Установка заголовковEtag иLast-Modified позволяет кешам проверять свое содержимое и повторно обслуживать его, если оно не было изменено в источнике, что дополнительно снижает нагрузку.

  • Set long freshness times for supporting content: для эффективного использования кеширования элементы, которые запрашиваются в качестве вспомогательного содержимого для выполнения запроса, часто должны иметь длительную настройку актуальности. Обычно это подходит для таких элементов, как изображения и CSS, которые извлекаются для отображения HTML-страницы, запрошенной пользователем. Установка увеличенного времени обновления в сочетании с дактилоскопией позволяет кешам хранить эти ресурсы в течение длительного времени. Если активы изменятся, измененный отпечаток пальца сделает недействительным кэшированный элемент и инициирует загрузку нового содержимого. До тех пор вспомогательные предметы могут быть кэшированы далеко в будущем.

  • Set short freshness times for parent content: для того, чтобы вышеуказанная схема работала, содержащий элемент должен иметь относительно короткое время свежести или вообще не может быть кэширован. Обычно это HTML-страница, которая вызывает другое вспомогательное содержимое. Сам HTML будет часто загружаться, что позволяет быстро реагировать на изменения. Вспомогательный контент может затем активно кэшироваться.

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

  • Агрессивно кэшированные элементы

  • Кэшированные элементы с коротким временем обновления и возможностью повторной проверки

  • Элементы, которые не должны кэшироваться вообще

Цель состоит в том, чтобы по возможности перемещать контент в первые категории, сохраняя при этом приемлемый уровень точности.

Заключение

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

Related