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 mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить