Как именно в nginx limit_req burst «задерживает» запросы?
Допустим имеется nginx с заданными лимитами:
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/s;
limit_req zone=one burst=10;
Допустим на этот nginx приходит в какую-то секунду 31 запрос, один запрос соответственно откладывается на следующую секунду, в следующую секунду приходит снова 31 запрос, тот который был отложен, будет исполнен приоритетно и гарантированно?
Сергей: скорее всего, Вы правы, помню только группу, а не точный код. Почему не работает? Работает, снижает нагрузку на сервер :-) Соль в том, что ошибку получают только «лишние» пользователи, остальные получают нормальные ответ.
Валерий Рябошапко: Я к тому, что нагрузку снижает и просто rate=30/s, всё что выше - сбрасывается, мне хотелось чтобы и кратковременные пики отрабатывались, потому была найдена эта директива burst, документацию прочитал, то что нужно, но не совсем понятен нюанс, описанный в самом вопросе, что происходит с "лишними" запросами, если, как вы говорите, сбрасываются, то можно сказать эта конструкция не работает.
Сергей: burst — это такой дополнительный порог. При его достижении включается основное ограничение. То есть если основное ограничение 10 r/s, а burst 30, то 15 и 20 запросов за секунду он пропустит, но если за секунду придёт 31 запрос, то в следующую секунду он пропустит только 10 запросов, остальным покажет 503. И так будет каждую следующую секунду, пока частота обращений не опустится ниже 10 в секунду. Кстати, сейчас заметил, что у Вас неправильно конфиг составлен, burst должен быть меньше чем limit.
Сергей: кстати, обратите внимание, что этот лимит стоит ставить только на тот location, который отдаёт динамику, на статику он не нужен и может даже мешать. Плюс заметьте, что это ограничение на количество запросов с одного IP, а не вообще. Это так, на всякий случай :-)
Валерий Рябошапко: огромное спасибо, понял свою ошибку. Немного двусмысленно у них составлена документация, а как говорится, если что-то может быть понято в неправильном смысле - так оно и будет понято.
Да, в таком случае у меня конфиг неправильный.
Burst предполагается делать больше чем rate. Если будет rate 30 а burst 40 то 31-й запрос отложится на следующую секунду, а 41-й будет отклонен с 503-м статусом.