Назад | Перейти на главную страницу

Кэширование строк запроса в прокси-сервере Apache

У меня были проблемы с работой 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 /