Veja como isso é feito em um dos meus sites. Primeiro, usamos o módulo geo
para definir uma variável que será usada para identificar endereços limitados:
geo $slow {
default 0;
include /etc/nginx/conf.d/slowlist;
}
O arquivo de lista lenta é assim:
192.168.0.0/24 1;
192.168.10.0/24 1;
e assim por diante (endereços IP são apenas exemplos, é claro). Então nós definimos limites de velocidade:
limit_req_zone $binary_remote_addr zone=fast:1m rate=1000r/s;
limit_req_zone $binary_remote_addr zone=slow:10m rate=20r/m;
Agora, temos que atribuir req_zones a cada endereço IP. Dentro do local necessário, verificamos a variável $ slow, e se for igual a 1, redirecionamos para a localização @slow (usando o erro fictício 555):
recursive_error_pages on;
error_page 555 = @slow;
if ($slow = 1) {
return 555;
}
limit_req zone=fast burst=10000 nodelay;
Então seguem as regras normais, incluindo root, index, fastcgi *, whatever. Zona de limite 'fast' será usada aqui. E, finalmente, definimos location @slow, onde a zona limite 'slow' será usada:
location @slow {
limit_req zone=slow burst=5 nodelay;
Então seguem as regras normais, incluindo root, index, fastcgi *, o que quer que seja.
Assim, os pedidos habituais são processados na localização normal, mas todos os outros são redirecionados para a localização @slow.