nginx限制某請(qǐng)求并發(fā)數(shù)
問(wèn)題描述:網(wǎng)站前后臺(tái)都返回502狀態(tài)碼,檢查網(wǎng)絡(luò)攻擊并不算高,通過(guò)日志分析發(fā)現(xiàn)大量/ContentManage/Ajax/GetPreAndNextPublicInformation或/ContentManage/Ajax/GetPrevAndNextContent請(qǐng)求,雖然不會(huì)對(duì)網(wǎng)站安全造成影響,而且是會(huì)直接中斷跳出的,但是請(qǐng)求比較集中,造成了其他正常請(qǐng)求的響應(yīng)速度變慢
解決方法:通過(guò)nginx限制具體url的訪問(wèn)并發(fā)數(shù)
在nginx的http{}節(jié)下添加
#并發(fā)限制
limit_conn_zone $binary_remote_addr zone=addr:20m;
limit_req_zone $binary_remote_addr zone=one:20m rate=1r/s;
limit_conn_zone:定義一個(gè)名為 addr 的共享內(nèi)存區(qū)(20MB),用于記錄每個(gè)客戶端 IP( $ binary_remote_addr)的并發(fā)連接數(shù)。
limit_req_zone:定義一個(gè)名為 one 的共享內(nèi)存區(qū)(20MB),用于記錄每個(gè)客戶端 IP 的請(qǐng)求頻率,限制為 1 次/秒。
然后在 location ~* ^/ContentManage/Ajax/GetPreAndNextPublicInformation 和/ContentManage/Ajax/GetPrevAndNextContent下添加:limit_conn addr 1; # 同一 IP 最多 1 個(gè)并發(fā)連接limit_req zone=one nodelay; # 請(qǐng)求速率限制為 1r/s,突發(fā)請(qǐng)求不延遲(直接處理或拒絕)
可以根據(jù)實(shí)際需求看是否添加burst參數(shù)
limit_req zone=one burst=3 nodelay; #burst=3 表示允許最多 3 個(gè)突發(fā)請(qǐng)求
注意默認(rèn)限流/限連失敗返回 503狀態(tài)碼,可自行定義錯(cuò)誤代碼。