Re: Улучшение ngx_http_limit_req_module
Maxim Dounin
mdounin на mdounin.ru
Пн Фев 1 13:25:37 UTC 2016
Hello!
On Mon, Feb 01, 2016 at 03:48:04PM +0600, Pavel V. wrote:
> Здравствуйте.
>
> Насколько сообществу интересна реализация улучшения модуля ngx_http_limit_req_module, а в частности
> расширения синтаксиса директивы limit_req?
>
> Предлагаемый синтаксис:
>
> (1) limit_req zone=название [burst=число] [nodelay] [if=условие] [last];
> (2) limit_req off if=условие;
> (3) limit_req off;
> (4) limit_req last if=условие;
>
>
> Предлагаемая логика работы:
>
> Синтаксис (1):
>
> Базовый синтаксис дополняется возможностью указания условия if=условие и параметром last.
> Если заданное условие не выполняется, то ключ зоны не вычисляется, директива пропускается, учет
> запроса не происходит. Выполняются остальные директивы limit_req, при их наличии.
> Если заданное условие выполняется или условие не задано, применяются ограничения зоны обычным
> образом. При этом вычисляется ключ зоны, если значение ключа не пустое и указан параметр last -
> остальные директивы limit_req не выполняются.
Сейчас условное применение limit_req делается с помощью ключа -
если ключ пустой, то ограничение не применяется.
Сделать явный отдельный параметр if - можно, но сколько-нибудь
принципиальной разницы нет. В то же время не факт, что мы хотим
тут усложнять синтаксис.
Кроме того, см. ниже про "если хочется программировать".
> Синтаксис (2):
>
> Возможность отключения ограничения по заданному в переменной условию.
> Директива такого синтаксиса может быть только первой в списке директив limit_req.
Это выглядит очень неинтуитивно, IMHO.
> Синтаксис (3):
>
> Возможность безусловного отключения ограничений, наследованных с предыдущего уровня.
> Все директивы, заданные на этом или предыдущем уровне - отключаются.
Это уже записано в TODO, возможность отказаться от унаследованных
ограничений, безусловно, нужна.
> Синтаксис (4)
>
> Возможность прекратить обработку директив limit_req по заданному в переменной условию, с
> применением ограничений уже обработанных директив.
>
> Отличие от синтаксиса (2): может быть в любом месте в списке директив limit_req, соответственно
> директивы выше по списку директив должны быть обработаны корректно, в остальном
> является практически точной копией синтаксиса (2) ("синтаксический сахар").
>
> Для данного улучшения уже почти готов патч (за вычетом синтаксиса 4). Также можно сделать
> аналогичную доработку модуля ngx_http_limit_conn_module.
Эта логика предполагает последовательное применение ограничений.
Меж тем, логика работы nginx'а предполагает декларативную
конфигурацию, с отсутствием зависимости от порядка. Не надо
тащить в nginx очередную императивную логику, хватит с нас
rewrite-модуля.
Если хочется программировать - стоит подумать о том, чтобы
вытащить результаты ограничений в переменные, и дальше
программировать с помощью директив rewrite-модуля же.
> Из планируемых вещей также есть мысли по поводу добавления параметра "dry-run".
Да, сделать возможность проверки ограничений без их реального
применения - тоже уже в TODO.
[...]
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru