Модуль ngx_http_limit_req_module
Пример конфигурации Директивы limit_req limit_req_dry_run 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
).
Если скорость поступления запросов превышает описанную в зоне,
то их обработка задерживается так, чтобы запросы обрабатывались
с заданной скоростью.
Избыточные запросы задерживаются до тех пор, пока их число
не превысит максимальный размер всплеска.
При превышении запрос завершается с
ошибкой.
По умолчанию максимальный размер всплеска равен нулю.
Например, директивы
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;
Параметр delay
(1.15.7) задаёт лимит,
по достижении которого избыточные запросы задерживаются.
Значение по умолчанию равно нулю и означает,
что задерживаются все избыточные запросы.
Директив 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_dry_run |
---|---|
Умолчание: |
limit_req_dry_run off; |
Контекст: |
http , server , location |
Эта директива появилась в версии 1.17.1.
Включает режим пробного запуска. В данном режиме скорость обработки запросов не ограничивается, однако в зоне разделяемой памяти текущее число избыточных запросов учитывается как обычно.
Синтаксис: |
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
.
Длина значения переменной $binary_remote_addr
всегда
равна 4 байтам для IPv4-адресов или 16 байтам для IPv6-адресов.
При этом размер состояния всегда равен
64 байтам на 32-битных платформах и 128 байтам на 64-битных платформах.
В зоне размером 1 мегабайт может разместиться около 16 тысяч состояний
размером 64 байта или около 8 тысяч состояний размером 128 байт.
При переполнении зоны удаляется наименее востребованное состояние. Если и это не позволяет создать новое состояние, запрос завершается с ошибкой.
Скорость задаётся в запросах в секунду (r/s). Если же нужна скорость меньше одного запроса в секунду, то она задаётся в запросах в минуту (r/m), например, ползапроса в секунду — это 30r/m.
Параметр sync
(1.15.3) разрешает
синхронизацию
данной зоны разделяемой памяти.
Параметр sync
доступен как часть
коммерческой подписки.
Дополнительно, как часть коммерческой подписки, информацию о состоянии каждой такой зоны разделяемой памяти можно получить или сбросить при помощи API начиная с версии 1.17.7.
Встроенные переменные
$limit_req_status
-
хранит результат ограничения скорости поступления запросов (1.17.6):
PASSED
,DELAYED
,REJECTED
,DELAYED_DRY_RUN
илиREJECTED_DRY_RUN