首頁  >  文章  >  運維  >  Nginx限流如何實現

Nginx限流如何實現

王林
王林轉載
2023-05-18 12:07:352132瀏覽

nginx限流是如何工作的

nginx限流使用漏桶演算法(leaky bucket algorithm),該演算法廣泛應用於通訊和基於包交換電腦網絡中,用來處理當頻寬被限制時的突發情況。和一個從上面進水,從下面漏水的桶子的原理很相似;如果進水的速率大於漏水的速率,這個桶子就會發生溢出。

在請求處理過程中,水代表從客戶端來的請求,而桶代表了一個隊列,請求在該隊列中依據先進先出(fifo)演算法等待被處理。漏的水代表請求離開緩衝區並被伺服器處理,溢出代表了請求被丟棄並且永不被服務。

Nginx限流如何實現

一、限制存取頻率(正常流量)

nginx中我們使用ngx_http_limit_req_module模組來限制請求的存取頻率,基於漏桶演算法原理實作。接下來我們使用 nginx limit_req_zone 和 limit_req 兩個指令,限制單一ip的請求處理速率。

語法:limit_req_zone key zone rate

Nginx限流如何實現

  • key :定義限流對象,binary_remote_addr 是一種key,表示基於remote_addr(客戶端ip) 來做限流,binary_ 的目的是壓縮記憶體佔用量。

  • zone:定義共享記憶體區來儲存存取訊息,myratelimit:10m 表示一個大小為10m,名字為myratelimit的記憶體區域。每1m可儲存16000個IP位址的存取訊息,因此10m可儲存16萬個IP位址的存取資訊。

  • The "rate" parameter is used to set the maximum access rate. "rate=10r/s" means that no more than 10 requests will be processed per second.。 nginx 實際上以毫秒為粒度來追蹤請求訊息,因此 10r/s 實際上是限制:每100毫秒處理一個請求。這意味著,自上一個請求處理完後,若後續100毫秒內又有請求到達,將拒絕處理該請求。

二、限制存取頻率(突發流量)

#按上面的配置在流量突然增大時,超出的請求將會被拒絕,無法處理突發流量,那麼在處理突發流量的時候,該怎麼處理呢? nginx提供了 burst 參數來解決突發流量的問題,並結合 nodelay 參數一起使用。 burst 譯為突發、爆發,表示在超過設定的處理速率後能額外處理的請求數。

Nginx限流如何實現

burst=20 nodelay表示這20個請求立刻處理,不能延遲,相當於特事特辦。不過,即使這20個突發請求立刻處理結束,後續來了請求也不會立刻處理。 burst=20 相當於快取佇列中佔了20個坑,即使請求被處理了,這20個位置這只能按 100ms一個來釋放。這就達到了速率穩定,但突然流量也能正常處理的效果。

三、限制並發連接數

nginx 的ngx_http_limit_conn_module模組提供了對資源連接數進行限制的功能,使用 limit_conn_zone 和 limit_conn 兩個指令就可以了。

Nginx限流如何實現

limit_conn perip 20:對應的key是 $binary_remote_addr,表示限制單一ip同時最多能持有20個連線。 limit_conn perserver 100:對應的key是 $server_name,表示虛擬主機(server) 同時能處理並發連線的總數。注意,只有當 request header 被後端server處理後,這個連線才進行計數。

以上是Nginx限流如何實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除