Назад | Перейти на главную страницу

Nginx - что означает определение `burst`, если есть опция` nodelay`

В конфигурации Nginx, если вы хотите ограничить скорость обработки запросов с помощью limit_req_zone / limit_req instructions, Я действительно не понимаю, как использовать nodelay вариант.
Насколько я понимаю, он завершает запросы с превышением установленной скорости, не задерживая их. Так что это похоже на burst=0. Вот почему я не понимаю следующий пример:

limit_req zone=one burst=5 nodelay;

burst определяет количество запросов, которые могут быть отложены, поэтому в чем смысл определения burst если есть nodelay вариант?

я нахожу limit_req документация достаточно понятная.

burst документируется таким образом:

Чрезмерные запросы задерживаются до тех пор, пока их количество не превысит максимальный размер пакета [...]

nodelay документируется таким образом:

Если задержка чрезмерных запросов при ограничении запросов нежелательна, следует использовать параметр nodelay.

Запросы ограничены, чтобы соответствовать определенной ставке. Если запросы поступают с большей скоростью, не более установленного количества запросов в единицу времени будет обслуживаться. Затем вам нужно решить, что делать с этими другими запросами.

  • По умолчанию (нет burst, нет nodelay) запросы отклоняются с ошибкой HTTP 503.
  • С участием burst, вы складываете определенное количество запросов в очередь ожидания, но вы не обрабатываете их быстрее, чем определено запросов в единицу времени ставка.
  • С участием burst и nodelay, очередь не будет ждать и пакеты запросов будут обработаны немедленно.

Комментарии к исходному ответу кажутся неправильными.

Возникает вопрос, в чем разница между, скажем, rate = 6r / s burst = 0 и rate = 1r / s burst = 5 nodelay

Ответы хороши для объяснения разницы, когда опция nodelay НЕ присутствует - в этом случае запросы встают в очередь с пакетом и помещаются в очередь без пакета.

Исходный ответ кажется правильным - с помощью nodelay пакетные запросы обрабатываются немедленно. И, следовательно, единственный вывод из этого состоит в том, что нет никакой разницы между указанием пакета + nodelay и просто указанием верхнего предела с busrt = 0 в первую очередь.

Поэтому, чтобы более лаконично ответить на вопрос OP: значение пакета при указании nodelay такое же, как просто указание большей скорости без пакета.

С участием burst и nodelay указано, что мне легче понять такой механизм (наоборот, чем это обычно понимается):

  1. Вы разрешаете максимум burst Запросы. С участием $binary_remote_addr это максимальное количество запросов, которые вы принимаете с данного адреса. Каждый запрос увеличивает внутренний счетчик. Когда счетчик достигает burst все дополнительные запросы отклоняются (и счетчик не увеличивается сверх burst стоимость).
  2. Этот счетчик постоянно уменьшается со скоростью, указанной с помощью rate.

Эта логика предполагает, что имеет смысл указать высокий burst значение (например, 100 и более) и низкий rate стоимость (даже что-то вроде 2р / с). Это лучше обрабатывает нормальный просмотр (пакет параллельных запросов, за которым следует период молчания), одновременно защищая от непрерывного потока запросов ботов.

На основе отличный ответ Дэна и дальше исходный код nginx, краткое изложение nodelay поведение выглядит следующим образом:

  • burst сколько новый одновременные запросы разрешены.
  • rate сколько новый одновременные запросы становятся старый в единицу времени. (Это обновление происходит постепенно: один раз на запрос, но не в секунду.)

Я задал вопрос Николя парню, который написал пост на сайте nginx. Ограничение скорости NGINX. Его ответ как ниже

При прежнем ограничении скорости nginx будет принимать последовательные запросы с интервалами в 1/6 секунды. он не будет принимать пакеты запросов, которые не удовлетворяют этому минимальному временному интервалу. С другой стороны, в последнем определении nginx будет принимать пакет до 6 запросов независимо от временного интервала между запросами. Ссылка для ответа

Предлагаю прочитать эту ветку: limit_req_zone ограничение по местоположению / прокси

и этот ответ: переполнение стека