Intro
Nginx限制訪問速率模組:Nginx http_limit_req
原理
使用leaky bucket原理(可以稱漏桶原理
),桶的概念如下:
- 桶中存放request (令牌的概念)
- 桶上方由Nginx照設定速率計算補充request
- 桶下方提供提取request,即一個Request會消耗掉桶中存放的一個request
Nginx對於桶的特性如下:
- 單一IP對應使用一個桶
limit_req_zone
中rate
是以request數量回推時間做補充的,依照兩次領取的時差補充相應的量limit_req
中burst
即定義桶的request最大存放量,在每個新IP(不在Zone中)進入時會拿到全滿request(burst
量)的桶- 重啟Nginx會清空Zone,意即所有桶的剩餘Quota記憶清除,重新以全滿計算
比照實際設定,limit_req_zone $binary_remote_addr zone=one:10m rate=6r/m;
即每間隔10
秒可以得到一個request補充量。以rate=100r/s
速率來說明,即每0.01
秒得一個request補充量,間距0.1
秒計算得10
個request補充量;
而limit_req zone=one burst=5 nodelay;
則表示每個IP桶最大預存的request量為5
,有用掉則需等待補充。
Nginx實際上實作leaky bucket補充的方式可能為Trigger回填間隔補充量方式,本篇僅為概念說明,不代表實際Nginx演算法