ngx_http_limit_req_module
Maxim Dounin
mdounin на mdounin.ru
Вт Фев 1 15:36:07 MSK 2011
Hello!
On Tue, Feb 01, 2011 at 02:49:14PM +0300, Антон Исайкин wrote:
> Добрый день.
>
> Подскажите пожалуйста, верно ли я понимаю принцип работы директивы
> limit_req_zone. Мне необходимо ограничить число запросов в час для IP
Принцип работы описан тут:
http://en.wikipedia.org/wiki/Leaky_bucket
Ключевые моменты:
1. limit_req ограничивает скорость, а не количество запросов за
определённый период.
2. Максимально количество запросов, которые могут поступить от
клиента за произвольно короткий промежуток времени, и при этом
будут обслужены - задаётся параметром burst.
3. Если запросы поступают со скоростью большей, чем разрешено (но
в пределах burst), то в зависимости от параметра nodelay они будут
либо задерживаться до заданной скорости, либо нет.
> адреса (h для обозначения часа не поддерживается) в количестве 180
> запросов. При текущем синтаксисе мне надо написать что-то подобное:
>
> limit_req_zone $binary_remote_addr zone=one:10m rate=3r/m;
> ...
> limit_req zone=one burst=177;
>
> Эквивалентна ли такая запись требуемому условию?
При таком конфиге за час можно будет сделать максимум (3 r/m * 60
m) + 177 r = 357 запросов (в случае, если запросов в предыдущий
час не было). Если запросы поступают постоянно - то только 180.
При этом за произвольно короткий промежуток времени можно будет
сделать 177 запросов. Эти запросы будут обслуживаться по очереди
в течении 57 минут (скорее всего большей части ответов клиент не
дождётся).
Если вы хотите разрешить не более 180 запросов за час в среднем, и
при этом разрешить делать все эти запросы за произвольно короткий
промежуток времени, то пишите так:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/m;
limit_req zone=one burst=180 nodelay;
Если задачи резрешить делать все эти запросы за произвольно
короткий промежуток времени не стоит, то burst и nodelay можно
ставить из других соображений.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru