Кэширование контента при помощи модулей Apache

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

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

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

Примечание: Данное руководство выполнено на Apache 2.2. В Apache 2.4 некоторые модули заменены, соответственно, не все разделы руководства будут действительны для Apache 2.4.

Кэширование в Apache

Веб-сервер Apache предоставляет множество методов кэширования часто запрашиваемого контента, наиболее популярными среди которых являются модули mod_cache и mod_file_cache.

Модуль mod_file_cache

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

  • часто запрашиваемый контент;
  • контент, который редко меняется.

Если эти 2 требования выполняются, mod_file_cache будет очень полезен. Данный модуль работает путем выполнения определённых операций доступа к наиболее часто используемым файлам при запуске сервера.

Модуль mod_cache

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

Данный модуль выполняет эти операции при помощи модулей mod_mem_cache или mod_disk_cache. Эти модули сложнее, чем mod_file_cache, и потому более популярны.

Использование mod_file_cache

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

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

Модуль работает при помощи двух директив.

Директива MMapFile

MMapFile – это директива, которая используется для создания списка файлов, которые будут перенесены в память. Это делается только при запуске сервера, потому очень важно, чтобы во время работы сервера ни один из перечисленных файлов не был изменён.

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

MMapFile /var/www/index.html /var/www/otherfile.html var/www/static-image.jpg

При запросе эти файлы будут обслуживаться из памяти.

Примечание: Если один из перечисленных файлов был изменён, перезапустите сервер.

Директива CacheFile

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

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

Данная директива позволяет задать список файлов для кэширования, разделяя названия файлов пробелами.

CacheFile /this/file.html that/file.html another/file/to/server.html

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

Использование модуля mod_cache

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

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

Работа данного модуля основана на работе двух других модулей: mod_disk_cache и mod_mem_cache.

Они отличаются местом хранения кэша; первый хранит кэш на диске, второй – в памяти. Для извлечения и хранения данных используются ключи URI.

Примечание: Чтобы повысить производительность сервера, используйте CNAME (canonical name, или каноническое имя).

Для этого нужно внести в конфигурации сервера или виртуального хоста следующую директиву:

UseCanonicalName On

Настройка кэширования

В данном разделе рассматриваются общие директивы и их влияние на функционирование механизмов кэширования.

В каталоге /etc/apache2/mods-available можно найти конфигурационные файлы вышеперечисленных модулей.

Настройка mod_mem_cache

Конфигурации mod_mem_cache выглядят так:

sudo nano /etc/apache2/mods-available/mem_cache.conf
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>

Эти директивы читаются только в случае если модуль mod_mem_cache загружен. Это можно сделать, запустив:

sudo a2enmod mem_cache
sudo service apache2 restart

Это включит mod_mem_cache и mod_cache.

CacheEnable mem /

При помощи данной строки Apache создаст кэш-память для контента, который хранится в “/” (то есть, для всего контента).

Следующие несколько строк описывают общий размер кэша и объекты, которые будут храниться в нём. Оирективы MCacheSize и MCacheMaxOjectCount задают максимальный объём кэша: первая – использование памяти, вторая – максимальное количество объектов.

MCacheSize 4096
MCacheMaxObjectCount 100

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

Настройка mod_disk_cache

Конфигурационный файл mod_disk_cache выглядит так:

sudo nano /etc/apache2/mods-available/disk_cache.conf
<IfModule mod_disk_cache.c>
CacheRoot /var/cache/apache2/mod_disk_cache
#CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
</IfModule>

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

sudo a2enmod disk_cache
sudo service apache2 restart

Можно также использовать эту команду:

CacheRoot /var/cache/apache2/mod_disk_cache
#CacheEnable disk /

Директива CacheRoot задаёт местонахождение кэшированного контента. Директива CacheEnable disk / по умолчанию отключена. Её нужно включить на виртуальном хосте.

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

CacheDirLevels 5
CacheDirLength 3

Директива CacheDirLevel задаёт количество каталогов, которое нужно создать из хеш-строки; CacheDirLength задаёт количество символов в имени каждого каталога.

К примеру, на сервере есть файл с хешем “abcdefghijklmnopqrstuvwxyz”, а директивы CacheDirLevel и CacheDirLength имеют следующие значения:

CacheDirLevel 2
CacheDirLength 4

Тогда такой файл будет храниться в:

[path_of_cache_root]/abcd/efgh/ijklmnopqrstuv

Кэш, хранящийся на диске, может стать слишком объемным в зависимости от срока хранения файлов. Для сокращения кэша до заданных размеров Apache использует инструмент htcacheclean, но, к сожалению, этот вопрос выходит за рамки данной статьи.

Использование CacheLock

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

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

Избежать подобных ситуаций можно путём создания файла блокирования – lock-файла, который будет отслеживать обновление кэша и блокировать поступление запросов на бэк-энд на некоторое время.

Такой файл может предотвратить повторное кэширование объекта, а также будет поддерживать устаревшую версию данных во время обновления кэша.

CacheLock использует три директивы:
CacheLock [ On | Off ] CacheLockMaxAge [time_in_seconds] CacheLockPath [/path/to/lock/directory]

Первая директива включает эту функцию, а третья создаёт каталог для хранения lock-файлов.

Вторая директива, CacheLockMaxAge, задаёт максимальный срок действия lock-файла в секундах, что необходимо в случае возникновения ошибки или задержки при обновлении ресурсов.

Заключение

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

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

Документация Apache содержит довольно много советов по настройке кэширования.

Tags: , , , , , , ,

Добавить комментарий