É realmente melhor evitar o uso da diretiva "if". Quando a chave em limit_req_zone (e limit_conn_zone) estiver vazia, os limites não serão aplicados. Você pode usar isso em conjunto com os módulos de mapa e geográfico para criar uma lista de permissões de IPs em que os limites da aceleração não são aplicados.
Este exemplo mostra como configurar um limite para solicitações simultâneas e taxa de solicitações de um único IP.
http {
geo $whitelist {
default 0;
# CIDR in the list below are not limited
1.2.3.0/24 1;
9.10.11.12/32 1;
127.0.0.1/32 1;
}
map $whitelist $limit {
0 $binary_remote_addr;
1 "";
}
# The directives below limit concurrent connections from a
# non-whitelisted IP address to five
limit_conn_zone $limit zone=connlimit:10m;
limit_conn connlimit 5;
limit_conn_log_level warn; # logging level when threshold exceeded
limit_conn_status 503; # the error code to return
# The code below limits the number requests from a non-whitelisted IP
# to one every two seconds with up to 3 requests per IP delayed
# until the average time between responses reaches the threshold.
# Further requests over and above this limit will result
# in an immediate 503 error.
limit_req_zone $limit zone=one:10m rate=30r/m;
limit_req zone=one burst=3;
limit_req_log_level warn;
limit_req_status 503;
As diretivas de zona devem ser colocadas no nível http, no entanto, as outras diretivas podem ser colocadas mais abaixo, por exemplo, no servidor ou no nível do local para limitar seu escopo ou adequar ainda mais os limites.
Para obter mais informações, consulte a documentação Nginx ngx_http_limit_req_module e ngx_http_limit_conn_module