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

Ограничение скорости Nginx - замедление только при достижении потолка

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

limit_req_zone $binary_remote_addr zone=PHPUtilities:10m rate=60r/m;

Я применил эту зону к блоку местоположения с пакетом 20. Все выглядело нормально, но я был удивлен, увидев, что у меня быстрая скорость замедления, когда сервер отказывался отвечать в течение 5 секунд или около того. Похоже, что nginx принимает 60 запросов в минуту и ​​делит их до 1 запроса в секунду. Таким образом, если мы загрузим несколько скриптов одновременно, nginx сразу обработает первый запрос, а затем задержит остальные.

Я бы предпочел, чтобы он вел себя как «хорошо, они получают 60 бесплатных запросов в минуту. Только один раз они достигают 60, мы начнем их ограничивать, сначала замедляя следующие 20 запросов (всплеск). После этого все будет плохо, пока они не перестанут запрашивать так много или не упадут ниже предела 60 в минуту ".

Есть ли способ сделать это?

PS. Я случайно сначала задал этот вопрос о переполнении стека, но потом понял, что здесь он более уместен. :(

Я думаю, ты хочешь использовать nodelay параметр, а также burst:

location /login/ {
    limit_req_zone $binary_remote_addr zone=PHPUtilities:10m rate=60r/m burst=20 nodelay;

    proxy_pass http://my_upstream;
}

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

Из https://www.nginx.com/blog/rate-limiting-nginx/.