<!-- review: finished -->

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

# Limit Req

O módulo é usado para limitar a taxa de processamento de requisições por uma chave definida, em particular, a taxa de processamento de requisições vindas de um único endereço IP. A limitação é feita usando o método "leaky bucket".

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

## Exemplo de Configuração

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

## Diretivas

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

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

### limit_req

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req` `zone=`name [`burst=`number] [nodelay | `delay=`number];   |
|-------------------------------------------------------------------------------------------|------------------------------------------------------------------------|
| Padrão                                                                                    | —                                                                      |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                                                 |

Define a zona de memória compartilhada e o tamanho máximo de rajada de requisições. Se a taxa de requisições exceder a taxa configurada para uma zona, seu processamento é atrasado de forma que as requisições sejam processadas a uma taxa definida. Requisições excessivas são atrasadas até que seu número exceda o tamanho máximo de rajada, caso em que a requisição é terminada com um [erro](#limit-req-status). Por padrão, o tamanho máximo de rajada é igual a zero. Por exemplo, as diretivas

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

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

permitem não mais que 1 requisição por segundo em média, com rajadas não excedendo 5 requisições.

Se o atraso de requisições excessivas enquanto as requisições estão sendo limitadas não for desejado, o parâmetro `nodelay` deve ser usado:

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

O parâmetro `delay` especifica um limite no qual requisições excessivas passam a ser atrasadas. O valor padrão é zero, ou seja, todas as requisições excessivas são atrasadas.

Pode haver várias diretivas `limit_req`. Por exemplo, a seguinte configuração limitará a taxa de processamento de requisições vindas de um único endereço IP e, ao mesmo tempo, a taxa de processamento de requisições pelo servidor virtual:

```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;
}
```

Essas diretivas são herdadas do nível de configuração anterior se e somente se não houver diretivas `limit_req` definidas no nível atual.

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

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

### limit_req_dry_run

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_dry_run` `on` | `off`;   |
|-------------------------------------------------------------------------------------------|-------------------------------------|
| Padrão                                                                                    | `limit_req_dry_run off;`            |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location              |

Habilita o modo de execução a seco. Neste modo, a taxa de processamento de requisições não é limitada, porém, na [zona de memória compartilhada](#limit-req-zone), o número de requisições excessivas é contabilizado como de costume.

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

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

### limit_req_log_level

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_log_level` `info` | `notice` | `warn` | `error`;   |
|-------------------------------------------------------------------------------------------|---------------------------------------------------------------|
| Padrão                                                                                    | `limit_req_log_level error;`                                  |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                                        |

Define o nível de log desejado para casos quando o servidor se recusa a processar requisições devido ao excesso de taxa, ou atrasa o processamento de requisições. O nível de log para atrasos é um ponto menor que para recusas; por exemplo, se `limit_req_log_level notice` for especificado, atrasos são registrados com o nível `info`.

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

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

### limit_req_status

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_status` code;   |
|-------------------------------------------------------------------------------------------|----------------------------|
| Padrão                                                                                    | `limit_req_status 503;`    |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location     |

Define o código de status a ser retornado em resposta a requisições rejeitadas.

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

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

### limit_req_zone

| [Sintaxe](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)   | `limit_req_zone` key `zone=`name:size `rate=`rate;   |
|-------------------------------------------------------------------------------------------|------------------------------------------------------|
| Padrão                                                                                    | —                                                    |
| [Contexto](https://pt.angie.software//angie/docs/configuration/configfile.md#configfile)  | http                                                 |

Define parâmetros para uma zona de memória compartilhada que manterá estados para várias chaves. Em particular, o estado armazena o número atual de requisições excessivas. A chave pode conter texto, variáveis e sua combinação. Requisições com valor de chave vazio não são contabilizadas.

Exemplo de uso:

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

Aqui, os estados são mantidos em uma zona de 10 megabytes `one`, e uma taxa média de processamento de requisições para esta zona não pode exceder 1 requisição por segundo.

Um endereço IP do cliente serve como chave. Note que ao invés de `$remote_addr`, a variável `$binary_remote_addr` é usada aqui.

O tamanho da variável `$binary_remote_addr` é sempre 4 bytes para endereços IPv4 ou 16 bytes para endereços IPv6. O estado armazenado sempre ocupa 64 bytes em plataformas de 32 bits e 128 bytes em plataformas de 64 bits.

Uma zona de um megabyte pode manter cerca de 16 mil estados de 64 bytes ou cerca de 8 mil estados de 128 bytes.

Se o armazenamento da zona for esgotado, o estado usado menos recentemente é removido. Se mesmo após isso um novo estado não puder ser criado, a requisição é terminada com um [erro](#limit-req-status).

A `rate` é especificada em requisições por segundo (r/s). Se uma taxa de menos de uma requisição por segundo for desejada, ela é especificada em requisições por minuto (r/m). Por exemplo, meia requisição por segundo é 30r/m.

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

## Variáveis Integradas

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

### `$limit_req_status`

mantém o resultado da limitação da taxa de processamento de requisições: `PASSED`,
`DELAYED`, `REJECTED`, `DELAYED_DRY_RUN`, ou
`REJECTED_DRY_RUN`
