Re: nginx fastcgi_cache и Vary headers

Maxim Dounin mdounin на mdounin.ru
Ср Мар 30 19:35:02 UTC 2016


Hello!

On Wed, Mar 30, 2016 at 09:41:59PM +0300, Andrey Kopeyko wrote:

> On Wed, 30 Mar 2016, Alex Vasilenko wrote:

[...]

> >Собственно и Cache-Control и Vary
> >заголовки игнорируются, кэшируется на минуту с первым попавшим языком.
> 
> Вот здесь вы близки к пониманию происходящего, и к решению.
> 
> >Что я не так делаю?
> 
> Вам надо добавить в fastcgi_cache_key заголовок "Accept-Language" из
> запроса, как-то так:
> 
> fastcgi_cache_key
> "$request_method|$http_if_modified_since|$http_if_none_match|$host|http_accept_language|$request_uri";
> 
> Но будьте готовы к разрастанию кеша, потому что запросы к одному URI но с
> чуть разными заголовками
>   Accept-Language="ru,ru-RU;q=0.7,en;q=0.3"
> и
>   Accept-Language="ru;q=0.7,en;q=0.3"
> 
> создадут 2 разных файла в кеше.

Начиная с версии 1.7.7 nginx умеет сам смотреть на заголовок Vary,  
возвращаемый в ответе бекендом, и учитывать его при кешировании, 
при необходимости создавая для разных вариантов ресурса 
производные ключи и кеш-файлы, http://nginx.org/ru/CHANGES.ru:

    *) Изменение: теперь nginx учитывает при кэшировании строку "Vary" в
       заголовке ответа бэкенда.

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

Судя по тому, что "и Cache-Control и Vary заголовки игнорируются" - 
проблему стоит искать где-то в районе конфига, там скорее всего 
кто-то написал fastcgi_ignore_headers как минимум со значениями 
Cache-Control, Expires и Vary.

(Отдельно отмечу, что нескольких заголовков Vary в ответе - 
плохая идея, nginx использует последний из них.  Но в данном 
случае проблема явно не в этом, т.к. Cache-Control также 
игнорируется.)

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



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