Spec-Zone.ru › nginx

Модуль 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API