Re: Не работает limit req

Валентин Бартенев vbart at nginx.com
Sat Jul 12 12:33:14 UTC 2014


On Saturday 12 July 2014 06:13:43 nNgzlTtv3k5lzmKRvlmS22tSl8sJr68k wrote:
> Да, действительно странно, сегодня пробую вчерашний тест - работает как и у
> вас. Вчера тестировал на версии 1.4.x, под конец обновился, nginx
> перезапускал руками, написало [OK]. Может каким-то магическим образом не
> перезапустился.
> 
> Однако попробовал включить на живом сайте - снова проблемы: в error.log-е
> вижу записи о забаненых клиентах, делаю поиск их IP в access.log-е - находит
> 20..30 записей, в то время как в ограничении указано 60r/m.
> 
> Попробовал снова тестовый вариант - теперь видно, что nginx оптимизирует
> значение ограничения, и 60r/m превращаются в 1r/s.

Если у вас ограничение скорости на трассе 60км/ч, означает ли это, что нужно
ехать целый час, прежде чем будет зафиксировано нарушение?

10 r/s также не означает, что вы можете прислать 10 запросов, а потом секунду 
подождать.  Нет, это означает, что интервал между запросами должен быть не 
меньше 100мс.

Там нет дискретности в 1 секунду или минуту, nginx не измеряет rps секундными 
или минутными интервалами.

> 
> Видимо для этого случая нужно использовать форму  "1r/s burst=60" ?

Да это будет похоже.

> Тогда вопрос: через какое время nginx допускает повторное использование
> всплеска ?  Хотя судя по всему burst - это просто размер буфера для приёма
> запросов перед обработкой.

Это не очень корректный вопрос.  В nginx реализован классический
алгоритм используемый в телекоммуникации, т.н. leaky bucket и
burst в данном случае - это размер ведерка.  При 1r/s burst=60 из
ведерка постоянно течет вода со скоростью 1 капля в секунду, а его
объем - 60 капель.  1 запрос добавляет 1 каплю.  Перелив приводит к 
срабатыванию ограничения, а параметр nodelay влияет на то, будут ли
запросы, наполнившие ведерко, обработаны сразу, или будут задержаны
до момента вытекания капли из него.

--
Валентин Бартенев


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