Nginx服務(wù)器限速功能(三)
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-12 14:19:45
在我們的例子中,隊(duì)列中的第20個(gè)數(shù)據(jù)包等待2秒鐘被轉(zhuǎn)發(fā),此時(shí)對(duì)其的響應(yīng)可能對(duì)客戶(hù)端不再有用。 要解決這種情況,請(qǐng)將nodelay參數(shù)與burst參數(shù)一起添加:
在我們的例子中,隊(duì)列中的第20個(gè)數(shù)據(jù)包等待2秒鐘被轉(zhuǎn)發(fā),此時(shí)對(duì)其的響應(yīng)可能對(duì)客戶(hù)端不再有用。 要解決這種情況,請(qǐng)將nodelay參數(shù)與burst參數(shù)一起添加:
<
div>
通過(guò)nodelay參數(shù),Nginx仍然根據(jù)burst參數(shù)在隊(duì)列中分配時(shí)隙,并且強(qiáng)加配置的速率限制,但是不排除轉(zhuǎn)發(fā)排隊(duì)的請(qǐng)求。 相反,當(dāng)請(qǐng)求到達(dá)“太快”時(shí),Nginx會(huì)立即轉(zhuǎn)發(fā),只要隊(duì)列中有一個(gè)可用的時(shí)隙。 它將該插槽標(biāo)記為“已占用”,并且不會(huì)將其釋放以供其他請(qǐng)求使用,直到經(jīng)過(guò)適當(dāng)?shù)臅r(shí)間(在本例中為100毫秒之后)。
假設(shè)像以前一樣,20個(gè)時(shí)隙的隊(duì)列是空的,21個(gè)請(qǐng)求同時(shí)從給定的IP地址到達(dá)。 Nginx立即轉(zhuǎn)發(fā)所有21個(gè)請(qǐng)求,并將隊(duì)列中的20個(gè)插槽標(biāo)記為已占用,然后每100毫秒釋放1個(gè)插槽(如果有25個(gè)請(qǐng)求,Nginx會(huì)立即轉(zhuǎn)發(fā)21個(gè)插槽,標(biāo)記20個(gè)插槽,拒絕4個(gè)請(qǐng)求狀態(tài)503 )。
現(xiàn)在假設(shè)在第一組請(qǐng)求之后101毫秒被轉(zhuǎn)發(fā),另外20個(gè)請(qǐng)求同時(shí)到達(dá)。 隊(duì)列中只有1個(gè)插槽被釋放,所以Nginx轉(zhuǎn)發(fā)1個(gè)請(qǐng)求,并拒絕其他19個(gè)狀態(tài)為503的隊(duì)列。 如果在20個(gè)新請(qǐng)求到達(dá)之前經(jīng)過(guò)了501毫秒,那么5個(gè)空閑
空間,所以Nginx立即轉(zhuǎn)發(fā)5個(gè)請(qǐng)求,拒絕15個(gè)請(qǐng)求。
效果相當(dāng)于每秒10個(gè)請(qǐng)求的速率限制。 如果您希望在不限制請(qǐng)求之間的允許間隔的情況下施加速率限制,則nodelay選項(xiàng)非常有用。
注意:對(duì)于大多數(shù)部署,我們建議將burst和nodelay參數(shù)包含到limit_req指令中。
高級(jí)配置示例
通過(guò)將基本速率限制與其他Nginx功能相結(jié)合,您可以實(shí)現(xiàn)更多細(xì)微的流量限制。
白名單
此示例顯示如何對(duì)不在“白名單”上的任何人的請(qǐng)求施加速率限制。
這個(gè)例子使用了geo和map指令。 geo塊為白名單中的IP地址分配一個(gè)0值到$limit值,其他0 1 。 然后,我們使用地圖將這些值轉(zhuǎn)換為一個(gè)密鑰,以便:
如果$limit是0,$limit_key設(shè)置為空字符串。
如果$limit是1,則$limit_key以二進(jìn)制格式設(shè)置為客戶(hù)端的IP地址。
把兩者放在一起,$limit_key被設(shè)置為白名單IP地址的空字符串,否則設(shè)置為客戶(hù)端的IP地址。 當(dāng)limit_req_zone目錄(密鑰)的第一個(gè)參數(shù)為空字符串時(shí),限制不適用,因此列入白名單的IP地址(在10.0.0.0/8和192.168.0.0/24子網(wǎng)中)不受限制。 所有其他IP地址每秒限制為5個(gè)請(qǐng)求。
limit_req指令將限制應(yīng)用于/位置,并且允許在配置的限制上突發(fā)多達(dá)10個(gè)分組而沒(méi)有轉(zhuǎn)發(fā)延遲
在一個(gè)位置包含多個(gè)limit_req指令
您可以在一個(gè)位置包含多個(gè)limit_req指令。 所有與給定請(qǐng)求匹配的限制都被應(yīng)用,這意味著使用最嚴(yán)格的限制。 例如,如果多于一個(gè)指令施加延遲,則使用最長(zhǎng)的延遲。 同樣,如果這是任何指令的影響,即使其他指令允許它們通過(guò),請(qǐng)求也會(huì)被拒絕。