<!-- review: finished -->

<a id="http-limit-req"></a>

# Limit Req

Позволяет ограничить скорость обработки запросов по заданному ключу или, как частный случай, скорость обработки запросов, поступающих с одного IP-адреса. Ограничение обеспечивается с помощью метода "leaky bucket".

<a id="configuration-example-26"></a>

## Пример конфигурации

```nginx
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }
```

<a id="directives-27"></a>

## Директивы

<a id="index-0"></a>

<a id="limit-req-1"></a>

### limit_req

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req` `zone=`название [`burst=`число] [nodelay | `delay=`число];   |
|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|
| По умолчанию                                                                             | —                                                                        |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                                                   |

Задает зону разделяемой памяти (`zone`) и максимальный размер всплеска запросов (`burst`). Если скорость поступления запросов превышает описанную в зоне, то их обработка задерживается так, чтобы запросы обрабатывались с заданной скоростью. Избыточные запросы задерживаются до тех пор, пока их число не превысит максимальный размер всплеска. При превышении запрос завершается с ошибкой. По умолчанию максимальный размер всплеска равен нулю. Например, директивы

```nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location /search/ {
        limit_req zone=one burst=5;
    }
```

позволяют в среднем не более 1 запроса в секунду со всплесками не более 5 запросов.

Если же избыточные запросы в пределах лимита всплесков задерживать не требуется, то следует использовать параметр `nodelay`:

```nginx
limit_req zone=one burst=5 nodelay;
```

Параметр `delay` задает лимит, по достижении которого избыточные запросы задерживаются. Значение по умолчанию равно нулю и означает, что задерживаются все избыточные запросы.

Директив `limit_req` может быть несколько. Например, следующая конфигурация ограничивает скорость обработки запросов, поступающих с одного IP-адреса, и в то же время ограничивает скорость обработки запросов одним виртуальным сервером:

```nginx
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`.

<a id="index-1"></a>

<a id="limit-req-dry-run"></a>

### limit_req_dry_run

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_dry_run` `on` | `off`;   |
|------------------------------------------------------------------------------------------|-------------------------------------|
| По умолчанию                                                                             | `limit_req_dry_run off;`            |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location              |

Включает режим пробного запуска. В данном режиме скорость обработки запросов не ограничивается, однако в [зоне разделяемой памяти](#limit-req-zone) текущее число избыточных запросов учитывается как обычно.

<a id="index-2"></a>

<a id="limit-req-log-level"></a>

### limit_req_log_level

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_log_level` `info` | `notice` | `warn` | `error`;   |
|------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| По умолчанию                                                                             | `limit_req_log_level error;`                                  |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location                                        |

Задает желаемый уровень записи в лог случаев отказа в обработке запросов при превышении скорости и случаев задержек при обработке запроса. Задержки записываются в лог с уровнем на единицу меньшим, чем отказы, например, если указано `limit_req_log_level notice;`, то задержки будут записываться в лог на уровне `info`.

<a id="index-3"></a>

<a id="limit-req-status"></a>

### limit_req_status

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_status` код;   |
|------------------------------------------------------------------------------------------|---------------------------|
| По умолчанию                                                                             | `limit_req_status 503;`   |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http, server, location    |

Позволяет переопределить код ответа, используемый при отклонении запросов.

<a id="index-4"></a>

<a id="limit-req-zone"></a>

### limit_req_zone

| [Синтаксис](https://angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_zone` ключ `zone=`название:размер `rate=`скорость;   |
|------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
| По умолчанию                                                                             | —                                                               |
| [Контекст](https://angie.software//angie/docs/configuration/configfile.md#configfile)    | http                                                            |

Задает параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. Состояние в частности хранит текущее число избыточных запросов. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.

Пример использования:

```nginx
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 байт.

При переполнении зоны удаляется наименее востребованное состояние. Если и это не позволяет создать новое состояние, запрос завершается с [ошибкой](#limit-req-status).

Скорость `rate` задается в запросах в секунду (r/s). Если же нужна скорость меньше одного запроса в секунду, то она задается в запросах в минуту (r/m), например, ползапроса в секунду — это 30r/m.

<a id="built-in-variables-3"></a>

## Встроенные переменные

<a id="v-limit-req-status"></a>

### `$limit_req_status`

хранит результат ограничения скорости поступления запросов: `PASSED`, `DELAYED`, `REJECTED`, `DELAYED_DRY_RUN` или `REJECTED_DRY_RUN`
