nginx高并發(fā)情況下限流

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,920評論 0 11
  • 彩排完,天已黑
    劉凱書法閱讀 4,503評論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,959評論 2 7

友情鏈接更多精彩內(nèi)容