У меня были проблемы с работой disk_cache, и я не мог понять, почему. Это был соответствующий раздел моей конфигурации
# Caching
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
Я рассчитывал запрос, такой как следующий, но кеширование, похоже, не сработало, поскольку ответ использовал 7 секунд, несмотря ни на что.
time curl -k https://customer1.myhosts.com/appserver/slow_request?param1=fooBar
После включения ведения журнала отладки я обнаружил в журналах следующее утверждение, объясняющее, почему не было выполнено кеширование:
[Пт, 24 августа, 17:22:01 2012] [отладка] mod_cache.c (552): кеш: не кэшируется. Причина: присутствует строка запроса, но нет явного срока действия
Оказывается, это упоминается в руководстве по кешированию Apache:
Если URL-адрес включал строку запроса (например, из метода GET HTML-формы), он не будет кэшироваться, если в ответе не указано явное истечение срока действия путем включения заголовка «Expires:» или директивы max-age или s-maxage в «Cache -Control: "заголовок согласно разделам 13.9 и 13.2.1 RFC2616.
Хорошо, поэтому я добавляю следующее (взято из Эта статья) в Apache
Header set Cache-Control "max-age=290304000"
Это все еще не работает, на этот раз я получаю сообщение
"... не кэшируется. Причина: нет заголовков Last-Modified, Etag или Expires"
Теперь это другая история. Как я могу решить эту проблему, не касаясь кода сервера приложений?
Единственный способ заставить Apache кэшировать ответы от сервера приложений - это фактическое добавление заголовков, которые Apache запрашивал в журнале, к ответам. Создать фильтр JAX-RS оказалось довольно просто.
Итак, после добавления заголовков Last-Modified и Expires единственное, что потребовалось, - это следующие две строки в моей конфигурации apache.
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
похожий на
Cache-Control:s-maxage=1200
решил эту проблему