Документация здесь имеет объяснение, которое звучит так, как вы хотите знать:
Директива указывает зону (зону) и максимально возможные пакеты запросов (пакет). Если скорость превышает требования, указанные в зоне, запрос задерживается, поэтому запросы обрабатываются с заданной скоростью.
Из того, что я понимаю, запросы по пакету будут задерживаться (занимают больше времени и ждут, пока они не будут обслужены), с nodelay
опциями задержка не используется и лишние запросы отклоняются с ошибкой 503.
Этот пост в блоге ( archive.org ) дает хорошее объяснение, как работает ограничение скорости на nginx:
Если вы похожи на меня, вы, вероятно, задаетесь вопросом, что же на самом деле означает взрыв. Вот хитрость: замените слово «взрыв» на «ведро» и предположите, что каждому пользователю дается ведро с 5 токенами. Каждый раз, когда они превышают скорость 1 запроса в секунду, они должны платить токен. После того, как они потратили все свои токены, им выдается сообщение об ошибке HTTP 503, которое, по сути, стало стандартом для «отступай, человек!».
TL; DR: опция nodelay полезна, если вы хотите наложить ограничение скорости без ограничения разрешенного интервала между запросами.
Мне было трудно переварить другие ответы, а затем я обнаружил новую документацию от Nginx с примерами, которые отвечают на это: https://www.nginx.com/blog/rate-limiting-nginx/
Вот соответствующая часть. Данный:
Если вы добавите nodelay:
источник
Я вижу это следующим образом:
Запросы будут обрабатываться как можно быстрее, пока не будет превышен уровень зоны. Уровень зоны «в среднем», поэтому, если ваша скорость равна
1r/s
нулю,10
вы можете получить 10 запросов в 10-секундном окне.После превышения нормы зоны:
а. Без
nodelay
, дальнейшие запросы доburst
будут задерживаться.б. При этом
nodelay
дальнейшие запросыburst
будут обрабатываться как можно быстрее.После
burst
превышения, сервер будет возвращать ответ об ошибке до тех пор, пока не истечет срок действия окна пакета. например, для скорости1r/s
и пакета10
, клиент должен будет ждать до 10 секунд для следующего принятого запроса.источник
Параметр определяет, будут ли запросы задерживаться, чтобы они соответствовали желаемой скорости, или они будут просто отклонены ... в некоторой степени, управляется ли ограничение скорости сервером или ответственность передается клиенту.
nodelay
настоящее времяЗапросы будут обработаны как можно быстрее; любые запросы, отправленные сверх указанного лимита, будут отклонены с кодом, установленным как
limit_req_status
nodelay
отсутствует (он же задерживается)Запросы будут обрабатываться со скоростью, соответствующей указанному пределу. Так, например, если скорость установлена в 10 req / s, то каждый запрос будет обрабатываться в течение> = .1 (1 / скорость) секунд, что не позволяет превышать скорость, но позволяет выполнять резервное копирование запросов. Если достаточно резервных копий запросов для переполнения сегмента (что также может быть предотвращено одновременным ограничением соединения), то они отклоняются с кодом, установленным как
limit_req_status
.С подробностями можно ознакомиться здесь: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263, где эта логика срабатывает, когда предел еще не пройден, и теперь задержка при желании будет применен к запросу. В
nodelay
частности, применение директивы вступает в действие здесь: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495, в результате чего значениеdelay
выше равно 0, вызывая это обработчик для немедленного возврата,NGX_DECLINED
который передает запрос следующему обработчику (вместо того,NGX_AGAIN
который будет эффективно требовать его повторной обработки).источник
Я не понял этого в первый раз, когда читал вступление от https://www.nginx.com/blog/rate-limiting-nginx/ .
Теперь я уверен, что понимаю, и мой ответ пока лучший. :)
Предположим:
10r/s
установлено, максимальные возможности сервера, например,10000r/s
есть,10r/ms
и на данный момент есть только 1 клиент.Итак, вот основная разница между
10r/s per IP burst=40 nodelay
и10r/s per IP burst=40
.Как задокументировано https://www.nginx.com/blog/rate-limiting-nginx/ ( я настоятельно рекомендую сначала прочитать статью (кроме раздела « Двухступенчатое ограничение скорости »)), это поведение устраняет одну проблему. Который из?:
Проверьте черновик, который я сделал,
40th
запрос получает ответ в1s
то время как другой40th
получает ответ в4s
.Это может наилучшим образом использовать возможности сервера: отправлять ответы как можно быстрее, при этом сохраняя
x r/s
ограничение для данного клиента / IP.Но здесь также есть стоимость. Стоимость будет:
Если у вас много клиентов, стоящих в очереди на сервере, скажем, клиент
A
,B
иC
.Без
nodelay
, запросы обслуживаются в порядке, аналогичномABCABCABC
.С
nodelay
, заказ, скорее всего, будетAAABBBCCC
.Я хотел бы подвести итог статьи https://www.nginx.com/blog/rate-limiting-nginx/ здесь.
Прежде всего, самая важная конфигурация
x r/s
.x r/s
только лишние запросы немедленно отклоняются.x r/s
+burst
, лишние запросы ставятся в очередь.1.
vs2.
стоимость заключается в том, что на стороне клиента запросы в очереди берут на себя шансы последующих запросов, которые будут иметь возможность быть обслуженными.Например,
10r/s burst=20
против10r/s
,11th
предполагается , что запрос будет отклонен немедленно при последнем условии, но теперь он ставится в очередь и будет обслуживаться.11th
Запрос занимает21th
возможность запроса.x r/s
+burst
+nodelay
, Уже пояснялось.PS Раздел « Двухступенчатое ограничение скорости » статьи очень запутанный. Я не понимаю, но это не имеет значения.
Например:
8 р / с? шутки в сторону? В течение 3 секунд показано 17 запросов, 17/3 = 8?
источник