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