Улучшение 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