Re[2]: set на уровне http

Михаил Монашёв postmaster at softsearch.ru
Sun Aug 18 20:49:28 UTC 2013


Здравствуйте, Maxim.

>> >> set на уровне http был бы очень удобен порой. Обходить это через
>> >>         map 1  $var {
>> >>                 default "value";
>> >>         }
>> >> неудобно.
>> 
>> > http://nginx.org/en/docs/faq/variables_in_config.html
>> 
>> Признаюсь,  что  не  въехал  в  ответ по ссылке. Все слова знакомые, а
>> собранные  вместе  смысл  никакой в моей голове не приобретают. Тупею,
>> видимо. :-)
>> 
>> Опишу  задачу. Мне надо было как-то писать в аксес-лог кэш-зону, чтобы
>> потом  по  логам  считать  эффективность  каждой  кэш-зоны. Встроенную
>> переменную я не знаю, поэтому решил создать переменную через set. Там,
>> где  запросы  проксируются,  я  присваивал  через  set соответствующей
>> переменной   значение,   равное  имени  кэшзоны.  Но  не  все  запросы
>> проксируются  и  в  логе  вместо  значения  переменной  пишется пустая
>> строка,  что  неудобно  для  парсинга лога. Брать переменную в кавычки
>> тоже неудобно.
>> 
>> Для  таких  запросов  я  хотел  присвоить  этой  переменной  дефолтное
>> значение  "-". Писать в каждом блоке server{} set или include посчитал
>> лишним и вставил в http{} вот такие строчки:
>> 
>>         # set нельзя делать на уровне http, поэтому делаем присваивание через map
>>         map 1  $cache_zone_for_logging {
>>                 default "-";
>>         }
>> 
>> Т.е. я хотел использовать set для инициализации переменной, которая
>> потом может меняться.
>> 
>> На  мой  примитивный  взгляд  кажется нелогичным иметь иерархию блоков
>> конфига, иметь наследование с вышестоящих уровней иерархии и разрешать
>> set-у работать на уровне http{}.

> Всмысле - _не_ разрешать?

Да. Ошибся.

> Проблема  состоит  в  том,  что  set - это директива модуля rewrite,
> которая  не наследуется, выполняется вместе с остальными директивами
> в rewrite-фазе и т.п.

Это  всё  тонкости  реализации  не  ясные  99% процентам пользователей
nginx-а.

Ну  вынесите  её  в  отдельный  модуль mod_set или ещё как-то проблему
наверняка можно исправить.

> Вводить  директиву set на уровне http с совершенно другой семантикой
> - это не очень хорошая идея.

Зачем другая семантика. Оставить всё как есть, только дать возможность
писать  в  конфиге set на уровне http{}. Это удобно, логично, упрощает
конфиг, избавляет от копипасты. Во всяком случае мне так видится. Хотя
судя  по  активности в треде это больше никому не надо. Так что можете
забить, если реально много писать, тестировать и многое поломается.

-- 
С уважением,
 Михаил                          mailto:postmaster at softsearch.ru



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