nginx可以通過limit_conn_zone和limit_req_zone兩個組件來限制客戶端訪問服務端的目錄和文件的頻率和次數,能夠抵擋住部分cc、ddos攻擊。
限制訪問頻率:
http{
...
#定義一個名為allips的limit_req_zone用來存儲session,大小是10M內存,
#以$binary_remote_addr 為key,限制平均每秒的請求為20個,
#1M能存儲16000個狀態,rete的值必須為整數,
#如果限制兩秒鍾一個請求,可以設置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
...
server{
...
location {
...
#限制每ip每秒不超過20個請求,漏桶數burst為5
#brust的意思就是當每秒超過20個請求時,5個以內的請求會被延遲訪問,超過5個的直接返回503
#nodelay,設置該選項,將嚴格使用平均速率限制請求數,超過請求頻率的直接返回503
limit_req zone=allips burst=5 nodelay;
...
}
...
}
...
}
#注意配置的作用域
注意:發送請求頻率高於(1000ms/20r)ms/r 直接返回503
限制並發連接數:
http{
...
#定義一個名為all_zone的limit_zone,大小10M內存來存儲session,
#nginx 1.18以后用limit_conn_zone替換了limit_conn
limit_conn_zone all_zone $binary_remote_addr 10m;
...
server{
...
location {
...
limit_conn all_zone 20; #連接數限制
#帶寬限制,對單個連接限數,限制帶寬上限500k
limit_rate 500k;
...
}
...
}
...
}
配置訪問白名單:
nginx需支持geo模塊;
http{
...
geo $limited {
default 1;
127.0.0.1 0;
172.31.105.247/32 0;
include /etc/nginx/whiteip;
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=allips:20m rate=100r/m;
...
server{
...
location {
...
limit_req zone=allips burst=100 ;
...
}
}
/etc/nginx/whiteip:
18.195.104.195/32 0;
18.196.102.154/32 0;
54.93.227.18/32 0;
如果nginx上層還有ELB(aws)或SLB(aliyun),需在nginx配置中添加:
set_real_ip_from 172.31.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#配置對於從172.31.0.0/16 這個ip段過來的請求,remote_addr的字段的值從 X-Forwarded-For 中取