Назад | Перейти на главную страницу

Применить ограничения скорости nginx к определенным IP-адресам и еще одно ограничение скорости к другим

В нашей конфигурации Nginx сейчас есть это: -

limit_req_zone $binary_remote_addr zone=two:10m rate=15r/m;
limit_req zone=two burst=5 nodelay;

Теперь мы хотим изменить это так, чтобы это ограничение скорости применялось к определенным IP-адресам, а затем иметь другое ограничение скорости, которое применяется к другим, которое является немного менее строгим.

geo $limited_net {
    default      0;
    111.222.333.444  1;
}

map $limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;  
}

limit_req_zone  $addr_to_limit  zone=two:10m  rate=15r/m;


geo $less_limited_net {
    default      1;
    111.222.333.444  0;
}

map $less_limited_net $addr_to_limit {
    0  "";
    1  $binary_remote_addr;
}

limit_req_zone  $addr_to_limit  zone=three:10m  rate=25r/m;

Таким образом, на трафик с IP 111.222.333.444 будет влиять 1-й более строгий лимит скорости, а не второй менее строгий.

Мы также используем cloudflare и устанавливаем ip-адреса cloudflare в /etc/nginx/cloudflare.conf, как это https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-

Это даст мне то, что я хочу?

Или должно быть больше так?

geo $limited_net { 
default 0; 
111.222.333.444 1; 
} 

map $limited_net $addr_to_limit { 
0 ""; 
1 $binary_remote_addr; 
} 


limit_req_zone $addr_to_limit zone=two:10m rate=15r/m; 
limit_req_zone $binary_remote_addr; zone=three:10m rate=25r/m;

Несмотря на то, что это старый вопрос, он может быть актуален для людей, которые столкнутся с ним в будущем:

Вы можете использовать несколько директив limit_req_zone для обработки запросов из разных источников с разной скоростью:

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

 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.

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req