Улучшение ngx_http_limit_req_module

Pavel V. pavel2000 на ngs.ru
Пн Фев 1 09:48:04 UTC 2016


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

Насколько сообществу интересна реализация улучшения модуля 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 не выполняются.

Синтаксис (2):

   Возможность отключения ограничения по заданному в переменной условию.
   Директива такого синтаксиса может быть только первой в списке директив limit_req.

Синтаксис (3):

   Возможность безусловного отключения ограничений, наследованных с предыдущего уровня.
   Все директивы, заданные на этом или предыдущем уровне - отключаются.

Синтаксис (4)

   Возможность прекратить обработку директив limit_req  по заданному в переменной условию, с
применением ограничений уже обработанных директив.

   Отличие от синтаксиса (2): может быть в любом месте в списке директив limit_req, соответственно
директивы выше по списку директив должны быть обработаны корректно, в остальном
является практически точной копией синтаксиса (2) ("синтаксический сахар").

Для данного улучшения уже почти готов патч (за вычетом синтаксиса 4). Также можно сделать
аналогичную доработку модуля ngx_http_limit_conn_module. 

Из планируемых вещей также есть мысли по поводу добавления параметра "dry-run".

Предлагаю обсудить целесообразность/заинтересованность сообщества в подобного рода доработках.


Пример использования предлагаемого синтаксиса:

server {

...

limit_req_zone $binary_remote_addr zone=user:10m rate=200r/s;
limit_req_zone $binary_remote_addr zone=spider:10m rate=20r/s;

location /  {
    limit_req off if=$verytrusted;                                 #last applied too
    limit_req zone=api    burst=2  if=$is_api_host last;
    limit_req zone=spider burst=20 if=$is_spider_host$is_spider_re last nodelay;
    limit_req zone=user;
}

location /static {
    limit_req off;
}
...
};


-- 
С уважением,
 Pavel                          mailto:pavel2000 at ngs.ru



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