Как mod_cache работает с "must-revalidate" и "max-age"?

Быстрый вопрос, прежде чем я объясню свой поток: может ли mod_cache выполнить повторную проверку с if-none-match только если истек максимальный возраст в случае, если он настроен в режиме обратного прокси?

Моя цель - уменьшить количество запросов на повторную проверку на нашем исходном сервере.

Например: первый запрос отправляется на исходный сервер, а затем mod_cache сохраняет ответ в кэш согласно заголовку cache-control: max-age. И только когда истечет максимальный возраст, mod_cache будет повторно проверен с if-none-match.

В настоящее время mod_cache повторно проверяет каждый запрос, независимо от того, определен ли максимальный возраст или нет.

Моя конфигурация Apache 2.4.3 (Windows), на Linux я вижу то же поведение, которое я покажу ниже.

    
   ServerName proxy.lo
   ProxyRequests Off    
   ProxyPreserveHost Off

   Набор заголовков Vary "Accept, Content-Type, Content-Encoding, Accept-Language"

   RequestHeader set X-Forwarded-Proto "http"

   # изменить заголовок для пользовательского агента
   Заголовок установлен Cache-Control "частный, без кеша, без хранилища, без преобразования"

   CacheQuickHandler выключен

   CacheDefaultExpire 300

   # исходный сервер не предоставляет последнее изменение
   CacheIgnoreNoLastMod On
   CacheIgnoreCacheControl On

   # исходный сервер определяет контроль кеша: приватный, без хранилища только для пользовательских агентов
   # Поэтому я хотел бы игнорировать эти заголовки на прокси-сервере.
   CacheStorePrivate On
   CacheStoreNoStore On

   CacheEnable диск /
   CacheRoot "C: /Apache.Cache" 
   CacheDirLevels 5
   CacheDirLength 4 

   CacheMinExpire 15

   CacheDetailHeader на
   CacheHeader включен

   KeepAlive Off

   ProxyPass / http: //origin.lo/
   ProxyPassReverse / http: //origin.lo/

Кроме того, я включил уровень журнала отладки, чтобы увидеть, как mod_cache обрабатывает контент для кэширования: я предоставил это, чтобы показать, что mod_proxy всегда решает, что контент не свежий. Почему? Я предоставил это, чтобы показать, что mod_proxy всегда решает, что контент не свежий. Зачем? максимальный возраст был предоставлен (см. ниже).

[Sun Nov 11 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(624): [клиент 192.168.1.100:63741] AH00698: cache: ключ для объекта / тестовой страницы?(Ноль)) это http://proxy.lo/testpage?
[Sun Nov 11 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(569): [клиент 192.168.1.100:63741] AH00709: вызван заголовок кэшированной информации URL-адреса http: // proxy.lo / тестовая страница?
[Sun Nov 11 11:58:42.899890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(865): [клиент 192.168.1.100:63741] AH00720: вызванные заголовки для URL http://proxy. вот / тестовая страница?
[Sun Nov 11 11:58:42.899890 2012] [cache:debug] [pid 6492:tid 1400] cache_storage.c(320): [client 192.168.1.100:63741] AH00695: Кэшированный ответ для / testpage не свежий. Добавление / замена заголовков условных запросов.
[Sun Nov 11 11: 58: 42.899890 2012] [кеш: отладка] [pid 6492:tid 1400] mod_cache.c(414): [клиент 192.168.1.100:63741] AH00757: добавление фильтра CACHE_SAVE для /testpage
[Sun Nov 11 11: 58: 42.899890 2012] [кеш: отладка] [pid 6492:tid 1400] mod_cache.c(448): [клиент 192.168.1.100:63741] AH00759: добавление фильтра CACHE_REMOVE_URL для /testpage
[Sun Nov 04 11:58:42.899890 2012] [прокси: отладка] [pid 6492:tid 1400] mod_proxy.c(1068): [клиент 192.168.1.100:63741] AH01143: Запуск обработчика http схемы (попытка 0)
[Sun Nov 11 11: 58: 42.899890 2012] [прокси: отладка] [pid 6492:tid 1400] proxy_util.c(1976): AH00942: HTTP: получено соединение для (origin.lo)
[Sun Nov 11 11: 58: 42.899890 2012] [прокси: отладка] [pid 6492:tid 1400] proxy_util.c(2029): [клиент 192.168.1.100:63741] AH00944: подключение http: //origin.lo/testpage к origin.lo:80
[Sun Nov 11 11:58:42.901890 2012] [прокси: отладка] [pid 6492:tid 1400] proxy_util.c(2151): [клиент 192.168.1.100:63741] AH00947: подключен / тестовая страница к origin.lo:80
[Sun Nov 11 11:58:42.901890 2012] [прокси: отладка] [pid 6492:tid 1400] proxy_util.c(2554): AH00962: HTTP: соединение установлено с 192.168.1.100:80 (origin.lo)
[Sun Nov 11 11:58:42.903890 2012] [прокси: отладка] [pid 6492:tid 1400] proxy_util.c(1991): AH00943: http: освободил соединение для (origin.lo)
[Sun Nov 11 11:58:42.903890 2012] [headers:debug] [pid 6492:tid 1400] mod_headers.c(800): AH01502: заголовки: ap_headers_output_filter()
[Sun Nov 11 11:58:42.903890 2012] [кеш: отладка] [pid 6492:tid 1400] mod_cache.c(1190): [клиент 192.168.1.100:63741] AH00769: кеш: URL-адрес кэширования: /testpage
[Sun Nov 11 11:58:42.903890 2012] [кеш: отладка] [pid 6492:tid 1400] mod_cache.c(1196): [клиент 192.168.1.100:63741] AH00770: кеш: удаление фильтра CACHE_REMOVE_URL.
[Sun Nov 11 11:58:42.904890 2012] [cache_disk:debug] [pid 6492:tid 1400] mod_cache_disk.c(1318): [клиент 192.168.1.100:63741] AH00737: commit_entity: заголовки и тело для URL http://proxy.lo/testpage? кэшируются.

Первый запрос к серверу происхождения без mod_proxy к http://origin.lo/

ПОЛУЧИТЕ http://origin.lo/testpage HTTP/1.1
Хост: origin.lo
Подключение: keep-alive
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, как Gecko) Chrome/22.0.1229.94 Safari/537.4
Принять: приложение / JSON
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0,8
Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,3

Первый ответ от источника без mod_proxy

HTTP / 1.1 200 ОК
Cache-Control: обязательно повторная проверка, прокси-проверка, максимальный возраст =30
Тип контента: приложение / JSON; кодировка = UTF-8
ETag: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Сервер: Microsoft-IIS/7.5
X-AspNet-версия: 4.0.30319
X-Powered-By: ASP.NET
Дата: вс, 04 ноября 2012 10:11:01 GMT
Длина контента: 1877

Итак, я предположил, что повторная проверка должна произойти только через 30 секунд после успешного ответа. Не так ли?

Давайте проверим это:)

В течение 30 секунд Google Chrome не выполнял никаких запросов к исходному серверу для повторной проверки запроса и возвращает ответ из локального кэша.

Когда максимальный возраст истек, Google Chrome выполняет запрос на повторную проверку:

ПОЛУЧИТЕ http://origin.lo/testpage HTTP/1.1
Хост: origin.lo
Подключение: keep-alive
Cache-Control: max-age=0
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, как Gecko) Chrome/22.0.1229.94 Safari/537.4
Принять: application/xml
If-None-Match: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0,8
Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,3

и ответ:

HTTP / 1.1 304 не изменен
Cache-Control: обязательно повторная проверка, прокси-проверка, максимальный возраст =30
ETag: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Сервер: Microsoft-IIS/7.5
X-AspNet-версия: 4.0.30319
X-Powered-By: ASP.NET
Дата: вс, 04 ноя 2012 10:16:20 GMT

Как видите, все работает как положено. Пользовательский агент повторно проверяет запрос только по истечении максимального срока.

Давайте теперь попробуем выполнить фоллинг поток через mod_proxy (см. Конфигурацию выше).

Первый запрос:

ПОЛУЧИТЕ http://proxy.lo/testpage HTTP/1.1
Хост: proxy.lo
Подключение: keep-alive
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, как Gecko) Chrome/22.0.1229.94 Safari/537.4
Принять: приложение / JSON
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0,8
Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,3

и ответ был:

HTTP / 1.1 200 ОК
Дата: вс, 04 ноя 2012 10:23:36 GMT
Сервер: Apache
Cache-Control: приватный, без кеша, без хранилища, без преобразования
Тип контента: приложение / JSON; кодировка = UTF-8
ETag: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Длина контента: 1932
Варьируется: Accept,Content-Type,Content-Encoding,Accept-Language
X-Cache: MISS от proxy.lo
X-Cache-Detail: "ошибка кэша: попытка сохранения объекта" из proxy.lo
Подключение: закрыть

Хорошо, давайте посмотрим на дисковый кеш и попробуем посмотреть, как хранились запрос и ответ. (Я вырезал двоичные данные)

Http://proxy.lo/testpage?
Cache-Control: приватный, без кеша, без хранилища, без преобразования
Тип контента: приложение / JSON; кодировка = UTF-8
ETag: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Дата: вс, 04 ноя 2012 10:27:15 GMT
Длина контента: 1932
Варьируется: Accept, Content-Type, Content-Encoding, Accept-Language

Хост: proxy.lo
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, как Gecko) Chrome/22.0.1229.94 Safari/537.4
Принять: приложение / JSON
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0,8
Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,3
X-Forwarded-Proto: http
Cache-Control: max-age=300, необходимо подтвердить
X-Forwarded-For: 192.168.1.100
X-Forwarded-Host: proxy.lo
X-Forwarded-Server: origin.lo

Хорошо, что мы видим? Мы видим, что первый запрос был выполнен с max-age=300 & must-revalidate

Хорошо, выглядит хорошо, как по мне, давайте выполним следующий вызов:

ПОЛУЧИТЕ http://proxy.lo/testpage HTTP/1.1
Хост: proxy.lo
Подключение: keep-alive
Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, как Gecko) Chrome/22.0.1229.94 Safari/537.4
Принять: приложение / JSON
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0,8
Accept-Charset: ISO-8859-1,utf-8;q=0,7,*;q=0,3

и второй ответ от mod_proxy:

HTTP / 1.1 200 ОК
Дата: вс, 04 ноя 2012 10:31:58 GMT
Сервер: Apache
Cache-Control: приватный, без кеша, без хранилища, без преобразования
ETag: "7cf651e2-176f-4ac1-808e-0e0c17cfd0a2"
Длина контента: 1932
Варьируется: Accept,Content-Type,Content-Encoding,Accept-Language
X-Cache: REVALIDATE от proxy.lo
X-Cache-Detail: "условное попадание в кэш: сущность обновлена" из proxy.lo
Подключение: закрыть
Тип контента: приложение / JSON; кодировка = UTF-8

Итак, МОЙ ВОПРОС: ПОЧЕМУ mod_proxy выполняет повторную проверку каждого запроса независимо от того, какой максимальный возраст определен?

NB Apache 2.4.3

Спасибо, буду благодарен за любую помощь.

0 ответов

Другие вопросы по тегам