Модуль 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
zone=name
[burst=number]
[nodelay |
delay=number]; |
|---|---|
| По умолчанию: | — |
| Контекст: | http, server, location |
Устанавливает зону общей памяти и максимальный размер пачки запросов. Если скорость запросов превышает конфигурированную для зоны скорость, обработка запросов задерживается таким образом, чтобы запросы обрабатывались с заданной скоростью. Избыточные запросы задерживаются до тех пор, пока их количество не превысит максимальный размер пачки, в этом случае запрос завершается с ошибкой ошибкой. По умолчанию максимальный размер пачки равен нулю. Например, директивы
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 on | off; |
|---|---|
| По умолчанию: | limit_req_dry_run off; |
| Контекст: | http, server, location |
Эта директива появилась в версии 1.17.1.
Включает режим имитации. В этом режиме скорость обработки запросов не ограничена, однако в зоне общей памяти количество избыточных запросов учитывается как обычно.
| Синтаксис: | limit_req_log_level
info |
notice |
warn |
error; |
|---|---|
| По умолчанию: | limit_req_log_level error; |
| Контекст: | http, server, location |
Эта директива появилась в версии 0.8.18.
Устанавливает желаемый уровень логирования в случаях, когда сервер отказывается обрабатывать запросы из-за превышения скорости или задерживает обработку запросов. Уровень логирования для задержек на единицу меньше, чем для отказов; например, если указано «limit_req_log_level notice», задержки регистрируются на уровне info.
| Синтаксис: | limit_req_status code; |
|---|---|
| По умолчанию: | limit_req_status 503; |
| Контекст: | http, server, location |
Эта директива появилась в версии 1.3.15.
Устанавливает код состояния, возвращаемый в ответ на отклоненные запросы.
| Синтаксис: | limit_req_zone
key
zone=name:size
rate=rate
[sync]; |
|---|---|
| По умолчанию: | — |
| Контекст: | http |
Устанавливает параметры зоны общей памяти, которая будет хранить состояния для различных ключей. В частности, состояние хранит текущее количество избыточных запросов. key может содержать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.
До версии 1.7.6 key могла содержать ровно одну переменную.
Пример использования:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
Здесь состояния хранятся в 10-мегабайтной зоне «one», и средняя скорость обработки запросов для этой зоны не должна превышать 1 запрос в секунду.
IP-адрес клиента служит ключом. Обратите внимание, что вместо $remote_addr, здесь используется переменная $binary_remote_addr. Размер переменной $binary_remote_addr всегда составляет 4 байта для IPv4-адресов или 16 байт для IPv6-адресов. Хранимое состояние всегда занимает 64 байта на 32-битных платформах и 128 байт на 64-битных платформах. Зона памяти объёмом один мегабайт может хранить около 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
© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/ngx_http_limit_req_module.html