Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強(qiáng)行保證請求的實(shí)時(shí)處理速度不會(huì)超過設(shè)置的閾值。
Nginx官方版本限制IP的連接和并發(fā)分別有兩個(gè)模塊:
limit_req_zone?用來限制單位時(shí)間內(nèi)的請求數(shù),即速率限制,采用的漏桶算法?"leaky bucket"。
limit_req_conn?用來限制同一時(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;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? }
配置說明
limit_conn是對某個(gè)KEY對應(yīng)的總的網(wǎng)絡(luò)連接數(shù)進(jìn)行限流??梢园凑誌P來限制IP維度的總連接數(shù),或者按照服務(wù)域名來限制某個(gè)域名的總連接數(shù)。但是記住不是每一個(gè)請求連接都會(huì)被計(jì)數(shù)器統(tǒng)計(jì),只有那些被Nginx處理的且已經(jīng)讀取了整個(gè)請求頭的請求連接才會(huì)被計(jì)數(shù)器統(tǒng)計(jì)
limit_conn_zone:用來配置限流KEY、及存放KEY對應(yīng)信息的共享內(nèi)存區(qū)域大小;此處的KEY是“binary_remote_addr”其表示IP地址,也可以使用如binaryremoteaddr”其表示IP地址,也可以使用如server_name作為KEY來限制域名級別的最大連接數(shù);
limit_conn_status:配置被限流后返回的狀態(tài)碼,默認(rèn)返回503;
limit_conn_log_level:配置記錄被限流后的日志級別,默認(rèn)error級別
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,用來限制請求的頻率。limit_req_zone$binary_remote_addr zone=perip:10m rate=1r/s;每個(gè)IP的請求頻率每秒不能超過1次且最大容量為10M.limit_req_zone$server_name zone=perserver:10m rate=10r/s;每個(gè)虛擬服務(wù)的請求頻率每秒不能超過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表示請求的頻率,另外還有 r/m 表示每分鐘的請求頻率限制。
limit_req zone=[name] burst=[count] nodelay
limit_req這個(gè)變量可以放在 server 中 或者 location 中,放在 server 中時(shí)表示對整個(gè)服務(wù)做限流,放在 location 中表示對特定請求做限流。參數(shù)說明:zone選擇的限流容器 name 限流容器名稱burst緩存的數(shù)量 count 最大請求緩存數(shù)nodelay表示不延遲,即如果請求緩存超過 count 的值時(shí)馬上返回 503 錯(cuò)誤。
limit_req_log_level info | notice | warn | error
限流日志級別 ,默認(rèn)為 error
nginx限流使用模塊 upstream
放置在http模塊
#限流并發(fā)
upstream node{
server127.0.0.1:8080 max_conns=1;
? ? ? ? ? ? ? ? ? ? ? ? ?}
#超出的請求會(huì)返回502狀態(tài)碼
放置在server模塊
#測試地址,訪問服務(wù)器py路徑會(huì)轉(zhuǎn)發(fā)到本機(jī)的8080端口
location /py {
proxy_pass http://node/;
? ? ? ? ? ? ? ? ? ?}
#錯(cuò)誤重定向到降級界面
error_page502 503 https://fund/b.html;
注意:如果少了一個(gè)/ 會(huì)將請求轉(zhuǎn)發(fā)到8080的/py路徑下
proxy_pass http://node;
準(zhǔn)備測試環(huán)境
開啟8080端口,使用web.py 開啟一個(gè)簡單的端口
安裝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訪問
測試限流配置
使用jmeter測試
1、限流設(shè)置為并發(fā)連接數(shù)1
請求

結(jié)果

并發(fā)請求5,發(fā)送100次,共500個(gè)請求,成功367,失敗133
并發(fā)請求10.發(fā)送100次,共1000個(gè)請求,成功566,失敗434
?并發(fā)請求20.發(fā)送100次,共2000個(gè)請求,成功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