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