Кэширование · 2 min read · Jan 01, 2026

Кэширование с помощью mod_cache Apache на Debian Etch - Страница 2

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 force-reload

Вот и всё! С 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.