Как настроить кэширование контента Apache в Ubuntu 14.04

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

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

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

Чтобы узнать больше о разработке общих стратегий кэширования, ознакомьтесь с 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 +. Чтобы использовать эту функцию, вам необходимо включить модуль.

При запуске Ubuntu 14.04 модуль будет установлен, но отключен при установке Apache. Вы можете включить модуль, набрав:

sudo a2enmod file_cache

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

sudo nano /etc/apache2/apache2.conf

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

файл /etc/apache2/apache2.conf

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

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

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

файл /etc/apache2/apache2.conf

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

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

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

sudo apachectl configtest

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

sudo service apache2 restart

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 для вашей демонстрации.

Сначала включите модуль + authn_socache + и модуль поставщика + mod_socache_shmcb +, набрав:

sudo a2enmod authn_socache
sudo a2enmod socache_shmcb

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

sudo nano /etc/apache2/apache2.conf

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

файл /etc/apache2/apache2.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)

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

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

sudo nano /etc/apache2/sites-enabled/000-default.conf

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

/etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>

   . . .

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


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

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

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

sudo service apache2 restart
Кеширование SSL-сессии

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

Если у вас уже настроен SSL для вашего сервера Apache, + mod_ssl + будет включен. В Ubuntu это означает, что файл + ssl.conf + был перемещен в каталог + / etc / apache2 / mods-enabled +. Это на самом деле уже настраивает кеширование. Внутри вы увидите несколько таких строк:

/etc/apache2/mods-enabled/ssl.conf

. . .

SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(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 + хорошо протестирован, поэтому мы будем полагаться на это.

Включение модулей

В системе Ubuntu вы можете включить эти модули, набрав:

sudo a2enmod cache
sudo a2enmod cache_disk

Это включит функцию кэширования при следующем перезапуске сервера.

Вам также необходимо установить пакет + apache2-utils +, который содержит утилиту + htcacheclean +, используемую для очистки кеша при необходимости. Вы можете установить это, набрав:

sudo apt-get update
sudo apt-get install apache2-utils
Изменение глобальной конфигурации

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

sudo nano /etc/apache2/mods-enabled/cache_disk.conf

После удаления комментариев файл должен выглядеть следующим образом:

/etc/apache2/mods-enabled/cache_disk.conf

<IfModule mod_cache_disk.c>
   CacheRoot /var/cache/apache2/mod_cache_disk
   CacheDirLevels 2
   CacheDirLength 1
</IfModule>

Оболочка + IfModule + заставляет Apache беспокоиться об этих директивах только в том случае, если включен модуль + mod_cache_disk +. Директива + CacheRoot + указывает место на диске, где будет храниться кеш. + CacheDirLevels + и + CacheDirLength + вносят вклад в определение того, как будет строиться структура каталогов кэша.

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

Note

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

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

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

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

sudo nano /etc/apache2/sites-enabled

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

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

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

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

/etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined








</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/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   CacheQuickHandler off

   CacheLock on
   CacheLockPath /tmp/mod_cache-lock
   CacheLockMaxAge 5

   CacheIgnoreHeaders Set-Cookie









</VirtualHost>

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

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

sudo apachectl configtest

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

sudo service apache2 restart

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

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

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

Мы можем включить оба этих модуля, набрав:

sudo a2enmod expires
sudo a2enmod headers

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

sudo nano /etc/apache2/sites-enabled/000-default.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/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   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/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined

   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 service apache2 restart

Заключение

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

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

Related