Nginx限流配置(轉(zhuǎn)載)

1乘碑、限流算法

令牌桶算法
image.png

算法思想是:
a、令牌以固定速率產(chǎn)生金拒,并緩存到令牌桶中兽肤;
b、令牌桶放滿時(shí)绪抛,多余的令牌被丟棄资铡;
c、請求要消耗等比例的令牌才能被處理幢码;
d笤休、令牌不夠時(shí),請求被緩存症副。

漏桶算法
image.png

算法思想是:
a店雅、水(請求)從上方倒入水桶,從水桶下方流出(被處理)贞铣,來不及流出的水存在水桶中(緩沖)闹啦,以固定速率流出;
b辕坝、水桶滿后水溢出(丟棄)窍奋。

這個(gè)算法的核心是:緩存請求、勻速處理酱畅、多余的請求直接丟棄琳袄。

相比漏桶算法,令牌桶算法不同之處在于它不但有一只“桶”纺酸,還有個(gè)隊(duì)列窖逗,這個(gè)桶是用來存放令牌的,隊(duì)列才是用來存放請求的吁峻。
從作用上來說滑负,漏桶和令牌桶算法最明顯的區(qū)別就是是否允許突發(fā)流量(burst)的處理,漏桶算法能夠強(qiáng)行限制數(shù)據(jù)的實(shí)時(shí)傳輸(處理)速率用含,對突發(fā)流量不做額外處理;而令牌桶算法能夠在限制數(shù)據(jù)的平均傳輸速率的同時(shí)允許某種程度的突發(fā)傳輸帮匾。

2啄骇、限流配置

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
    location / {
        limit_req zone=mylimit;


        proxy_pass http://my_upstream;
    }
} 

參數(shù)解釋:

1、 $binary_remote_addr — nginx變量瘟斜,該變量代表了某個(gè)客戶端IP地址的二進(jìn)制形式缸夹。這意味著我們可以將每個(gè)特定的IP地址的請求速率限制為第三個(gè)參數(shù)所定義的值痪寻。(使用這個(gè)變量的原因是因?yàn)樗扔胹tring代表客戶端IP地址的$remote_addr變量消耗更少的空間。)
2虽惭、Zone — 定義了存儲每個(gè)IP地址狀態(tài)和它訪問受限請求URL的頻率的共享內(nèi)存區(qū)域橡类。將這些信息保存在共享內(nèi)存中,意味著這些信息能夠在nginx工作進(jìn)程之間共享芽唇。定義有兩個(gè)部分:由zone=關(guān)鍵字標(biāo)識的區(qū)域名稱顾画,以及冒號后面的區(qū)域大小。約16000個(gè)IP地址的狀態(tài)信息消耗1M內(nèi)存大小匆笤,因此我們的區(qū)域(zone)大概可以存儲約160000個(gè)地址研侣。當(dāng)nginx需要添加新的記錄時(shí),如果此時(shí)存儲耗盡了炮捧,最老的記錄會被移除庶诡。如果釋放的存儲空間還是無法容納新的記錄,nginx返回503 (Service Temporarily Unavailable)狀態(tài)碼咆课。此外末誓,為了防止內(nèi)存被耗盡,每次nginx創(chuàng)建一個(gè)新的記錄的同時(shí)移除多達(dá)兩條前60秒內(nèi)沒有被使用的記錄书蚪。
3基显、Rate — 設(shè)置最大的請求速率。在上面的例子中善炫,速率不能超過10個(gè)請求每秒撩幽。NGINX事實(shí)上可以在毫秒級別追蹤請求,因此這個(gè)限制對應(yīng)了1個(gè)請求每100毫秒箩艺。因?yàn)槲覀儾辉试S突刺(bursts窜醉,短時(shí)間內(nèi)的突發(fā)流量,詳細(xì)見下一部分艺谆。)榨惰,這意味著如果某個(gè)請求到達(dá)的時(shí)間離前一個(gè)被允許的請求小于100毫秒,它會被拒絕静汤。
注意:imit_req_zone指令設(shè)置限流和共享內(nèi)存區(qū)域的參數(shù)琅催,但是該指令實(shí)際上并不限制請求速率。為了限制起作用虫给,需要將該限制應(yīng)用到某個(gè)特定的location或server塊(block)藤抡,通過包含一個(gè)limit_req指令的方式。

3抹估、處理流量突刺(Bursts)

如果在100毫秒內(nèi)得到2個(gè)請求會怎么樣缠黍?對于第2個(gè)請求,NGINX返回503狀態(tài)碼給客戶端药蜻。這可能不是我們想要的瓷式,因?yàn)槭聦?shí)上替饿,應(yīng)用是趨向于突發(fā)性的。相反贸典,我們想要緩存任何過多的請求并且及時(shí)地服務(wù)它們视卢。
location / {
      limit_req zone=mylimit burst=20;

      proxy_pass http://my_upstream;
}
burst參數(shù)定義了一個(gè)客戶端能夠產(chǎn)生超出區(qū)域(zone)規(guī)定的速率的請求數(shù)量(在我們示例mylimit區(qū)域中,速率限制是10個(gè)請求每秒廊驼,或1個(gè)請求每100毫秒)据过。一個(gè)請求在前一個(gè)請求后的100毫秒間隔內(nèi)達(dá)到,該請求會被放入一個(gè)隊(duì)列蔬充,并且該隊(duì)列大小被設(shè)置為20蝶俱。這意味著如果從某個(gè)特定IP地址來的21個(gè)請求同時(shí)地達(dá)到,NGINX立即轉(zhuǎn)發(fā)第一個(gè)請求到上游的服務(wù)器組饥漫,并且將剩余的20個(gè)請求放入隊(duì)列中榨呆。然后,NGINX每100毫秒轉(zhuǎn)發(fā)一個(gè)隊(duì)列中的請求庸队,并且只有當(dāng)某個(gè)新進(jìn)來的請求使得隊(duì)列中的請求數(shù)目超過了20积蜻,則返回503給客戶端。

無延遲排隊(duì)

帶有burst的配置產(chǎn)生平滑的網(wǎng)絡(luò)流量彻消,但是不實(shí)用竿拆,因?yàn)樵撆渲脮沟媚愕木W(wǎng)站表現(xiàn)的很慢。在上面的例子中宾尚,隊(duì)列中第20個(gè)數(shù)據(jù)包等待2秒才能被轉(zhuǎn)發(fā)丙笋,這時(shí)該數(shù)據(jù)包的響應(yīng)可能對于客戶端已經(jīng)沒有了意義。為了處理這種情況煌贴,除了burst參數(shù)外御板,添加nodelay參數(shù)。
location /login/ {
      limit_req zone=mylimit burst=20 nodelay;

      proxy_pass http://my_upstream
}
帶有nodelay參數(shù)牛郑,NGINX仍然會按照burst參數(shù)在隊(duì)列中分配插槽(slot)以及利用已配置的限流怠肋,但是不是通過間隔地轉(zhuǎn)發(fā)隊(duì)列中的請求。相反淹朋,當(dāng)某個(gè)請求來的太快笙各,只要隊(duì)列中有可用的空間(slot),NGINX會立即轉(zhuǎn)發(fā)它础芍。該插槽(slot)被標(biāo)記為“已使用”杈抢,并且不會被釋放給另一個(gè)請求,一直到經(jīng)過適當(dāng)?shù)臅r(shí)間(在上面的例子中者甲,是100毫秒)春感。
像之前一樣假設(shè)有20個(gè)插槽的隊(duì)列是空的,并且來自于給定的IP地址的21個(gè)請求同時(shí)地到達(dá)虏缸。NGINX立即轉(zhuǎn)發(fā)這21個(gè)請求以及將隊(duì)列中的20個(gè)插槽標(biāo)記為“已使用”鲫懒,然后每隔100毫秒釋放一個(gè)插槽。(相反刽辙,如果有25個(gè)請求窥岩,NGINX會立即轉(zhuǎn)發(fā)25個(gè)中的21個(gè)請求,標(biāo)記20個(gè)插槽為“已使用”宰缤,并且用503狀態(tài)拒絕4個(gè)請求颂翼。)
現(xiàn)在假設(shè)在轉(zhuǎn)發(fā)第一個(gè)請求集合之后的101毫秒,有另外的20個(gè)請求同時(shí)地到達(dá)慨灭。隊(duì)列中只有1個(gè)插槽被釋放朦乏,因此NGINX轉(zhuǎn)發(fā)1個(gè)請求,并且用503狀態(tài)拒絕其它的19個(gè)請求氧骤。相反呻疹,如果在這20個(gè)新請求到達(dá)之前過去了501毫秒,則有5個(gè)插槽被釋放筹陵,因此NGINX立即轉(zhuǎn)發(fā)5個(gè)請求刽锤,并且拒絕其它15個(gè)請求。
效果等同于10個(gè)請求每秒的限流朦佩。如果你想利用請求之間的無限制性間隔的限流并思,nodelay選項(xiàng)則是非常有用的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末语稠,一起剝皮案震驚了整個(gè)濱河市宋彼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仙畦,老刑警劉巖输涕,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異议泵,居然都是意外死亡占贫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門先口,熙熙樓的掌柜王于貴愁眉苦臉地迎上來型奥,“玉大人,你說我怎么就攤上這事碉京∠嵝冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵谐宙,是天一觀的道長烫葬。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么搭综? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任垢箕,我火速辦了婚禮,結(jié)果婚禮上兑巾,老公的妹妹穿的比我還像新娘条获。我一直安慰自己,他們只是感情好蒋歌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布帅掘。 她就那樣靜靜地躺著,像睡著了一般堂油。 火紅的嫁衣襯著肌膚如雪修档。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天府框,我揣著相機(jī)與錄音吱窝,去河邊找鬼。 笑死寓免,一個(gè)胖子當(dāng)著我的面吹牛癣诱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袜香,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼撕予,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜈首?” 一聲冷哼從身側(cè)響起实抡,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欢策,沒想到半個(gè)月后吆寨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踩寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年啄清,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺孙。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辣卒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睛榄,到底是詐尸還是另有隱情荣茫,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布场靴,位于F島的核電站啡莉,受9級特大地震影響港准,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咧欣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一浅缸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧该押,春花似錦疗杉、人聲如沸阵谚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梢什。三九已至奠蹬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗡午,已是汗流浹背囤躁。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荔睹,地道東北人狸演。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像僻他,于是被迫代替她去往敵國和親宵距。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容