Nginx按請(qǐng)求速率限速模塊使用的是漏桶算法吮成,即能夠強(qiáng)行保證請(qǐng)求的實(shí)時(shí)處理速度不會(huì)超過(guò)設(shè)置的閾值凭迹。
Nginx官方版本限制IP的連接和并發(fā)分別有兩個(gè)模塊:
limit_req_zone?用來(lái)限制單位時(shí)間內(nèi)的請(qǐng)求數(shù)忆肾,即速率限制,采用的漏桶算法?"leaky bucket"。
limit_req_conn?用來(lái)限制同一時(shí)間連接數(shù),即并發(fā)限制蹂风。
主要配置
http {limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
? ? server {
? ? location /campaign/ {
? ? ? ? ? ? ? ? limit_req zone=perip burst=5 nodelay;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? }
配置說(shuō)明
limit_conn是對(duì)某個(gè)KEY對(duì)應(yīng)的總的網(wǎng)絡(luò)連接數(shù)進(jìn)行限流∏睿可以按照IP來(lái)限制IP維度的總連接數(shù)惠啄,或者按照服務(wù)域名來(lái)限制某個(gè)域名的總連接數(shù)。但是記住不是每一個(gè)請(qǐng)求連接都會(huì)被計(jì)數(shù)器統(tǒng)計(jì)任内,只有那些被Nginx處理的且已經(jīng)讀取了整個(gè)請(qǐng)求頭的請(qǐng)求連接才會(huì)被計(jì)數(shù)器統(tǒng)計(jì)
limit_conn_zone:用來(lái)配置限流KEY撵渡、及存放KEY對(duì)應(yīng)信息的共享內(nèi)存區(qū)域大小族奢;此處的KEY是“binary_remote_addr”其表示IP地址姥闭,也可以使用如binaryremoteaddr”其表示IP地址,也可以使用如server_name作為KEY來(lái)限制域名級(jí)別的最大連接數(shù)越走;
limit_conn_status:配置被限流后返回的狀態(tài)碼棚品,默認(rèn)返回503;
limit_conn_log_level:配置記錄被限流后的日志級(jí)別廊敌,默認(rèn)error級(jí)別
Nginx限流配置
http {
? ? limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
? ? limit_req_zone $server_name zone=perserver:10m rate=10r/s;
? ? limit_req_log_level notice ;
? ? server {
? ? ? ? location /search/ {
? ? ? ? ? ? limit_req zone=perip burst=5 nodelay;
? ? ? ? ? ? limit_req zone=perserver burst=10;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
范例詳解
limit_req_zone [key] zone = [name]:[size] rate=[rate]
limit_req_zone這個(gè)變量只能在HTTP中使用铜跑,limit_req_zone,用來(lái)限制請(qǐng)求的頻率骡澈。limit_req_zone$binary_remote_addr zone=perip:10m rate=1r/s;每個(gè)IP的請(qǐng)求頻率每秒不能超過(guò)1次且最大容量為10M.limit_req_zone$server_name zone=perserver:10m rate=10r/s;每個(gè)虛擬服務(wù)的請(qǐng)求頻率每秒不能超過(guò)10次且最大容量為10M锅纺。key表示限制的關(guān)鍵詞 可以是 IP 或 虛擬服務(wù)zone的名稱可以自定義,但不能重復(fù)肋殴,它代表一個(gè)存儲(chǔ)session 狀態(tài)的容器囤锉,size 表示 容器的大小坦弟。以范例中的 perip 限制區(qū)域?yàn)槔笮?0M官地,按照 64-byte / session酿傍,約能存儲(chǔ) 1.6W 個(gè) session。rate表示請(qǐng)求的頻率驱入,另外還有 r/m 表示每分鐘的請(qǐng)求頻率限制赤炒。
limit_req zone=[name] burst=[count] nodelay
limit_req這個(gè)變量可以放在 server 中 或者 location 中,放在 server 中時(shí)表示對(duì)整個(gè)服務(wù)做限流亏较,放在 location 中表示對(duì)特定請(qǐng)求做限流莺褒。參數(shù)說(shuō)明:zone選擇的限流容器 name 限流容器名稱burst緩存的數(shù)量 count 最大請(qǐng)求緩存數(shù)nodelay表示不延遲,即如果請(qǐng)求緩存超過(guò) count 的值時(shí)馬上返回 503 錯(cuò)誤雪情。
limit_req_log_level info | notice | warn | error
限流日志級(jí)別 遵岩,默認(rèn)為 error
nginx限流使用模塊 upstream
放置在http模塊
#限流并發(fā)
upstream node{
server127.0.0.1:8080 max_conns=1;
? ? ? ? ? ? ? ? ? ? ? ? ?}
#超出的請(qǐng)求會(huì)返回502狀態(tài)碼
放置在server模塊
#測(cè)試地址,訪問(wèn)服務(wù)器py路徑會(huì)轉(zhuǎn)發(fā)到本機(jī)的8080端口
location /py {
proxy_pass http://node/;
? ? ? ? ? ? ? ? ? ?}
#錯(cuò)誤重定向到降級(jí)界面
error_page502 503 https://fund/b.html;
注意:如果少了一個(gè)/ 會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到8080的/py路徑下
proxy_pass http://node旺罢;
準(zhǔn)備測(cè)試環(huán)境
開啟8080端口旷余,使用web.py 開啟一個(gè)簡(jiǎn)單的端口
安裝web.py?
pip install web.py==0.40-dev1
編寫網(wǎng)站腳本webtest.py
importweburls=('/','index')classindex:defGET(self):return"Hello, world!"if__name__=="__main__":app=web.application(urls, globals())app.run()
運(yùn)行腳本啟動(dòng)端口 python webtest.py 0.0.0.0:8080 啟動(dòng)8080端口允許任何IP訪問(wèn)
測(cè)試限流配置
使用jmeter測(cè)試
1、限流設(shè)置為并發(fā)連接數(shù)1
請(qǐng)求
結(jié)果
并發(fā)請(qǐng)求5扁达,發(fā)送100次正卧,共500個(gè)請(qǐng)求,成功367跪解,失敗133
并發(fā)請(qǐng)求10.發(fā)送100次炉旷,共1000個(gè)請(qǐng)求,成功566叉讥,失敗434
?并發(fā)請(qǐng)求20.發(fā)送100次窘行,共2000個(gè)請(qǐng)求,成功848图仓,失敗1152
參考文獻(xiàn)?
https://my.oschina.net/chenxiaobian/blog/888196
https://www.cnblogs.com/maoxianfei/p/9890761.html
Nginx ngx_http_upstream_module模塊詳解
https://blog.csdn.net/qq_37187976/article/details/79627912
Nginx的兩種限流配置? ? ----? 較詳細(xì)罐盔。
https://songzixian.com/linuxcmot/1530.html