Nginx服務(wù)器限速功能(二)
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-12 14:17:52
定義有兩個(gè)部分: zone= keyword標(biāo)識(shí)的區(qū)域名稱(chēng)和冒號(hào)后面的大小。 大約16,000個(gè)IP地址的狀態(tài)信息需要1兆字節(jié),所以我們的區(qū)域可以存儲(chǔ)大約160,000個(gè)地址。 如果Nginx需要添加一個(gè)新條目時(shí),存儲(chǔ)空間將被耗盡,它將刪除最舊的條目。
定義有兩個(gè)部分: zone= keyword標(biāo)識(shí)的區(qū)域名稱(chēng)和冒號(hào)后面的大小。 大約16,000個(gè)IP地址的狀態(tài)信息需要1兆字節(jié),所以我們的區(qū)域可以存儲(chǔ)大約160,000個(gè)地址。 如果Nginx需要添加一個(gè)新條目時(shí),存儲(chǔ)空間將被耗盡,它將刪除最舊的條目。
<
div>
如果釋放的空間不足以容納新記錄,則Nginx返回狀態(tài)碼503(Temporarily Unavailable) 。 此外,為了防止內(nèi)存耗盡,每當(dāng)Nginx創(chuàng)建一個(gè)新條目時(shí),最多可以刪除兩個(gè)在前60秒內(nèi)沒(méi)有使用的條目。
Rate - 設(shè)置最大請(qǐng)求率。 在這個(gè)例子中,速率不能超過(guò)每秒10個(gè)請(qǐng)求。 Nginx實(shí)際上以毫秒粒度跟蹤請(qǐng)求,所以這個(gè)限制對(duì)應(yīng)于每100毫秒1個(gè)請(qǐng)求。 由于我們不允許爆發(fā),這意味著如果請(qǐng)求在前一個(gè)允許的時(shí)間之后小于100毫秒時(shí)被拒絕。
limit_req_zone指令為速率限制和共享內(nèi)存區(qū)域設(shè)置參數(shù),但實(shí)際上并不限制請(qǐng)求速率。
因此,您需要通過(guò)在其中包含limit_req指令來(lái)將限制應(yīng)用于特定location或server塊。 在這個(gè)例子中,我們是對(duì)/login/的URI速率限制請(qǐng)求。
因此,現(xiàn)在每個(gè)唯一的IP地址被限制,/login/每秒10個(gè)請(qǐng)求 - 或者更確切地說(shuō),在前一個(gè)100毫秒內(nèi)不能請(qǐng)求該URL。
處理并發(fā)
如果我們?cè)?00毫秒內(nèi)得到兩個(gè)請(qǐng)求會(huì)怎么樣? 對(duì)于第二個(gè)請(qǐng)求,Nginx將狀態(tài)碼503返回給客戶(hù)端。 這可能不是我們想要的,因?yàn)閼?yīng)用程序本質(zhì)上是突發(fā)性的。
相反,我們想要緩沖任何多余的請(qǐng)求并及時(shí)提供服務(wù)。 這是我們使用burst參數(shù)limit_req ,在這個(gè)更新的配置:
burst參數(shù)定義了客戶(hù)端可以超過(guò)區(qū)域指定的速率(使用我們的示例mylimit區(qū)域,速率限制為每秒10個(gè)請(qǐng)求,或每100毫秒1個(gè))可以產(chǎn)生多少個(gè)請(qǐng)求。
在前一個(gè)請(qǐng)求到達(dá)100毫秒后的請(qǐng)求被放入一個(gè)隊(duì)列中,這里我們將隊(duì)列大小設(shè)置為20。
這意味著如果21個(gè)請(qǐng)求同時(shí)從一個(gè)給定的IP地址到達(dá),Nginx立即將第一個(gè)請(qǐng)求轉(zhuǎn)發(fā)到上游
服務(wù)器組,并將剩下的20個(gè)放入隊(duì)列中。 然后,它每100毫秒轉(zhuǎn)發(fā)一個(gè)排隊(duì)的請(qǐng)求,并且只有當(dāng)傳入的請(qǐng)求使排隊(duì)請(qǐng)求的數(shù)量超過(guò)20時(shí)才返回503給客戶(hù)端。
無(wú)延遲隊(duì)列
具有burst的配置會(huì)導(dǎo)致流量暢通,但不是很實(shí)用,因?yàn)樗赡軙?huì)使您的
網(wǎng)站顯得很慢。