Nginx并發(fā)請求過高導(dǎo)致請求超時的問題

一、問題

昨晚(2020-07-09)八點左右,生產(chǎn)運行的APP大面積上報請求超時,無法獲取數(shù)據(jù),顯示網(wǎng)絡(luò)連接錯誤等。經(jīng)過簡單測試,發(fā)現(xiàn)并不是如用戶所說的APP完全無法與服務(wù)器通訊,偶爾請求又能正常返回。
登錄后臺后,直接查看系統(tǒng)連接數(shù),發(fā)現(xiàn)并發(fā)數(shù)較高,等待處理的請求也很多,造成了網(wǎng)絡(luò)阻塞;

$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回結(jié)果一般如下:
CLOSED:無連接是活動的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個連接請求已經(jīng)到達(dá),等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉

二、處理

分析可能是有類似爬蟲的程序在對我們的系統(tǒng)進(jìn)行掃描。由于系統(tǒng)并沒有特別高并發(fā)的需求(小眾應(yīng)用),所以沒有所謂的高并發(fā)架構(gòu),但應(yīng)用服務(wù)端采用的是Nginx,故決定限制一下限制客戶端的訪問頻次和訪問次數(shù)。

?Nginx可以通過ngx_http_limit_conn_modulengx_http_limit_req_module配置來限制ip在同一時間段的訪問次數(shù):

ngx_http_limit_conn_module

可以根據(jù)設(shè)定的條件來限定客戶端(單一ip)的并發(fā)訪問,使用limit_conn_zone和limit_conn指令。

1、在nginx.conf里的http{}里加上如下代碼:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

2、在需要限制并發(fā)數(shù)和下載帶寬的網(wǎng)站配置server{}里加上如下代碼:
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 100k;

參數(shù)明下:
$binary_remote_addr 限制同一客戶端ip地址;
$server_name                限制同一server最大并發(fā)數(shù);
limit_conn                  限制并發(fā)連接數(shù);
limit_rate                  限制下載速度;

?

ngx_http_limit_req_module

可以根據(jù)設(shè)定的條件來限定客戶端(單一ip)的訪問頻率,使用limit_req_zone和limit_req指令。

1、在nginx.conf里的http{}里加上如下代碼:

#定義一個名為one的limit_req_zone用來存儲session,大小是10M內(nèi)存,  
#以$binary_remote_addr / $server_name 為key,限制平均每秒的請求為10個,
#1m能存儲16000個狀態(tài),rete的值必須為整數(shù),
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

2、在需要限制并發(fā)數(shù)和下載帶寬的網(wǎng)站配置server{}里加上如下代碼:
limit_req zone=perip burst=5 nodelay;   #漏桶數(shù)為5個,也就是隊列數(shù),nodelay:不啟用延遲.
limit_req zone=perserver burst=10;    #限制nginx的處理速率為每秒10個
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容