Кэширование · 5 min read · Dec 28, 2025

Кэширование с помощью mod_cache Apache на Debian Lenny

Кэширование с помощью mod_cache Apache на Debian Lenny

Версия 1.0
Автор: Фалко Тимме
Следите за мной в Twitter

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

Я не даю никаких гарантий, что это будет работать для вас!

1 Предварительная заметка

Я предполагаю, что у вас есть рабочая установка Apache2 (Apache 2.2.x - до этой версии mod_cache считается экспериментальным) из репозиториев Debian - версия Apache в репозиториях Debian Lenny - 2.2.9, так что вы должны быть готовы к работе.

Я использую корневую папку /var/www здесь для моего тестового виртуального хоста - вам нужно будет настроить это, если ваша корневая папка отличается.

2 Включение mod_cache

mod_cache имеет два подсистемы, которые управляют хранилищем кэша, mod_disk_cache (для хранения содержимого на жестком диске) и mod_mem_cache (для хранения содержимого в памяти, что быстрее, чем кэширование на диске). Решите, какой из них вы хотите использовать, и продолжайте либо с главы 2.1 (mod_disk_cache), либо 2.2 (mod_mem_cache).

2.1 mod_disk_cache

Конфигурация mod_disk_cache хранится в /etc/apache2/mods-available/disk_cache.conf, так что давайте отредактируем этот файл:

vi /etc/apache2/mods-available/disk_cache.conf

Убедитесь, что вы раскомментировали строку CacheEnable disk /, чтобы минимальная конфигурация выглядела следующим образом:

| # очистка кэша выполняется с помощью htcacheclean, который можно настроить в # /etc/default/apache2 # # Для получения дополнительной информации смотрите комментарии в этом файле, # /usr/share/doc/apache2.2-common/README.Debian и страницу man htcacheclean(8). # Этот путь должен совпадать с тем, что в /etc/default/apache2 CacheRoot /var/cache/apache2/mod_disk_cache # Это также будет кэшировать локальные документы. Обычно имеет больше смысла # поместить это в конфигурацию только для одного виртуального хоста. CacheEnable disk / CacheDirLevels 5 CacheDirLength 3 |

Вы можете найти объяснения для этих параметров конфигурации и дальнейшие параметры конфигурации на http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html.

Теперь мы можем включить mod_cache и mod_disk_cache:

a2enmod cache
a2enmod disk_cache

/etc/init.d/apache2 restart 

Чтобы убедиться, что наш кэшированный каталог /var/cache/apache2/mod_disk_cache не заполняется со временем, мы должны очищать его с помощью команды htcacheclean. Эта команда является частью пакета apache2-utils, который мы устанавливаем следующим образом:

aptitude install apache2-utils 

После этого мы можем запустить htcacheclean как демон следующим образом:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

Это будет очищать наш кэшированный каталог каждые 30 минут и гарантировать, что он не станет больше 100 МБ. Чтобы узнать больше о htcacheclean, посмотрите на

man htcacheclean

Конечно, вы не хотите запускать htcacheclean вручную каждый раз, когда перезагружаете сервер - поэтому мы редактируем /etc/rc.local…

vi /etc/rc.local

… и добавляем следующую строку перед строкой exit 0:

| [...] /usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i [...] |

Это будет автоматически запускать htcacheclean каждый раз, когда вы запускаете сервер.

2.2 mod_mem_cache

Конфигурация mod_mem_cache находится в /etc/apache2/mods-available/mem_cache.conf:

vi /etc/apache2/mods-available/mem_cache.conf   

| CacheEnable mem / MCacheSize 4096 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 2048 |

Это стандартная конфигурация - если хотите, вы можете изменить ее. Список директив конфигурации для mod_mem_cache доступен здесь: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

Теперь давайте включим mod_cache и mod_mem_cache следующим образом:

a2enmod cache
a2enmod mem_cache

/etc/init.d/apache2 restart

Вот и все! С mod_mem_cache вам не нужно очищать никакие кэшированные каталоги.

3 Тестирование

К сожалению, mod_cache не предоставляет никаких функций ведения журналов, что плохо, если вы хотите знать, работает ли ведение журналов. Поэтому я создаю небольшой тестовый файл PHP, /var/www/cachetest.php, который отправляет HTTP-заголовки, которые говорят mod_cache, что он должен кэшировать файл в течение 300 секунд, и просто выводит временную метку:

vi /var/www/cachetest.php

| "; ?> |

Теперь вызовите этот файл в браузере - он должен отобразить текущую временную метку. Затем нажмите в адресной строке браузера и нажмите ENTER, чтобы страница загрузилась снова (не нажимайте F5 или кнопку обновления - это всегда будет получать свежую копию с сервера вместо кэша!) - если все пройдет хорошо, вы все еще должны увидеть старую, кэшированную временную метку. Если вы подождете 300 секунд, вы должны получить свежую копию с сервера вместо кэша.

4 HTTP Заголовки

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

Вот несколько примеров заголовков, которые говорят mod_cache не кэшировать:

  • Заголовки Expires с датой в прошлом: “Expires: Sun, 19 Nov 1978 05:00:00 GMT”
  • Некоторые заголовки Cache-Control: “Cache-Control: no-store, no-cache, must-revalidate” или “Cache-Control: must-revalidate, max-age=0”
  • Заголовки Set-Cookie: страница не будет кэшироваться, если установлен cookie.

Итак, если вы хотите, чтобы mod_cache кэшировал ваши страницы, измените ваше приложение, чтобы не отправлять такие заголовки.

Если вы хотите, чтобы mod_cache кэшировал ваши страницы, вы можете установить заголовок Expires с датой в будущем, но рекомендуемый способ - использовать max-age:

"Cache-Control: must-revalidate, max-age=300"

Это говорит mod_cache кэшировать страницу в течение 300 секунд (max-age) - к сожалению, mod_cache не знает опцию s-maxage (см. http://www.mnot.net/cache_docs/#CACHE-CONTROL), поэтому мы должны использовать опцию max-age (которая также говорит вашему браузеру кэшировать - пожалуйста, имейте это в виду, если вы получите неожиданные результаты!). Если бы mod_cache знал опцию s-maxage, мы могли бы использовать “Cache-Control: must-revalidate, max-age=0, s-maxage=300”, что сказало бы mod_cache, но не браузеру, кэшировать страницу.

Конечно, этот заголовок бесполезен, если вы одновременно отправляете один из заголовков, не кэшируемых (Expires в прошлом, Set-Cookie и т.д.)!

Еще один очень важный заголовок для кэширования - это:

"Vary: Accept-Encoding"

Это заставляет mod_cache хранить две копии каждой кэшированной страницы, одну сжатую (gzip) и одну несжатую, чтобы он мог предоставить правильную версию в зависимости от возможностей user-agent/браузера. Некоторые user-agents не понимают сжатие gzip, поэтому они должны получать несжатую версию.

Итак, вот резюме: используйте следующие два заголовка, если вы хотите, чтобы mod_cache кэшировал:

“Cache-Control: must-revalidate, max-age=300”
“Vary: Accept-Encoding”

и убедитесь, что не отправляются заголовки Expires с датой в прошлом, cookies и т.д.

Если ваше приложение написано на PHP, вы можете использовать функцию header() PHP для отправки HTTP-заголовков, например, так:

header(“Cache-Control: must-revalidate, max-age=300”);
header(“Vary: Accept-Encoding”);

Эта страница обязательна для прочтения, если вы хотите узнать больше о HTTP-заголовках и кэшировании: http://www.mnot.net/cache_docs/

5 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.