Cache revalidation using If-None-Match

Gena Makhomed gmm at csdoc.com
Thu Jul 17 18:07:32 UTC 2014


On 17.07.2014 15:17, S.A.N wrote:

> if ($upstream_status = 304) {
>   set no_cache = 1;
> }
>
> fastcgi_no_cache $no_cache;
>
> Ещё как вариант, Nginx вообще не нужно удалять валидаторы из запроса, они
> всегда должны уходить на бекенд, при получении статуса 304, когда нет файла
> кеша Nginx, но в заголовке ответа указано что можно кешировать в публичном
> кеше (не private), только в этом случаи Nginx должен сделать повторный
> запрос к бекенду без валидаторов для получения нового контента со статусом
> 200.

Обычно nginx ставят для того, чтобы он уменьшал,
а не увеличивал количество запросов к backend`у.

> Но можно и не делать повторный запрос, со временем придет юзер без
> валидаторов и бекенд отдаст статус 200, в общем Nginx просто надо научить
> понимать что заголовки Cache-Control в 304 статусе, не означают что нужно
> кешировать ответ 304, они означают что нужно использовать прежний
> закешированый ответ 200, по сути fastcgi_no_cache который я написал выше эту
> проблему так и решает.

Запрос с валидаторами может придти и тогда,
когда в кеше nginx предыдущего варианта ответа уже нет.

И тогда на backend пойдет весь поток таких запросов с валидаторами,
на которые backend будет вынужден каждый раз сам отвечать 304 статусом.

В существующем сейчас варианте - на backend приходит всего один запрос.
Что меньше, чем количество запросов как в первом так и во втором случае.

> Я понимаю такая схема сложней для Nginx и ему проще просто всегда удалять
> валидаторы если нет файла кеша, но я же смотрю с точки зрения бекенда, ему
> лучше если валидаторы всегда приходят.

Если посмотреть на ситуацию с точки зрения производительности -
то лучше не дергать backend на каждый клиентский запрос,
а просто делегировать nginx`у полномочия по возврату
статуса 304 в ответ на такие запросы клиентов.

Когда backend понимает, что кеш у nginx устарел
- он обновляет кеш nginx всего одним запросом.

А в коммерческой версии - там еще лучше, одним запросом
удаляет из кеша устаревший ответ, если он там есть.

Или просто использовать вариант с естественным
устареванием кеша по таймауту fastcgi_cache_valid

В результате: минимальный overhead, максимальная производительность.

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru