Какие обратные прокси-серверы поддерживают заголовки HTTP / 1.1 ETag и If-None-Match?

8

Я разрабатываю систему кеширования для платформы электронной коммерции, которая будет использовать обратный прокси для кеширования. Я планирую обработать недействительность, используя надлежащие заголовки HTTP / 1.1. То есть я установлю ETag для первого поколения контента и кеша этого значения ETag в приложении. Заголовок Cache-Control будет указывать «must-revalidate», поэтому прокси должен устанавливать заголовок If-None-Match при последующих запросах с ETag. Приложение выполнит поиск кэшированного значения ETag и, если оно совпадет, отправит ответ 304, в противном случае будет сгенерировано полное значение 200.

Я надеялся использовать nginx, но не могу с уверенностью сказать, что он поддерживает ETag (документы указывают, что это не так, но, возможно, они устарели?). Лак это еще один вариант, но я не уверен, что здесь ..

Какие обратные прокси-серверы имеют полную поддержку ETag? Я бы хотел, чтобы он на самом деле кэшировал несколько версий, чтобы я мог выполнять такие вещи, как сплит-тестирование, без необходимости отключения кэша. То есть HTTP / 1.1 указывает, что клиент может отправить If-None-Match с несколькими значениями ETag, и сервер должен ответить, с каким ETag сопоставлено (если есть). Если обратный прокси-сервер хранит несколько копий, а не только последнее увиденное значение, и позволяет серверу указывать при каждом запросе, который использовать, это было бы идеально.

ColinM
источник

Ответы:

2

Я только что проверил исходный код Varnish, и хотя он поддерживает If-Modified-Sinceи If-None-Matchзаголовки, он не поддерживает must-revalidateв Cache-Control. Единственные поддерживаемые атрибуты в Cache-Controlэто max-ageи s-max-age.

Ссылки:

Жером Р
источник
Спасибо. Я не знаю много о Varnish VCL, но возможно ли указать использование VCL для повторной проверки, учитывая, что Varnish действительно поддерживает повторную проверку?
ColinM
Только что обнаружил, что ветка Varnish "экспериментальная-ims", кажется, добавляет полную поддержку If-None-Match. Надеюсь, в конечном итоге он будет объединен в стабильную версию. varnish-cache.org/trac/wiki/BackendConditionalRequests
ColinM
2

nginx требует сторонних модулей для поддержки ETag. И их два .

Майкл Хэмптон
источник
Модуль static etags предназначен для генерации etags, а не для кэширования контента с помощью etags. Аналогично, модуль динамических etags генерирует etags для динамического контента для восходящего использования, а не для использования обратного прокси. Тем не менее, я думаю, что nginx 1.3 добавил официальную поддержку etags с обратными прокси-серверами ..
ColinM
1
Просто для дальнейшего использования, nginx поддерживает ETag и If-None-Match с 1.7.3, но он все еще может кэшировать только один результат для данного URL, поэтому я бы не назвал эту полную поддержку. То есть во время повторной проверки нельзя кэшировать и согласовывать несколько ответов с сервером. См. Trac.nginx.org/nginx/ticket/101
ColinM
1

Поправьте меня, если я ошибаюсь, и я знаю, что это старый пост - но я бы хотел прокомментировать новых прохожих. Я считаю, что кэш обратного прокси-сервера не помогает так сильно, как вы хотели бы при использовании ETag.

Механизмы кэширования проверки используют исходный сервер для проверки того, является ли ETag (или дата последнего изменения) в запросе все еще действительным (совпадает или не совпадает с etag ресурсов, в зависимости от того, какой заголовок используется, или был / не был изменен с даты, указанной в запросе).

Это означает, что кэш обратного прокси-сервера, такой как Varnish, будет по-прежнему передавать этот запрос на исходный сервер. Он может ответить запросом, а не обработать его сервером, но вы не сохранили двустороннюю передачу на исходный сервер.

Браузеры могут кэшировать ответы и обрабатывать ответ 304 в любом случае, поэтому личный кэш пользователя может лучше подходить для этого, чем использование обратного прокси-сервера (YMMV, особенно в масштабе, и в зависимости от вашего варианта использования, конечно. хочу сделать предположения о ваших приложениях).

Из спецификации 13.3 :

Когда в кеше есть устаревшая запись, которую он хотел бы использовать в качестве ответа на запрос клиента, он сначала должен проверить с сервером происхождения (или, возможно, промежуточным кешем со свежим ответом), чтобы убедиться, что его кэшированная запись все еще пригодна для использования. , Мы называем это «проверкой» записи в кэше. Поскольку мы не хотим оплачивать накладные расходы на повторную передачу полного ответа, если кэшированная запись исправна, и мы не хотим оплачивать накладные расходы на дополнительную обратную передачу, если кэшированная запись недействительна, протокол HTTP / 1.1 поддерживает использование условных методов.

и затем обратите внимание на 13.3.4 :

Кэширующий прокси-сервер HTTP / 1.1 после получения условного запроса, который включает в себя как дату последнего изменения, так и один или несколько тегов сущности в качестве валидаторов кэша, НЕ ДОЛЖЕН возвращать клиенту локально кэшированный ответ, если только этот кэшированный ответ не соответствует всем поля условного заголовка в запросе.

Таким образом, Varnish может вернуть ответ для вас, но у вас все еще есть обратный путь к серверу. Если вы можете использовать кэш приложения, такой как APC или memcache, то это все же может стоить того. Однако кэширование проверки обычно лучше для экономии полосы пропускания, чем для экономии ресурсов сервера.

Кэширование валидации лучше всего оставить клиенту (браузер или код API).

Использование модели Expiration для кэширования - это то, где кеш с обратным прокси-сервером действительно сияет. Это позволяет вообще пропустить попадание на исходный сервер. Используя Expires, Cache-Control, Dateи т.д., это лучший (опять же , ИМО) механизм обратного прокси - кэша в кэш может вернуть ответ, предполагая , что его не затхлый, никогда не попав сервер происхождения.

fideloper
источник
Вариант использования, который я имел в виду для этого вопроса, заключается в повторной проверке прокси-сервера на исходном сервере, а исходный сервер возвращает 304, если ETag совпадает с ETag, который будет кэшироваться для данной записи. Таким образом, ETag будет генерироваться случайным образом при первой визуализации страницы и сохраняться с первичным ключом для этой записи. Если запись модифицирована, ETag стирается.
ColinM
0

На сегодняшний день я считаю, что до сих пор нет прокси, которые полностью поддерживают эту спецификацию HTTP. Итак, около года назад я решил написать свой собственный, используя Node.js и MongoDb.

https://github.com/colinmollenhour/node-caching-proxy

ColinM
источник