Ограничение скорости обработки запросов в nginx

NGINX великолепен! Вот только его документация по ограничению скорости обработки запросов показалась мне, как бы это сказать, несколько ограниченной. Поэтому я решил написать это руководство по ограничению скорости обработки запросов (rate-liming) и шейпингу трафика (traffic shaping) в NGINX. Мы собираемся: описать директивы NGINX, разобраться с accept/reject-логикой NGINX, визуализировать обработку всплесков трафика на различных настройках. Директивы NGINX по ограничению скорости обработки запросов В этой статье мы будем говорить о ngx_http_limit_req_module, в котором реализованы директивы limit_req_zone, limit_req, limit_req_status и limit_req_level. Они позволяют управлять значением кода состояния HTTP-запроса для отклоненных (rejected) запросов, а также логированием этих отказов. Чаще всего путаются именно в логике отклонения запроса. Сначала нужно разобраться с директивой limit_req, которой требуется параметр zone. У него также есть необязательные параметры burst и nodelay. Здесь используются следующие концепции: zone определяет «ведро» (bucket) — разделяемое пространство, в котором считаются входящие запросы. Все запросы, попавшие в одно «ведро», будут посчитаны и обработаны в его разрезе. Этим достигается возможность установки ограничений на основе URL, IP-адресов и т. д. burst — необязательный параметр. Будучи установленным, он определяет количество запросов, которое может быть обработано сверх установленного базового ограничения скорости. Важно понимать, что burst — это абсолютная величина количества запросов, а не скорость. nodelay — также необязательный параметр, который используется совместно с burst. Ниже мы разберемся, зачем он нужен. Каким образом NGINX принимает решение о принятии или отклонении запроса? При настройке зоны задается ее скорость. Например, при 300r/m будет принято 300 запросов в минуту, а при 5r/s — 5 запросов в секунду. ...

7 червня 2019 · 7 хвилин · 1337 слів · dimetrius