Re: proxy_cache_key и fastcgi_cache_key

Валентин Бартенев vbart at nginx.com
Fri Jan 10 23:17:22 UTC 2014


On Friday 10 January 2014 23:10:17 Gena Makhomed wrote:
> On 10.01.2014 22:48, Валентин Бартенев wrote:
> 
> >> Разве много ли таких конфигураций, которые полагались
> >> на дефолтовое значение директивы proxy_cache_key ?
> 
> > Полагаю не мало людей используют кэш для одного хоста
> > и ключ по умолчанию у них нормально работает, а после
> > изменения перестанет.
> 
> Ok, но ведь при парсинге конфига nginx может посчитать

Это не так просто и ведет к довольно сильному layering violation.

Следует учесть, что в nginx:

 1. Директивы из разных модулей обычно ничего не знают о существовании
    друг-друга, а равно и значениях;

 2. Могут встречаться в конфиге в произвольном порядке, а директива
    server_name вообще несколько раз.  Такая конфигурация валидна:

    server {
       server_name example.org;
    
       location {
           proxy_pass backend;
       }

       server_name example.org;
    }

 3. Директива proxy_cache_key может быть задана также на уровнях http, server,
    и location-ах любой степени вложенности.

 4. Как отсутствие, так и наличие директивы proxy_cache_key, не означает,
    что кэш вообще включен и используется.  Для этого должно совпасть ещё
    минимум два условия:

    а) Наличие директивы proxy_pass в данном location-не, или на
       уровне server (неявный location-ой);

    б) Наличие директивы proxy_cache со значением отличным от off
       в этом же location, или унаследование такового с уровня выше.


> количество хостов в конфиге, и если там всего один хост
> и явно не задан в конфиге proxy_cache_key - выдавать warning
> но продолжать работать со старым дефолтовым значением,
> а если хостов больше одного - то переключать на новый
> дефолт и выдавать fatal error,

Типичный конфиг:

  server_name example.com www.example.com;


> если proxy_cache_key
> не определен - всеравно в такой конфигурации от
> proxy_cache_key $scheme$proxy_host$request_uri;
> будет больше вреда, чем пользы из-за перемешивания
> в кеше контента от разных virtual host`ов.
> 
> А если это highload, и это был отдельный location
> под общие элементы и/или ssi-инклуды -
> его админы в любом случае внимательно
> читают CHANGES и все варнинги от nginx.
> 
> В таком варианте ведь ничего не сломается?

Почему ни warning, ни error сделать не представляется разумным - пояснил в 
самом начале.

Опять же, ИМХО если что-то предпринимать в этом отношении, то лучше поступить 
следующим образом:

  1. Добавить второй параметр, задающий ключ, в директивы proxy_cache,
     fastcgi_cache, scgi_cache, uwsgi_cache;

  2. Отказаться от отдельных директив *_cache_key.

Причем возможно сделать с промежуточным этапом: параметр опционален и warning 
при его отсутствии или наличии *_cache_key директив в конфиге.

Либо разом: второй параметр обязателен когда значение первого отлично от off,
и соответствующие ошибки - не запускаемся пока не поправят конфиг.

Очевидные плюсы:

 1. Упрощается конфигурация, поскольку ИМХО от раздельного задания ключа и
    зоны никакой практической пользы, зато какое-то сложное условие включения
    кэша в location-е.

 2. Изменения потребуют явного вмешательства и принятия мер со стороны
    администратора, а не пройдут незамеченными в виде тихо переставшего
    работать кэша.

И очевидный минус: затронет всех, кто использует кэш.

--
Валентин Бартенев


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