2016-04-15 2 views
1

Я изучаю nginx httprequestlimitmodule. Я не понимаю концепцию nodelay в httprequestmodule. Я пробовал ниже двух конфигураций с nodelay и без nodelay. в обоих случаях с nodelay и без nodelay я нажимаю 10 запросов за 1 секунду и получаю 503 временную службу недоступную ошибку для 6 запросов и 4 запроса успешно. мой вопрос в том, является ли результат одинаковым с nodelay и без nodelay, то в чем заключается использование опции nodelay.nginx: что такое nodelay в модуле запроса http-запроса?

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; 
limit_req zone=one burst=2 nodelay; 

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; 
limit_req zone=one burst=2 ; 
+0

Посмотрите время последнего успешного запроса. –

+0

не могли бы вы объяснить это вкратце. –

ответ

1

Давайте этот конфиг:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; 

server { 
    listen 127.0.0.1:81; 

    location/{ 
     limit_req zone=one burst=5; 
     echo 'OK'; 
    } 

    location /nodelay { 
     limit_req zone=one burst=5 nodelay; 
     echo 'OK'; 
    } 
} 

и проверить его с NODELAY

$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/nodelay 
     done. 

Transactions:     6 hits 
Availability:    60.00 % 
Elapsed time:    0.01 secs 
Data transferred:   0.00 MB 
Response time:    0.00 secs 
Transaction rate:   600.00 trans/sec 
Throughput:    0.09 MB/sec 
Concurrency:    0.00 
Successful transactions:   6 
Failed transactions:    4 
Longest transaction:   0.00 
Shortest transaction:   0.00 

и без NODELAY

$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/ 
     done. 

Transactions:     6 hits 
Availability:    60.00 % 
Elapsed time:    5.00 secs 
Data transferred:   0.00 MB 
Response time:    2.50 secs 
Transaction rate:   1.20 trans/sec 
Throughput:    0.00 MB/sec 
Concurrency:    3.00 
Successful transactions:   6 
Failed transactions:    4 
Longest transaction:   5.00 
Shortest transaction:   0.00 

Они оба прошло 6 запроса, покупку с nodelay процессом Nginx всех разрывного запросов мгновенно и без этой опции Nginx делает чрезмерные запросы ждать так, что общая ставка будет не более 1 запроса в секунду и последний успешный запрос потребовалось 5 секунд.

EDIT: rate=6r/s Фактически означает один запрос в 1/6 секунды. Так что если вы отправляете запрос 6 одновременно вы получите 5 из них с 503.

Существует хороший ответ с «ведром» объяснение https://serverfault.com/a/247302/211028

+0

В чем разница между limit_req_zone $ binary_remote_addr zone = one: 10m rate = 1r/s; limit_req zone = один busts 5 nodelay и limit_req_zone $ binary_remote_addr zone = one: 10m rate = 6r/s; limit_req zone = one –

0

TL; DR: Опция NODELAY полезна, если вы хотите наложить ограничение скорости, не ограничивая допустимый интервал между запросами.

Там в новой документации от Nginx с примерами, который отвечает следующим образом: https://www.nginx.com/blog/rate-limiting-nginx/

Вот соответствующая часть. Принимая во внимание:

параметр
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; 

location /login/ { 
    limit_req zone=mylimit burst=20; 
    ... 
} 

Всплеск определяет, сколько запросов клиент может сделать в превышение скорости, указанной зоне (с нашей выборки mylimit зоны, ограничение скорости составляет 10 запросов в секунду, или 1 каждые 100 миллисекунд). Запрос, который приходит раньше, чем 100 миллисекунд после предыдущего ставится в очередь, и здесь мы устанавливаем размер очереди до 20.

Это означает, что если 21 запросов поступают из заданного IP-адреса одновременно, NGINX перенаправляет первую на восходящий сервер группу сразу и помещает оставшиеся 20 в очередь. Затем он отправляет запрос в очереди каждые 100 миллисекунд и возвращает 503 в клиенту только в том случае, если входящий запрос делает число запросов в очереди более 20.

Если добавить NODELAY:

location /login/ { 
    limit_req zone=mylimit burst=20 nodelay; 
    ... 
} 

С помощью параметра NODELAY, NGINX еще выделяет слоты в очереди по параметру разрывного и навязывает настроенный предел скорости , но не расстоянием из-за пересылки запросов в очередь. Вместо этого, когда запрос поступает «слишком скоро», NGINX пересылает его сразу же, пока в очереди есть доступный для него слот. Он отмечает этот слот как «взятый» и не освобождает его для использования другим запросом до тех пор, пока не пройдет соответствующее время (в нашем примере после 100 миллисекунд).

Смежные вопросы