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