Как настроить кэширование контента Apache в Ubuntu 14.04
Что такое кэширование?
Кэширование — это метод повышения производительности сервера, позволяющий временно хранить часто запрашиваемый контент таким образом, чтобы обеспечить более быстрый доступ. Это ускоряет обработку и доставку за счет исключения некоторых ресурсоемких операций.
Создавая эффективные правила кэширования, содержимое, подходящее для кэширования, будет сохраняться для улучшения времени отклика, экономии ресурсов и минимизации нагрузки. Apache предоставляет множество кэшей, подходящих для ускорения различных типов операций. В этом руководстве мы обсудим, как настроить Apache 2.4 в Ubuntu 14.04, используя его различные модули кэширования.
Чтобы узнать больше о разработке общих стратегий кэширования, ознакомьтесь с этой статьей.
Введение в кэширование в 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
. Эта директива принимает список путей к файлам, разделенных пробелами, например:
CacheFile /var/www/html/index.html /var/www/html/somefile.index
При перезапуске сервера Apache откроет перечисленные файлы и сохранит их дескрипторы файлов в кеше для более быстрого доступа.
Если вместо этого вы хотите отобразить несколько файлов непосредственно в память, вы можете использовать директиву MMapFile
. Ее синтаксис в основном такой же, как и у последней директивы, поскольку она просто принимает список путей к файлам:
MMapFile /var/www/html/index.html /var/www/html/somefile.index
На практике нет причин настраивать оба CacheFile
и MMapFile
для одного и того же набора файлов, но вы можете использовать оба в разных наборах. файлов.
Когда вы закончите, вы можете сохранить и закрыть файлы. Проверьте синтаксис файла конфигурации, набрав:
- sudo apachectl configtest
Если в последней строке указано Синтаксис в порядке
, вы можете безопасно перезапустить свой экземпляр 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.
В настоящее время существуют некоторые проблемы с каждым поставщиком кэша общих объектов. Ссылки на вопросы будут изложены ниже. Примите это во внимание при оценке необходимости включения этой функции.
Фактическое кэширование осуществляется с помощью одного из модулей поставщика кэширования общих объектов. Это:
mod_socache_dbm
: этот бэкэнд использует простой движок базы данныхdbm
, который представляет собой хранилище ключей и значений на основе файлов, использующее хэширование и сегменты фиксированного размера. Этот провайдер страдает от некоторых утечек памяти, поэтому в большинстве случаев вместо него рекомендуется использоватьmod_socache_shmcb
.mod_socache_dc
: этот провайдер использует программное обеспечение для кэширования сеансов distcache. Этот проект не обновлялся с 2004 года и даже не упакован для некоторых дистрибутивов, поэтому используйте его с осторожностью.mod_socache_memcache
: использует кэш объектов распределенной памяти memcache для хранения элементов. Это лучший вариант для распределенного кэша между несколькими серверами. В настоящее время срок действия записей не истекает должным образом, но в ствол системы управления версиями Apache было внесено исправление, которое устраняет эту проблему.mod_socache_shmcb
: в настоящее время это лучший вариант для кэширования ключ-значение. Это кэширует циклический буфер в разделяемой памяти, который будет удалять записи по мере заполнения. В настоящее время он блокируется записями размером более 11 КБ.
Наряду с вышеуказанными модулями провайдера потребуются дополнительные модули в зависимости от кэшируемых объектов. Например, для кэширования сеансов SSL или настройки сшивания SSL необходимо включить mod_ssl
, что обеспечит директивы SSLSessionCache
и SSLStaplingCache
соответственно. Аналогичным образом, для настройки кэширования аутентификации необходимо включить модуль mod_authn_socache
, чтобы можно было установить директиву AuthnCacheSOCache
.
Как включить кэширование ключ-значение
С учетом вышеуказанных ошибок и предостережений, если вы все еще хотите настроить этот тип кэширования в Apache, следуйте инструкциям ниже.
Метод, используемый для настройки кеша ключ-значение, будет зависеть от того, для чего он будет использоваться и какой поставщик вы используете. Ниже мы рассмотрим основы кэширования аутентификации и кэширования сеансов SSL.
В настоящее время существует ошибка кэширования аутентификации, которая не позволяет передавать аргументы поставщику кэша. Таким образом, любые поставщики, которые не предоставляют настройки по умолчанию, будут иметь проблемы.
Кэширование аутентификации
Кэширование аутентификации полезно, если вы используете дорогостоящий метод аутентификации, такой как 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 килобайт:
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
перед вашим обычным методом аутентификации. Результаты будут выглядеть примерно так:
<VirtualHost *:80>
. . .
<Directory /var/www/html/private>
AuthType Basic
AuthName "Restricted Files"
AuthBasicProvider socache file
AuthUserFile /etc/apache2/.htpasswd
AuthnCacheProvideFor file
AuthnCacheTimeout 300
Require valid-user
</Directory>
</VirtualHost>
Приведенный выше пример относится к аутентификации файлов, которая, вероятно, не сильно выиграет от кэширования. Однако реализация должна быть очень похожей при использовании других методов аутентификации. Единственная существенная разница будет заключаться в том, что там, где в приведенном выше примере указана спецификация «файл», вместо нее будет использоваться другой метод аутентификации.
Сохраните и закройте файл. Перезапустите Apache, чтобы изменения кэширования вступили в силу:
- sudo service apache2 restart
Кэширование сеансов SSL
Рукопожатие, которое должно быть выполнено для установления SSL-соединения, сопряжено со значительными накладными расходами. Таким образом, кэширование данных сеанса, чтобы избежать этого шага инициализации для дальнейших запросов, потенциально может обойти это наказание. Кэш общих объектов — идеальное место для этого.
Если у вас уже настроен SSL для вашего сервера Apache, mod_ssl
будет включен. В Ubuntu это означает, что файл ssl.conf
был перемещен в каталог /etc/apache2/mods-enabled
. На самом деле это уже настраивает кэширование. Внутри вы увидите такие строки:
. . .
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 поощряет и предоставляет механизмы для кэширования ответов на всем пути доставки контента. Любой компьютер, который касается контента, потенциально может кэшировать каждый элемент в течение определенного периода времени в зависимости от политик кэширования, установленных в источниках контента, и собственных правил кэширования компьютера.
Механизм кэширования HTTP Apache кэширует ответы в соответствии с политиками кэширования HTTP, которые он видит. Это система кэширования общего назначения, которая придерживается тех же правил, что и любой промежуточный сервер, участвующий в доставке. Это делает эту систему очень гибкой и мощной и позволяет вам использовать заголовки, которые вы уже должны установить для своего контента (ниже мы расскажем, как это сделать).
HTTP-кэш Apache также известен как кеш с тремя состояниями. Это связано с тем, что хранимый в нем контент может находиться в одном из трех состояний. он может быть устаревшим, что означает, что срок жизни содержимого истек, или может отсутствовать, если содержимое не найдено в кэше.
Если содержимое устаревает, при следующем запросе кеш может перепроверить его, проверив содержимое в источнике. Если он не изменился, он может сбросить дату обновления и обслуживать текущий контент. В противном случае он извлекает измененное содержимое и сохраняет его в течение времени, разрешенного его политикой кэширования.
Обзор модуля
Логика кэширования 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 даже не будет оценивать директивы внутри блоков
или
. Обратите внимание, что CacheQuickHandler
по умолчанию включен!
Если для параметра CacheQuickHandler
установлено значение «выключено», кеш будет проверяться значительно позже в последовательности обработки запроса. Думайте об этой конфигурации как о размещении кеша между вашей логикой обработки Apache и вашим фактическим содержимым. Это позволит запускать обычные директивы обработки перед извлечением содержимого из кэша. Установка этого параметра в положение «выкл.» жертвует немного скоростью для возможности более глубокой обработки запросов.
Как настроить стандартное кэширование 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
После удаления комментариев файл должен выглядеть так:
<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
. Обычно вам не нужно изменять эти значения, но полезно знать, для чего они используются.
Если вы решите изменить значение CacheRoot
, вам придется открыть файл /etc/default/apache2
и изменить значение HTCACHECLEAN_PATH
чтобы соответствовать вашему выбору. Это используется для регулярной очистки кеша, поэтому он должен иметь правильное расположение кеша.
Некоторые другие значения, которые вы можете установить в этом файле, это CacheMaxFileSize
и CacheMinFileSize
, которые устанавливают диапазоны размеров файлов в байтах, которые Apache будет передавать в кеш, а также CacheReadSize
и CacheReadTime
, которые позволяют ждать и буферизовать содержимое перед отправкой клиенту. Это может быть полезно, если содержимое находится не на этом сервере.
Изменение виртуального сервера
Большая часть конфигурации кэширования будет выполняться на более детальном уровне либо в определении виртуального хоста, либо в конкретном блоке расположения.
Откройте один из файлов вашего виртуального хоста, чтобы продолжить. Мы предполагаем, что в этом руководстве вы используете файл по умолчанию:
- sudo nano /etc/apache2/sites-enabled
В блоке виртуального хоста, вне любого блока местоположения, мы можем начать настройку некоторых свойств кэширования. В этом руководстве мы предполагаем, что хотим отключить CacheQuickHandler
, чтобы выполнить дополнительную обработку. Это позволяет нам составить более полные правила кэширования.
Мы также воспользуемся этой возможностью, чтобы настроить блокировку кеша. Это система блокировок файлов, которую Apache будет использовать при проверке источника контента, чтобы убедиться, что контент все еще действителен. Если во время выполнения этого запроса поступят дополнительные запросы на тот же контент, это приведет к дополнительным запросам к серверному ресурсу, что может вызвать скачки нагрузки.
Установка блокировки кеша для ресурса во время проверки сообщает Apache, что ресурс в настоящее время обновляется. В течение этого времени устаревший ресурс может обслуживаться с предупреждающим заголовком, указывающим его состояние. Мы настроим это с помощью каталога блокировки кеша в папке /tmp
. Мы разрешаем максимум 5 секунд, чтобы блокировка считалась действительной. Эти примеры взяты непосредственно из документации Apache, поэтому они должны подойти для наших целей.
Мы также укажем Apache игнорировать заголовки Set-Cookie
и не сохранять их в кеше. Это предотвратит случайную утечку Apache пользовательских файлов cookie другим сторонам. Заголовок Set-Cookie
будет удален до того, как заголовки будут кэшированы.
<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>
Нам все еще нужно включить кэширование для этого виртуального хоста. Мы можем сделать это с помощью директивы CacheEnable
. Если это установлено в блоке виртуального хоста, нам нужно будет указать метод кэширования (disk
или socache
), а также запрошенные URI, которые следует кэшировать. Например, для кэширования всех ответов можно установить значение CacheEnable disk /
, но если вы хотите кэшировать только ответы с URI /public
, вы можете установить значение CacheEnable disk /public
.
Мы пойдем другим путем, включив наш кеш в определенном блоке местоположения. Это означает, что нам не нужно указывать путь URI для команды CacheEnable
. Любой URI, который будет обслуживаться из этого места, будет кэширован. Мы также включим директиву CacheHeader
, чтобы заголовки наших ответов указывали, использовался ли кеш для обслуживания запроса или нет.
Еще одна директива, которую мы установим, это CacheDefaultExpire
, чтобы мы могли установить срок действия (в секундах), если ни заголовки Expires
, ни Last-Modified
устанавливаются на содержание. Точно так же мы установим CacheMaxExpire
, чтобы ограничить время сохранения элементов. Мы установим CacheLastModifiedFactor
, чтобы Apache мог создать дату истечения срока действия, если у него есть дата Last-Modified
, но нет срока действия. Коэффициент умножается на время, прошедшее с момента модификации, чтобы установить разумный срок действия.
<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>
Сохраните и закройте файл, когда вы настроите все, что вам нужно.
Проверьте всю конфигурацию на наличие синтаксических ошибок, набрав:
- 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 к правильным значениям.
Эти две настройки могут иметь два разных синтаксиса. Первый — это просто \A или \M, за которым следует количество секунд. Это устанавливает срок действия по отношению к последнему времени, когда содержимое было «доступно» или «модифицировано» соответственно. Например, в обоих случаях срок действия контента истекает через 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 минут, чтобы, если мы допустим ошибку при знакомстве, она не сохранялась на компьютерах наших клиентов в течение очень долгого времени. Когда мы будем более уверены в своей способности выбирать политики, подходящие для нашего контента, мы можем изменить это на что-то более агрессивное:
<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"
</Location>
</VirtualHost>
Это установит для заголовка Expires
пять минут в будущем и установит Cache-Control max-age=300
. Чтобы еще больше уточнить нашу политику кэширования, мы можем использовать директиву Header
. Мы можем использовать параметр merge
, чтобы добавить дополнительные параметры Cache-Control
. Вы можете вызывать это несколько раз и добавлять любые дополнительные политики, которые хотите. Ознакомьтесь с этим руководством, чтобы получить представление о политиках кэширования, которые вы хотите установить для своего контента. В нашем примере мы просто установим \public, чтобы другие кэши могли быть уверены, что им разрешено хранить копии.
Чтобы установить ETags
для статического контента на нашем сайте (используемого для проверки), мы можем использовать директиву FileETag
. Это будет работать для статического контента. Для динамически генерируемого контента ваше приложение будет нести ответственность за правильную генерацию ETags
.
Мы используем директиву для установки атрибутов, которые Apache будет использовать для вычисления Etag
. Это может быть INode
, MTime
, Size
или All
в зависимости от того, хотим ли мы изменить ETag
всякий раз, когда изменяется inode
файла, изменяется время его модификации, изменяется его размер или все вышеперечисленное. Вы можете указать более одного значения и изменить унаследованный параметр в дочерних контекстах, поставив перед новыми параметрами знак +
или -
. Для наших целей мы просто будем использовать «все», чтобы все изменения были зарегистрированы:
<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"
Header merge Cache-Control public
FileETag All
</Location>
</VirtualHost>
Это добавит \public (через запятую) к любому уже имеющемуся значению Cache-Control
и будет включать ETag
для нашего статического контента.
Когда вы закончите, сохраните и закройте файл. Проверьте синтаксис ваших изменений, набрав:
- sudo apachectl configtest
Если ошибок не обнаружено, перезапустите службу, чтобы реализовать политики кэширования:
- sudo service apache2 restart
Заключение
Настройка кэширования с помощью Apache может показаться сложной задачей из-за большого количества опций. К счастью, легко начать с простого, а затем расширять его по мере необходимости. Большинству администраторов не требуется каждый из типов кэширования.
При настройке кэширования помните о конкретных проблемах, которые вы пытаетесь решить, чтобы не потеряться в различных вариантах реализации. Большинству пользователей будет полезно хотя бы настроить заголовки. Если вы проксируете или генерируете контент, может быть полезна настройка HTTP-кэша. Кэширование общих объектов полезно для определенных задач, таких как хранение сеансов SSL или сведений об аутентификации, если вы используете бэкэнд-провайдера. Кэширование файлов, вероятно, может быть ограничено теми, у кого медленные системы.