Кэширование · 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 /, чтобы минимальная конфигурация выглядела следующим образом:
| |
Вы можете найти объяснения для этих параметров конфигурации и дальнейшие параметры конфигурации на 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 | |
Это стандартная конфигурация - если хотите, вы можете изменить ее. Список директив конфигурации для 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 Ссылки
- Apache: http://httpd.apache.org/
- mod_cache: http://httpd.apache.org/docs/2.2/mod/mod_cache.html
- mod_disk_cache: http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
- mod_mem_cache: http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
- Руководство по кэшированию Apache: http://httpd.apache.org/docs/2.2/caching.html
- Учебник по кэшированию: http://www.mnot.net/cache_docs/
- Debian: http://www.debian.org/
Get new posts in your inbox
No spam. Unsubscribe anytime.