У меня были проблемы с запуском 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] [debug] 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"
Теперь это уже другая история. Как мне решить эту проблему, не трогая код сервера приложений?
решение1
Единственный способ заставить Apache кэшировать ответы от сервера приложений — это добавить заголовки, которые Apache запрашивал в журнале, к ответам. Это оказалось довольно просто, если создать фильтр JAX-RS.
Поэтому после добавления Last-Modified и заголовка Expires единственное, что нужно было сделать, это добавить следующие две строки в конфигурацию Apache.
CacheRoot "/var/cache/apache2/"
CacheEnable disk /
решение2
похожий на
Cache-Control:s-maxage=1200
решил эту проблему