一羡儿、問題
昨晚(2020-07-09)八點(diǎn)左右事示,生產(chǎn)運(yùn)行的APP大面積上報(bào)請(qǐng)求超時(shí)早像,無法獲取數(shù)據(jù),顯示網(wǎng)絡(luò)連接錯(cuò)誤等肖爵。經(jīng)過簡(jiǎn)單測(cè)試卢鹦,發(fā)現(xiàn)并不是如用戶所說的APP完全無法與服務(wù)器通訊,偶爾請(qǐng)求又能正常返回劝堪。
登錄后臺(tái)后法挨,直接查看系統(tǒng)連接數(shù),發(fā)現(xiàn)并發(fā)數(shù)較高幅聘,等待處理的請(qǐng)求也很多,造成了網(wǎng)絡(luò)阻塞窃植;
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回結(jié)果一般如下:
CLOSED:無連接是活動(dòng)的或正在進(jìn)行
LISTEN:服務(wù)器在等待進(jìn)入呼叫
SYN_RECV:一個(gè)連接請(qǐng)求已經(jīng)到達(dá)帝蒿,等待確認(rèn)
SYN_SENT:應(yīng)用已經(jīng)開始,打開一個(gè)連接
ESTABLISHED:正常數(shù)據(jù)傳輸狀態(tài)
FIN_WAIT1:應(yīng)用說它已經(jīng)完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時(shí)嘗試關(guān)閉
TIME_WAIT:另一邊已初始化一個(gè)釋放
LAST_ACK:等待所有分組死掉
二巷怜、處理
分析可能是有類似爬蟲的程序在對(duì)我們的系統(tǒng)進(jìn)行掃描葛超。由于系統(tǒng)并沒有特別高并發(fā)的需求(小眾應(yīng)用)暴氏,所以沒有所謂的高并發(fā)架構(gòu),但應(yīng)用服務(wù)端采用的是Nginx绣张,故決定限制一下限制客戶端的訪問頻次和訪問次數(shù)答渔。
?Nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時(shí)間段的訪問次數(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{}里加上如下代碼:
#定義一個(gè)名為one的limit_req_zone用來存儲(chǔ)session娶牌,大小是10M內(nèi)存奔浅,
#以$binary_remote_addr / $server_name 為key,限制平均每秒的請(qǐng)求為10個(gè),
#1m能存儲(chǔ)16000個(gè)狀態(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個(gè)累榜,也就是隊(duì)列數(shù)营勤,nodelay:不啟用延遲.
limit_req zone=perserver burst=10; #限制nginx的處理速率為每秒10個(gè)