Nginx · 2 min read · Jan 23, 2026

Limitação de Taxa com nginx

Este artigo explica como usar o módulo HttpLimitReqModule do nginx para limitar o número de solicitações para uma determinada sessão. Isso é útil, por exemplo, se o seu site estiver sendo atacado por um bot fazendo várias solicitações por segundo e, assim, aumentando a carga do seu servidor. Com o ngx_http_limit_req_module, você pode definir um limite de taxa e, se um visitante exceder essa taxa, ele receberá um erro 503.

1 Usando o HttpLimitReqModule (ngx_http_limit_req_module)

Abra seu nginx.conf…

nano /etc/nginx/nginx.conf

… e defina uma área onde os estados da sessão são armazenados - isso deve ir dentro do contêiner http {}:

http {
    [...]
    limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
    [...]
}

Essa área é chamada de one e é alocada 10MB de armazenamento. Em vez da variável $remote_addr, usamos a variável $binary_remote_addr que reduz o tamanho do estado para 64 bytes. Pode haver cerca de 16.000 estados em uma zona de 1MB, então 10MB permitem cerca de 160.000 estados, então isso deve ser suficiente para seus visitantes. A taxa é limitada a uma solicitação por segundo. Observe que você deve usar valores inteiros aqui, então se você quiser definir o limite para meio pedido por segundo, você usaria 30r/m (30 solicitações por minuto).

Para colocar esse limite em funcionamento, usamos a diretiva limit_req. Você pode usar essa diretiva em contêineres http {}, server {}, e location {}, mas na minha opinião, é mais útil em contêineres location {} que passam solicitações para seus servidores de aplicativos (PHP-FPM, mongrel, etc.) porque, caso contrário, se você carregar uma única página com muitas imagens, CSS e arquivos JavaScript, provavelmente você excederia o limite de taxa dado com uma única solicitação de página.

Então, vamos colocar isso em um contêiner location ~ .php$ {}:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5;
        }
[...]

limit_req zone=one burst=5; especifica que esse limite de taxa pertence à área de armazenamento da sessão que definimos antes (por causa de zone=one), o que significa que o limite de taxa é 1r/s. Você pode imaginar o significado de burst como uma espécie de fila. Isso significa que se você exceder o limite de taxa, as solicitações seguintes são atrasadas, e somente se você tiver mais solicitações esperando na fila do que especificado no parâmetro burst, você receberá um erro 503 (por exemplo, assim:

Limite de taxa do Nginx aplicado.

).

Se você não quiser usar essa fila (ou seja, entregar um 503 imediatamente se alguém exceder o limite de taxa), você deve usar a opção nodelay:

[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                limit_req zone=one burst=5 nodelay;
        }
[...]

Não se esqueça de recarregar o nginx para que suas alterações tenham efeito:

service nginx reload

2 Links

Sobre o Autor

Falko Timme é o proprietário da Timme Hosting (hospedagem web nginx ultra-rápida). Ele é o principal mantenedor do HowtoForge (desde 2005) e um dos desenvolvedores principais do ISPConfig (desde 2000). Ele também contribuiu para o livro da O’Reilly “Administração de Sistema Linux”.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.