Поиск по сайту:

Как настроить кэширование контента 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. Вы можете включить модуль, набрав:

  1. sudo a2enmod file_cache

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

  1. 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 для одного и того же набора файлов, но вы можете использовать оба в разных наборах. файлов.

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

  1. sudo apachectl configtest

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

  1. 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, набрав:

  1. sudo a2enmod authn_socache
  2. sudo a2enmod socache_shmcb

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

  1. 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, но вам следует изменить ее, чтобы она соответствовала вашей среде:

  1. 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, чтобы изменения кэширования вступили в силу:

  1. 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. Тип:

  1. 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 вы можете включить эти модули, набрав:

  1. sudo a2enmod cache
  2. sudo a2enmod cache_disk

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

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

  1. sudo apt-get update
  2. sudo apt-get install apache2-utils

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

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

  1. 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, которые позволяют ждать и буферизовать содержимое перед отправкой клиенту. Это может быть полезно, если содержимое находится не на этом сервере.

Изменение виртуального сервера

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

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

  1. 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>

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

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

  1. sudo apachectl configtest

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

  1. sudo service apache2 restart

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

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

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

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

  1. sudo a2enmod expires
  2. sudo a2enmod headers

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

  1. 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 для нашего статического контента.

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

  1. sudo apachectl configtest

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

  1. sudo service apache2 restart

Заключение

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

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