為了防止服務(wù)器被惡意采集或ddos攻擊給搞死, 所以給限個速。
這里主要使用Nginx的ngx_http_limit_req_module和ngx_http_limit_conn_module來控制訪問量.
這兩個模塊在Nginx中已內(nèi)置, 在nginx.conf文件中加入相應(yīng)的配置即可使用。
如下所示(附帶白名單功能),對所有的PHP頁面的請求進(jìn)行限速:
http {
#geot和map兩段用于處理限速白名單,map段映射名單到$limit,處于geo內(nèi)的IP將被映射為空值,否則為其IP地址。
#limit_conn_zone和limit_req_zone指令對于鍵為空值的將會被忽略,從而實現(xiàn)對于列出來的IP不做限制
geo $whiteiplist {
default 1;
127.0.0.1 0;
121.199.16.249 0;
}
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
}
#limit_conn_zone定義每個IP的并發(fā)連接數(shù)量
#設(shè)置一個緩存區(qū)保存不同key的狀態(tài),大小10m。使用$limit來作為key,以此限制每個源IP的鏈接數(shù)
limit_conn_zone $limit zone=perip:10m;
#limit_req_zone定義每個IP的每秒請求數(shù)量
#設(shè)置一個緩存區(qū)reqps保存不同key的狀態(tài),大小10m。這里的狀態(tài)是指當(dāng)前的過量請求數(shù)。
#$limit為空值則不限速,否則對應(yīng)的IP進(jìn)行限制每秒5個連接請求。
limit_req_zone $limit zone=reqps:10m rate=5r/s;
server {
listen 80;
server_name www.domain.com;
#只對PHP頁面的請求進(jìn)行限速
location ~ [^/]\.php(/|$)
{
#對應(yīng)limit_conn_zone塊
#限制每IP的PHP頁面請求并發(fā)數(shù)量為5個
limit_conn perip 5;
#對應(yīng)limit_req_zone塊
#限制每IP的每秒的PHP頁面請求次數(shù)為上面定義的rate的值:每秒5個請求,不延遲
limit_req zone=reqps nodelay;
}
}
}