Как настроить кэширование содержимого Apache в CentOS 7

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

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

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

Чтобы узнать больше о разработке общих стратегий кэширования, ознакомьтесь с th this article.

Введение в кеширование в Apache

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

  • * Кэширование файлов *: самая основная стратегия кеширования, которая просто открывает файлы или дескрипторы файлов при запуске сервера и сохраняет их доступными для ускорения доступа.

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

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

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

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

Кэширование файлов

Общий обзор

  • * Включены основные модули *: + mod_file_cache +

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

  • * Особенности *: просто, улучшает производительность медленных файловых систем

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

Детали

Модуль + mod_file_cache + в основном используется для ускорения доступа к файлам на серверах с медленными файловыми системами. Он предоставляет на выбор две директивы конфигурации, обе из которых направлены на ускорение процесса обслуживания статических файлов путем выполнения некоторой работы при запуске сервера, а не при запросе файлов.

Директива + CacheFile + используется для указания пути к файлам на диске, к которым вы хотели бы ускорить доступ. Когда Apache запускается, Apache открывает статические файлы, которые были указаны, и кэширует дескриптор файла, избегая необходимости открывать файл при его запросе. Количество файлов, которые могут быть открыты таким образом, зависит от ограничений, установленных вашей операционной системой.

Директива + MMapFile + также открывает файлы при первом запуске Apache. Однако + MMapFile + кэширует содержимое файла в памяти, а не только в обработчике файла. Это позволяет повысить производительность этих страниц, но имеет ряд серьезных ограничений. Он не хранит записи об объеме используемой памяти, поэтому возможно исчерпание памяти. Также обратите внимание, что дочерние процессы будут копировать любую выделенную память, что может привести к более быстрому истощению ресурсов, чем вы изначально могли ожидать. Используйте эту директиву с осторожностью.

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

Как включить кеширование файлов

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

При запуске CentOS 7 модуль будет установлен при установке Apache, но конфигурация по умолчанию не загружает модуль. Чтобы загрузить модуль, мы создадим простой файл в нашем каталоге + / etc / httpd / conf.modules.d + для загрузки модуля. Мы назовем этот файл + 00-cache.conf +:

sudo nano /etc/httpd/conf.modules.d/00-cache.conf

Внутри нам нужно использовать директиву + LoadModule +, чтобы включить нужные нам функции. Добавьте следующую строку в файл:

/etc/httpd/conf.modules.d/00-cache.conf

LoadModule file_cache_module modules/mod_file_cache.so

Сохраните и закройте файл, когда вы закончите.

После этого вы должны отредактировать основной файл конфигурации, чтобы настроить директивы кэширования файлов. Откройте файл, набрав:

sudo nano /etc/httpd/conf/httpd.conf

Чтобы настроить кэширование дескриптора файла, используйте директиву + CacheFile +. Эта директива принимает список путей к файлам, разделенных пробелами, например:

/etc/httpd/conf/httpd.conf

CacheFile /var/www/html/index.html /var/www/html/somefile.index

Когда сервер будет перезапущен, Apache откроет перечисленные файлы и сохранит их дескрипторы файлов в кеше для более быстрого доступа.

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

/etc/httpd/conf/httpd.conf

MMapFile /var/www/html/index.html /var/www/html/somefile.index

На практике не было бы никакой причины настраивать both + CacheFile + и + MMapFile + для одного и того же набора файлов, но вы можете использовать оба для разных наборов файлов.

Когда вы закончите, вы можете сохранить и закрыть файлы. Проверьте синтаксис файла конфигурации, набрав:

sudo apachectl configtest

Если последняя строка гласит + Синтаксис OK +, вы можете безопасно перезапустить ваш экземпляр Apache:

sudo systemctl restart httpd

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

Кэширование значения ключа

Общий обзор

  • * Включены основные модули *: + mod_socache_dbm +, + mod_socache_dc +, + mod_socache_memcache +, + mod_socache_shmcb +

  • * Поддержка вспомогательных модулей *: + mod_authn_socache +, + mod_ssl +

  • * Основные варианты использования *: хранение сеансов SSL или деталей аутентификации, сшивание SSL

  • * Особенности *: общий кэш объектов для хранения сложных ресурсов, может помочь в кэшировании и сшивании SSL-сессий, гибкий бэкэнд

  • * Недостатки *: не имеет механизмов проверки, необходимо настроить отдельное программное обеспечение для более производительного / гибкого бэкэнда, некоторые ошибки в коде

Детали

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

Note

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

  • * + mod_socache_dbm + *: этот бэкэнд использует простой механизм базы данных + dbm +, который представляет собой хранилище значений ключей на основе файлов, которое использует хеширование и блоки фиксированного размера. Этот провайдер страдает от некоторых утечек памяти, поэтому для большинства случаев рекомендуется использовать + mod_socache_shmcb +.

  • * + mod_socache_dc + *: этот провайдер использует программное обеспечение для кэширования сеансов distcache. Этот проект не обновлялся с 2004 года и даже не упакован для некоторых дистрибутивов, поэтому используйте его с осторожностью.

  • * + mod_socache_memcache + *: при этом используется кэш объектов распределенной памяти memcache для хранения элементов. Это лучший вариант для распределенного кэша между несколькими серверами. В настоящее время срок действия записей не истекает, но patch был передан в ствол системы управления версиями Apache, которая устраняет проблему.

  • * + mod_socache_shmcb + *: В настоящее время это лучший вариант для кэширования значения ключа. Это кэширует в циклический буфер в разделяемой памяти, который удаляет записи по мере заполнения. В настоящее время он захлебывается entries размером более 11 КБ.

Наряду с вышеупомянутыми модулями провайдера потребуются дополнительные модули в зависимости от объектов, которые кэшируются. Например, для кэширования сеансов SSL или для настройки сшивания SSL необходимо включить + mod_ssl +, что обеспечит директивы + SSLSessionCache + и + SSLStaplingCache + соответственно. Аналогично, для настройки кэширования аутентификации модуль + mod_authn_socache + должен быть включен, чтобы можно было установить директиву + AuthnCacheSOCache +.

Как включить кэширование значения ключа

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

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

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

Кэширование аутентификации

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

Настройка кэширования включает в себя изменение существующей конфигурации аутентификации (в этом руководстве мы не расскажем, как настроить аутентификацию). Сами модификации будут практически одинаковыми независимо от метода проверки подлинности бэкэнда. Мы будем использовать + mod_socache_shmcb для вашей демонстрации. Этот модуль уже включен в нашем файле + / etc / httpd / conf.modules.d / 00-base.conf +.

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

sudo nano /etc/httpd/conf/httpd.conf

Внутри, в верхней части файла, добавьте директиву + AuthnCacheSOCache +. Укажите, что + shmcb + должен использоваться в качестве провайдера. Если рассмотренная ранее ошибка, препятствующая передаче параметров, будет исправлена ​​к тому времени, как вы ее прочитаете, вы можете указать местоположение и размер кэша. Число указывается в байтах, поэтому приведенный в качестве примера пример приведет к кешу объемом 512 килобайт:

/etc/httpd/conf/httpd.conf

AuthnCacheSOCache shmcb

# If the bug preventing passed arguments to the provider gets fixed,
# you can customize the location and size like this
#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

Сохраните и закройте файл, когда вы закончите.

Затем откройте страницу конфигурации вашего виртуального хоста, на которой настроена аутентификация. Мы предполагаем, что вы используете конфигурацию виртуального хоста с именем + site.conf +, расположенную в каталоге + / etc / httpd / conf.d +, но вы должны изменить ее так, чтобы она отражала вашу среду:

sudo nano /etc/httpd/conf.d/site.conf

Базовый виртуальный хост, настроенный с аутентификацией, может выглядеть примерно так:

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html

   <Directory /var/www/html/private>
       AuthType Basic
       AuthName "Restricted Files"
       AuthUserFile /etc/httpd/.htpasswd
       AuthBasicProvider file
       Require valid-user
   </Directory>
</VirtualHost>

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

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html

   <Directory /var/www/html/private>
       AuthType Basic
       AuthName "Restricted Files"
       AuthUserFile /etc/apache/.htpasswd
       AuthBasicProvider  file


       Require valid-user
   </Directory>
</VirtualHost>

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

Сохраните и закройте файл. Проверьте изменения на наличие синтаксических ошибок, набрав:

sudo apachectl configtest

Если синтаксические ошибки не обнаружены, перезапустите Apache, чтобы внести изменения в кэширование:

sudo systemctl restart httpd
Кеширование SSL-сессии

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

Если у вас уже настроен SSL для вашего сервера Apache, + mod_ssl + будет включен (если нет, используйте + yum + для установки модуля + mod_ssl +). В CentOS 7 это означает, что файл + ssl.conf + будет доступен в каталоге + / etc / httpd / conf.d +. Это на самом деле уже настраивает кеширование. Внутри вы увидите несколько таких строк:

/etc/httpd/conf.d/ssl.conf

. . .

SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300

. . .

Этого на самом деле достаточно для настройки кэширования сеанса. Чтобы проверить это, вы можете использовать клиент подключения OpenSSL. Тип:

openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID

Если идентификатор сеанса одинаков во всех результатах, кэш сеанса работает правильно. Нажмите CTRL-C, чтобы выйти обратно в терминал.

Стандартное HTTP-кеширование

Общий обзор

  • * Основные участвующие модули *: + mod_cache +

  • * Поддержка вспомогательных модулей *: + mod_cache_disk +, + mod_cache_socache +

  • * Основные варианты использования *: Кэширование общего содержимого

  • * Особенности *: Может правильно интерпретировать заголовки кэширования HTTP, может повторно проверить устаревшие записи, может быть развернут для максимальной скорости или гибкости в зависимости от ваших потребностей

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

Детали

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

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

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

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

Обзор модуля

Логика кэширования HTTP доступна через модуль + mod_cache +. Фактическое кэширование выполняется одним из поставщиков кэширования. Как правило, кеш хранится на диске с помощью модуля + mod_cache_disk +, но кеширование общих объектов также доступно через модуль + mod_cache_socache +.

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

Модуль + mod_cache_socache + кэширует один из провайдеров общих объектов (те же, что обсуждались в предыдущем разделе). Это потенциально может иметь лучшую производительность, чем + mod_cache_disk + (в зависимости от того, какой поставщик общего кэша выбран). Тем не менее, он намного новее и зависит от поставщиков общих объектов, чьи ошибки обсуждались ранее. Комплексное тестирование рекомендуется перед реализацией опции + mod_cache_socache +.

Размещение HTTP-кэша

HTTP-кеш Apache может быть развернут в двух разных конфигурациях в зависимости от ваших потребностей.

Если для + CacheQuickHandler + установлено значение “on”, кэш будет проверен очень рано в процессе обработки запроса. Если контент найден, он будет обслуживаться напрямую, без дальнейшей обработки. Это означает, что это невероятно быстро, но это также означает, что он не допускает такие процессы, как аутентификация контента. Если в вашем кеше есть контент, который обычно требует аутентификации или контроля доступа, он будет доступен * любому * без аутентификации, если для + CacheQuickHandler + установлено значение “on”.

По сути, это эмулирует отдельный кеш перед вашим веб-сервером. Если вашему веб-серверу необходимо выполнить какую-либо условную проверку, аутентификацию или авторизацию, этого не произойдет. Apache даже не будет оценивать директивы в блоках + <Location> + или + <Directory> +. Обратите внимание, что + CacheQuickHandler + по умолчанию * включен *!

Если для + CacheQuickHandler + установлено значение «off», то кэш будет проверен значительно позже в последовательности обработки запросов. Думайте об этой конфигурации как о размещении кеша между вашей логикой обработки Apache и вашим реальным контентом. Это позволит выполнять обычные директивы обработки до извлечения контента из кэша. Установка этого параметра в положение «off» немного увеличивает скорость обработки запросов.

Как настроить стандартное кэширование HTTP

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

Настройка htcacheclean для автоматического управления кешем

В системе CentOS 7 во время установки + httpd + устанавливается утилита + htcacheclean +, которая используется для сжатия кэша по мере его роста. Файл модуля + systemd с именем` + htcacheclean.service` включен по умолчанию.

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

Чтобы настроить это, мы создадим каталог с именем + httpd.service.requires + в каталоге + / etc / systemd / system +. Это можно использовать для указания зависимостей файла модуля + httpd.service, который запускает Apache:

sudo mkdir -p /etc/systemd/system/httpd.service.requires

После этого мы можем связать файл модуля + htcacheclean.service с этим каталогом. Это приведет к тому, что служба + htcacheclean + будет запускаться и очищать кеш через равные промежутки времени при запуске Apache:

sudo ln -s /usr/lib/systemd/system/htcacheclean.service /etc/systemd/system/httpd.service.requires

Вы можете настроить параметры + htcacheclean +, включая интервал очистки, отредактировав файл + htcacheclean + в каталоге + / etc / sysconfig +:

sudo nano /etc/sysconfig/htcacheclean

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

/ И т.д. / sysconfig / htcacheclean

INTERVAL=15
CACHE_ROOT=/var/cache/httpd/proxy
LIMIT=100M
OPTIONS=

Note

Когда вы закончите, сохраните и закройте файл.

Перезапустите Apache, чтобы запустить + htcacheclean для автоматической очистки кэша:

sudo systemctl restart httpd
Изменение глобальной конфигурации

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

sudo nano /etc/httpd/conf/httpd.conf

Нам нужно добавить каталог + CacheRoot +, чтобы указать путь, который должен использоваться для хранения наших кэшированных элементов. Это всегда должно совпадать со значением + CACHE_ROOT +, найденным в вашем файле + / etc / sysconfig / htcacheclean +, чтобы кеш мог правильно управляться. Мы также установим директивы + CacheDirLevels + и + CacheDirLength +, которые оба помогут определить, как будет строиться структура каталогов кеша:

/etc/httpd/conf/httpd.conf

CacheRoot /var/cache/httpd/proxy
CacheDirLevels 2
CacheDirLength 1

+ CacheDirLevels + и + CacheDirLength + вносят вклад в определение того, как будет строиться структура каталогов кэша. В качестве ключа, используемого для хранения данных, будет создан хэш + md5 + обслуживаемого URL. Данные будут организованы в каталоги, полученные из начальных символов каждого хэша. + CacheDirLevels + указывает количество создаваемых подкаталогов, а + CacheDirLength + указывает, сколько символов следует использовать в качестве имени каждого каталога. Таким образом, хэш + b1946ac92492d2347c6235b4d2611184 + со значениями по умолчанию, показанными выше, будет храниться в структуре каталогов + b / 1 / 946ac92492d2347c6235b4d2611184 +. Обычно вам не нужно изменять эти значения, но полезно знать, для чего они используются.

Некоторые другие значения, которые вы можете установить в этом файле: + CacheMaxFileSize + и + CacheMinFileSize +, которые устанавливают диапазоны размеров файлов в байтах, которые Apache будет фиксировать в кэш, а также + CacheReadSize + и + CacheReadTime +, которые позволяет ждать и буферизовать содержимое перед отправкой клиенту. Это может быть полезно, если контент находится где-то еще, кроме этого сервера.

Модификация виртуального сервера

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

Откройте один из ваших файлов виртуального хоста, чтобы следовать. Мы предполагаем, что вы используете файл + site.conf + в вашем каталоге + / etc / httpd / conf.d + в этом руководстве:

sudo nano /etc/httpd/conf.d/site.conf

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

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

Установка блокировки кэша для ресурса во время проверки сообщает Apache, что ресурс в настоящее время обновляется. В течение этого времени устаревший ресурс может обслуживаться с заголовком предупреждения, указывающим его состояние. Мы установим это с помощью каталога блокировки кэша в папке + / tmp +. Мы допустим максимум 5 секунд, чтобы блокировка считалась действительной. Эти примеры взяты непосредственно из документации Apache, поэтому они должны хорошо работать для наших целей.

Мы также скажем Apache игнорировать заголовки + Set-Cookie + и не сохранять их в кэше. Это предотвратит случайную утечку Apache пользовательских файлов cookie другим сторонам. Заголовок + Set-Cookie + будет удален перед кэшированием заголовков.

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html








</VirtualHost>

Нам все еще нужно включить кэширование для этого виртуального хоста. Мы можем сделать это с помощью директивы + CacheEnable +. Если это установлено в блоке виртуального хоста, нам нужно будет предоставить метод кэширования (+ disk + или + socache +), а также запрошенные URI, которые должны быть кэшированы. Например, чтобы кэшировать все ответы, это может быть установлено на + CacheEnable disk / +, но если вы хотите кэшировать ответы только под URI + / public +, вы можете установить это на + CacheEnable disk / public + ,

Мы будем использовать другой подход, включив наш кэш в определенном блоке местоположения. Это означает, что нам не нужно указывать путь URI для команды + CacheEnable +. Любой URI, который будет обслуживаться из этого местоположения, будет кэширован. Мы также включим директиву + CacheHeader +, чтобы наши заголовки ответа указывали, использовался ли кеш для обслуживания запроса или нет.

Еще одна директива, которую мы установим, это + CacheDefaultExpire +, так что мы можем установить срок действия (в секундах), если ни заголовок + Expires +, ни заголовок + Last-Modified + не установлены в содержимом. Точно так же мы установим + CacheMaxExpire + для ограничения количества времени, в течение которого элементы будут сохраняться. Мы установим + CacheLastModifiedFactor + так, чтобы Apache мог создать дату истечения срока действия, если у него есть дата + Last-Modified +, но нет срока действия. Коэффициент умножается на время с момента модификации, чтобы установить разумный срок действия.

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html

   CacheQuickHandler off

   CacheLock on
   CacheLockPath /tmp/mod_cache-lock
   CacheLockMaxAge 5

   CacheIgnoreHeaders Set-Cookie









</VirtualHost>

Сохраните и закройте файл, когда вы настроите все, что вам нужно.

Проверьте всю конфигурацию на наличие синтаксических ошибок, набрав:

sudo apachectl configtest

Если об ошибках не сообщается, перезапустите службу, введя:

sudo systemctl restart httpd

Установка срока действия и кэширования заголовков для содержимого

В приведенной выше конфигурации мы настроили кэширование HTTP, которое опирается на заголовки HTTP. Однако ни один из контента, который мы обслуживаем, на самом деле не имеет заголовков + Expires или` + Cache-Control`, необходимых для принятия интеллектуальных решений по кэшированию. Чтобы установить эти заголовки, нам нужно воспользоваться еще несколькими модулями.

Модуль + mod_expires + может установить оба заголовка + Expires + и параметр + max-age + в заголовке + Cache-Control +. Модуль + mod_headers может использоваться для добавления более специфичных опций` + Cache-Control` для дальнейшей настройки политики кэширования. Оба эти модуля включены по умолчанию в пакете CentOS 7 Apache.

Мы можем сразу перейти к изменению нашего файла виртуального хоста, чтобы начать настройку этих элементов:

sudo nano /etc/httpd/conf.d/site.conf

Модуль + mod_expires + предоставляет только три директивы. + ExpiresActive + включает обработку истечения срока действия в определенном контексте, устанавливая его в значение “on”. Две другие директивы очень похожи друг на друга. Директива + ExpiresDefault + устанавливает время истечения по умолчанию, а ExpiresByType + устанавливает время истечения в соответствии с типом MIME содержимого. Оба из них установят для + Expires и` + Cache-Control` «max-age» правильные значения.

Эти две настройки могут иметь два разных синтаксиса. Первый просто «А» или «М», а затем несколько секунд. Это устанавливает срок действия по отношению к последнему разу, когда контент был «доступен» или «изменен» соответственно. Например, они оба истекают через 30 секунд после обращения к нему.

ExpiresDefault A30
ExpireByType text/html A30

Другой синтаксис допускает более подробную настройку. Это позволяет вам использовать единицы измерения, отличные от секунд, которые легче вычислить людям. Также используется полное слово «доступ» или «модификация». Вся конфигурация срока действия должна храниться в кавычках, например:

ExpiresDefault "modification plus 2 weeks 3 days 1 hour"
ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

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

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html

   CacheQuickHandler off

   CacheLock on
   CacheLockPath /tmp/mod_cache-lock
   CacheLockMaxAge 5

   CacheIgnoreHeaders Set-Cookie

   <Location />
       CacheEnable disk
       CacheHeader on

       CacheDefaultExpire 600
       CacheMaxExpire 86400
       CacheLastModifiedFactor 0.5



   </Location>
</VirtualHost>

Это установит наш заголовок + Expires + в будущем на пять минут и установит + Cache-Control max-age = 300 +. Чтобы еще больше усовершенствовать нашу политику кэширования, мы можем использовать директиву + Header +. Мы можем использовать опцию + merge, чтобы добавить дополнительные опции` + Cache-Control`. Вы можете звонить по этому номеру несколько раз и добавлять любые дополнительные политики, которые вам нравятся. Посетите th guide, чтобы получить представление о политиках кэширования, которые вы хотели бы установить для вашего контента. В нашем примере мы просто установим «public», чтобы другие кэши могли быть уверены, что им разрешено хранить копии.

Чтобы установить + ETags + для статического содержимого на нашем сайте (чтобы использовать его для проверки), мы можем использовать директиву + FileETag +. Это будет работать для статического контента. Для динамически генерируемого контента ваше приложение будет отвечать за правильную генерацию + ETags +.

Мы можем использовать директиву, чтобы установить атрибуты, которые Apache будет использовать для вычисления + Etag +. Это может быть + INode +, + MTime +, + Size + или + All + в зависимости от того, хотим ли мы изменить + ETag + всякий раз, когда изменяется + inode + файла, изменяется его время изменения, его изменения размера или все вышеперечисленное. Вы можете указать более одного значения и изменить наследуемые настройки в дочерних контекстах, добавив новые настройки + или + - +. Для наших целей мы просто будем использовать «все», чтобы все изменения были зарегистрированы:

/etc/httpd/conf.d/site.conf

<VirtualHost *:80>
   ServerName
   DocumentRoot /var/www/html

   CacheQuickHandler off

   CacheLock on
   CacheLockPath /tmp/mod_cache-lock
   CacheLockMaxAge 5

   CacheIgnoreHeaders Set-Cookie

   <Location />
       CacheEnable disk
       CacheHeader on

       CacheDefaultExpire 600
       CacheMaxExpire 86400
       CacheLastModifiedFactor 0.5

       ExpiresActive on
       ExpiresDefault "access plus 5 minutes"


        All
   </Location>
</VirtualHost>

Это добавит «public» (разделенный запятой) к любому значению, которое + Cache-Control уже имеет, и будет включать` + ETag` для нашего статического содержимого.

Когда вы закончите, сохраните и закройте файл. Проверьте синтаксис ваших изменений, набрав:

sudo apachectl configtest

Если ошибок не было найдено, перезапустите службу для реализации политик кэширования:

sudo systemctl restart httpd

Заключение

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

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

Related