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


14

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

limit_req zone=one burst=5 nodelay;

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

Ответы:


28

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

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

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

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

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

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

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

3
Спасибо за ваше разъяснение, документация для меня недостаточно ясна.
Николас

1
Я отредактировал свой ответ, чтобы отразить документацию, цитируя его. Каждое слово тщательно взвешено в документации nginx, чтобы сделать его кратким: вот что приятно в этом.
Бернард Россет

3
Так в чем же разница между limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;разрешением 6 запросов в секунду и limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;разрешением 6 запросов в секунду?
Николас

2
Просто хочу подтвердить про Бернарда. Если то, что сказал Бернард, было правильно, то с помощью burst и nodelay частота обращений к веб-серверу будет время от времени превышать заданные запросы, верно?
Jcyrss

2
@BernardRosset не могли бы вы уточнить «очередь не будет ждать» - что вы подразумеваете под этим?
Денис Горбачев

8

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

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

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

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

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


Спасибо, что прояснили этот момент, который был фактически причиной моего вопроса.
Николас

Это не правильно. Прочитайте мой ответ + комментарии еще раз. Если вы все еще не видите его, давайте сделаем набросок: 6r / s для обеих конфигураций, предоставленных Николасом в комментарии к моему ответу. 1-я секунда -> оба сценария будут обслуживать 6r, но conf # 2 сохранит 5 в пакете. 2-я секунда и далее, все еще то же самое для conf # 1 (все 6r обслужены), но conf # 2 будет удалять 1 из пакета пакета в соответствии с потреблением, соответствующим ограничению скорости, оставляя место для 1r в очереди. Остальные 5r выбрасываются.
Бернард Россет

@BernardRosset: но nodelayне означает ли это, что эти запросы обрабатываются сразу, а не в очереди?
Сирида

4

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

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

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


1

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

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


Привет @Gardener и добро пожаловать на сбой сервера. Спасибо за ваш хорошо разработанный вклад. Ссылка на источник очень ценится.
Марко

0

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

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

-2

Я предлагаю прочитать эту ветку : limit_req_zone limit by location / proxy

и этот ответ: stackoverflow


1
Ответы только на ссылку рассматриваются как неполные в случае сбоя сервера. Пожалуйста, предоставьте полезный контент здесь, а затем ссылку в другом месте для более подробной информации, если это необходимо.
EEAA
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.