Nginx限流——突發流量,超出的請求怎么處理


Nginx現在已經是最火的負載均衡之一,在流量陡增的互聯網面前,接口限流也是很有必要的,尤其是針對高並發的場景。Nginx的限流主要是兩種方式:限制訪問頻率和限制並發連接數。

一、限制訪問頻率(正常流量)

Nginx中我們使用 ngx_http_limit_req_module 模塊來限制請求的訪問頻率,基於漏桶算法原理實現。接下來我們使用 nginx limit_req_zone 和 limit_req 兩個指令,限制單個IP的請求處理速率。

語法:limit_req_zone key zone rate

  1. key :定義限流對象,binary_remote_addr 是一種key,表示基於 remote_addr(客戶端IP) 來做限流,binary_ 的目的是壓縮內存占用量。
  2. zone:定義共享內存區來存儲訪問信息, myRateLimit:10m 表示一個大小為10M,名字為myRateLimit的內存區域。1M能存儲16000 IP地址的訪問信息,10M可以存儲16W IP地址訪問信息。
  3. rate 用於設置***訪問速率,rate=10r/s 表示每秒最多處理10個請求。Nginx 實際上以毫秒為粒度來跟蹤請求信息,因此 10r/s 實際上是限制:每100毫秒處理一個請求。這意味着,自上一個請求處理完后,若后續100毫秒內又有請求到達,將拒絕處理該請求。

二、限制訪問頻率(突發流量)

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

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

三、限制並發連接數

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

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

好了,以上幾種限流方式,你都清楚了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM