Nginx服務器限速功能(三)
- 作者:新網
- 來源:新網
- 瀏覽:100
- 2018-05-12 14:19:45
在我們的例子中,隊列中的第20個數據包等待2秒鐘被轉發,此時對其的響應可能對客戶端不再有用。 要解決這種情況,請將nodelay參數與burst參數一起添加:
在我們的例子中,隊列中的第20個數據包等待2秒鐘被轉發,此時對其的響應可能對客戶端不再有用。 要解決這種情況,請將nodelay參數與burst參數一起添加:

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