Модуль ngx_http_limit_req_module
Пример конфигурации Директивы limit_req limit_req_log_level limit_req_status limit_req_zone |
Модуль ngx_http_limit_req_module
(0.7.21) позволяет
ограничить скорость обработки запросов по заданному ключу или,
как частный случай, скорость обработки запросов, поступающих
с одного IP-адреса.
Ограничение обеспечивается с помощью метода “leaky bucket”.
Пример конфигурации
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; }
Директивы
Синтаксис: |
limit_req
|
---|---|
Умолчание: | — |
Контекст: |
http , server , location |
Задаёт зону разделяемой памяти (zone
)
и максимальный размер всплеска запросов (burst
).
Если скорость поступления запросов превышает описанную в зоне,
то их обработка задерживается так, чтобы запросы обрабатывались
с заданной скоростью.
Избыточные запросы задерживаются до тех пор, пока их число
не превысит максимальный размер всплеска.
При превышении запрос завершается с ошибкой
503 (Service Temporarily Unavailable).
По умолчанию максимальный размер всплеска равен нулю.
Например, директивы
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /search/ { limit_req zone=one burst=5; }
позволяют в среднем не более 1 запроса в секунду со всплесками не более 5 запросов.
Если же избыточные запросы в пределах лимита всплесков задерживать
не требуется, то следует использовать параметр nodelay
:
limit_req zone=one burst=5 nodelay;
Директив limit_req
может быть несколько.
Например, следующая конфигурация ограничивает скорость обработки запросов,
поступающих с одного IP-адреса, и в то же время ограничивает
скорость обработки запросов одним виртуальным сервером:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; server { ... limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10; }
Директивы наследуются с предыдущего уровня при условии, что на данном уровне
не описаны свои директивы limit_req
.
Синтаксис: |
limit_req_log_level
|
---|---|
Умолчание: |
limit_req_log_level error; |
Контекст: |
http , server , location |
Эта директива появилась в версии 0.8.18.
Задаёт желаемый уровень записи в лог
случаев отказа в обработке запросов при превышении скорости
и случаев задержек при обработке запроса.
Задержки записываются в лог с уровнем на единицу меньшим, чем отказы,
например, если указано “limit_req_log_level notice
”,
то задержки будут записываться в лог на уровне info
.
Синтаксис: |
limit_req_status |
---|---|
Умолчание: |
limit_req_status 503; |
Контекст: |
http , server , location |
Эта директива появилась в версии 1.3.15.
Позволяет переопределить код ответа, используемый при отклонении запросов.
Синтаксис: |
limit_req_zone
|
---|---|
Умолчание: | — |
Контекст: |
http |
Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. Состояние в частности хранит текущее число избыточных запросов. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.
До версии 1.7.6 в качестве ключа можно было задать ровно одну переменную.
Пример использования:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
В данном случае состояния хранятся в зоне “one” размером 10 мегабайт, и средняя скорость обработки запросов для этой зоны не может превышать 1 запроса в секунду.
В качестве ключа используется IP-адрес клиента.
Обратите внимание, что вместо переменной $remote_addr
используется
переменная $binary_remote_addr
, позволяющая уменьшить
размер состояния до 64 байт.
В зоне размером 1 мегабайт может разместиться около 16 тысяч состояний
размером 64 байта.
При переполнении зоны в ответ на последующие запросы сервер будет
возвращать ошибку
503 (Service Temporarily Unavailable).
Скорость задаётся в запросах в секунду (r/s). Если же нужна скорость меньше одного запроса в секунду, то она задаётся в запросах в минуту (r/m), например, ползапроса в секунду — это 30r/m.