proxy_cache & cache-control

Maxim Dounin mdounin на mdounin.ru
Ср Окт 19 11:35:15 UTC 2016


Hello!

On Wed, Oct 19, 2016 at 12:57:18AM +0100, Anton Kiryushkin wrote:

> Здравствуйте.
> 
> У меня два вопроса к собравшимся.
> 1. Чем обсуловлено условие, по которому add_headers и expires нельзя
> добавить для кода ответа 502. Его можно кэшировать, но нельзя пытаться
> управлять этим кэшированием. Например, с помощью expires.
> 2. Собственно сам этот expires и cache-control, похоже, не сильно-то
> жалуются самим nginx.
> 
> Решил проверить, что будет, если разрешить добавлять заголовки для 502-го
> кода и с помощью именованного локейшена их туда добавил. Nginx, который
> стоит выше уровнем отлично это дело прокэшировал и получились вот такие
> чудесные заголовки:
> 
> HTTP/1.1 502 Bad Gateway
> Server: nginx
> Date: Tue, 18 Oct 2016 23:45:07 GMT
> Content-Type: text/html
> Content-Length: 169
> Connection: close
> Expires: Tue, 18 Oct 2016 23:46:07 GMT
> Cache-Control: max-age=120,public,must-revalidate
> 
> В конфиге написано, что 502-й код можно кэшировать только на минуту.
> На деле выходит, что даже в 23:46:07 элемент все еще находится в кэше. Ждем
> еще минуту и чудо все равно не случается. Nginx игнорирует этот элемент
> кэша. Почему/зачем совершенно не понятно.
> 
> Может кто-то тут сможет дать совет, как лучше поступить?

Для начала стоит разобраться, что вы понимаете под словами "всё 
ещё находится в кэше" и "чудо".  Ответ будет находится в кеше до 
достижения времени inactive, указанного в директиве 
proxy_cache_path, по умолчанию - 10 минут, либо до принудительного 
удаления по max_size, указанного там же.

Следует, однако, различать состояния "находится" и "будет 
использоваться для ответов пользователям".  После достижения 
заданного времени ответ, даже находящийся в кеше, считается 
устаревшим и перестаёт использоваться кроме как для нужд директивы 
proxy_cache_use_stale.

Отмечу так же, что в соответствии с "max-age=120" в заголовке 
Cache-Control, приведённый выше ответ устареет через 2 минуты 
(если в конфиге не сказано игнорировать Cache-Control).  Заголовок 
Cache-Control имеет больший приоритет, чем Expires, и оба имеют 
приоритет над директивой proxy_cache_valid.

-- 
Maxim Dounin
http://nginx.org/



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