日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx限流

發布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx限流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、限流算法

令牌桶算法

令牌桶算法
算法思想是:
令牌以固定速率產生,并緩存到令牌桶中;
令牌桶放滿時,多余的令牌被丟棄;
請求要消耗等比例的令牌才能被處理;
令牌不夠時,請求被緩存。

漏桶算法

漏桶算法
算法思想是:
水(請求)從上方倒入水桶,從水桶下方流出(被處理);
來不及流出的水存在水桶中(緩沖),以固定速率流出;
水桶滿后水溢出(丟棄)。
這個算法的核心是:緩存請求、勻速處理、多余的請求直接丟棄。相比漏桶算法,令牌桶算法不同之處在于它不但有一只“桶”,還有個隊列,這個桶是用來存放令牌的,隊列才是用來存放請求的。

從作用上來說,漏桶和令牌桶算法最明顯的區別就是是否允許突發流量(burst)的處理,漏桶算法能夠強行限制數據的實時傳輸(處理)速率,對突發流量不做額外處理;而令牌桶算法能夠在限制數據的平均傳輸速率的同時允許某種程度的突發傳輸。
Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。

Nginx官方版本限制IP的連接和并發分別有兩個模塊:

limit_req_zone 用來限制單位時間內的請求數,即速率限制,采用的漏桶算法 “leaky bucket”。 l

imit_req_conn 用來限制同一時間連接數,即并發限制。

limit_req_zone 參數配置
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location limit_req_zone binaryremoteaddrzone=one:10mrate=1r/s;第一個參數:binary_remote_addr zone=one:10m rate=1r/s; 第一個參數:binaryr?emotea?ddrzone=one:10mrate=1r/s;binary_remote_addr
表示通過remote_addr這個標識來做限制,“binary_”的目的是縮寫內存占用量,是限制同一客戶端ip地址。
第二個參數:zone=one:10m表示生成一個大小為10M,名字為one的內存區域,用來存儲訪問的頻次信息。
第三個參數:rate=1r/s表示允許相同標識的客戶端的訪問頻次,這里限制的是每秒1次,還可以有比如30r/m的。 limit_req
zone=one burst=5 nodelay; 第一個參數:zone=one
設置使用哪個配置區域來做限制,與上面limit_req_zone 里的name對應。
第二個參數:burst=5,重點說明一下這個配置,burst爆發的意思,這個配置的意思是設置一個大小為5的緩沖區當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩沖區內。
第三個參數:nodelay,如果設置,超過訪問頻次而且緩沖區也滿了的時候就會直接返回503,如果沒有設置,則所有請求會等待排隊。

例子:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location /search/ {limit_req zone=one burst=5 nodelay;}}

下面配置可以限制特定UA(比如搜索引擎)的訪問:

limit_req_zone $anti_spider zone=one:10m rate=10r/s; limit_req zone=one burst=100 nodelay; if ($http_user_agent ~* "googlebot|bingbot|Feedfetcher-Google") {set $anti_spider $http_user_agent; }

其他參數

Syntax: limit_req_log_level info | notice | warn | error;
Default:
limit_req_log_level error;
Context: http, server, location 當服務器由于limit被限速或緩存時,配置寫入日志。延遲的記錄比拒絕的記錄低一個級別。例子:limit_req_log_level
notice 延遲的的基本是info。
Syntax: limit_req_status code;
Default:
limit_req_status 503;
Context: http, server, location 設置拒絕請求的返回值。值只能設置 400 到 599 之間。

ngx_http_limit_conn_module 參數配置
這個模塊用來限制單個IP的請求數。并非所有的連接都被計數。只有在服務器處理了請求并且已經讀取了整個請求頭時,連接才被計數。

Syntax: limit_conn zone number;Default: —Context: http, server, locationlimit_conn_zone $binary_remote_addr zone=addr:10m;server {location /download/ {limit_conn addr 1;}

一次只允許每個IP地址一個連接。

limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m;server {...limit_conn perip 10;limit_conn perserver 100; }

可以配置多個limit_conn指令。例如,以上配置將限制每個客戶端IP連接到服務器的數量,同時限制連接到虛擬服務器的總數。

Syntax: limit_conn_zone key zone=name:size; Default: — Context: http limit_conn_zone $binary_remote_addr zone=addr:10m;

在這里,客戶端IP地址作為關鍵。請注意,不是 $ remote_addr ,而是使用 $ binary_remote_addr 變量。$ remote_addr
變量的大小可以從7到15個字節不等。存儲的狀態在32位平臺上占用32或64字節的內存,在64位平臺上總是占用64字節。對于IPv4地址, $ binary_remote_addr
變量的大小始終為4個字節,對于IPv6地址則為16個字節。存儲狀態在32位平臺上始終占用32或64個字節,在64位平臺上占用64個字節。一個兆字節的區域可以保持大約32000個32字節的狀態或大約16000個64字節的狀態。如果區域存儲耗盡,服務器會將錯誤返回給所有其他請求。

Syntax: limit_conn_log_level info | notice | warn | error; Default: limit_conn_log_level error; Context: http, server, location

當服務器限制連接數時,設置所需的日志記錄級別。

Syntax: limit_conn_status code; Default: limit_conn_status 503; Context: http, server, location

設置拒絕請求的返回值。

2、實戰

實例一 限制訪問速率
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server {location / {limit_req zone=mylimit;} }

上述規則限制了每個IP訪問的速度為2r/s,并將該規則作用于根目錄。如果單個IP在非常短的時間內并發發送多個請求,結果會怎樣呢?

單個IP 10ms內發送6個請求
我們使用單個IP在10ms內發并發送了6個請求,只有1個成功,剩下的5個都被拒絕。我們設置的速度是2r/s,為什么只有1個成功呢,是不是Nginx限制錯了?當然不是,是因為Nginx的限流統計是基于毫秒的,我們設置的速度是2r/s,轉換一下就是500ms內單個IP只允許通過1個請求,從501ms開始才允許通過第二個請求。

實例二 burst緩存處理

我們看到,我們短時間內發送了大量請求,Nginx按照毫秒級精度統計,超出限制的請求直接拒絕。這在實際場景中未免過于苛刻,真實網絡環境中請求到來不是勻速的,很可能有請求“突發”的情況,也就是“一股子一股子”的。Nginx考慮到了這種情況,可以通過burst關鍵字開啟對突發請求的緩存處理,而不是直接拒絕。
來看我們的配置:

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

我們加入了burst=4,意思是每個key(此處是每個IP)最多允許4個突發請求的到來。如果單個IP在10ms內發送6個請求,結果會怎樣呢?

設置burst
相比實例一成功數增加了4個,這個我們設置的burst數目是一致的。具體處理流程是:1個請求被立即處理,4個請求被放到burst隊列里,另外一個請求被拒絕。通過burst參數,我們使得Nginx限流具備了緩存處理突發流量的能力。

但是請注意:burst的作用是讓多余的請求可以先放到隊列里,慢慢處理。如果不加nodelay參數,隊列里的請求不會立即處理,而是按照rate設置的速度,以毫秒級精確的速度慢慢處理。

實例三 nodelay降低排隊時間

實例二中我們看到,通過設置burst參數,我們可以允許Nginx緩存處理一定程度的突發,多余的請求可以先放到隊列里,慢慢處理,這起到了平滑流量的作用。但是如果隊列設置的比較大,請求排隊的時間就會比較長,用戶角度看來就是RT變長了,這對用戶很不友好。

有什么解決辦法呢?nodelay參數允許請求在排隊的時候就立即被處理,也就是說只要請求能夠進入burst隊列,就會立即被后臺worker處理,請注意,這意味著burst設置了nodelay時,系統瞬間的QPS可能會超過rate設置的閾值。nodelay參數要跟burst一起使用才有作用。

延續實例二的配置,我們加入nodelay選項:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;server {location / {limit_req zone=mylimit burst=4 nodelay;}}

單個IP 10ms內并發發送6個請求,結果如下:

設置burst和nodela
跟實例二相比,請求成功率沒變化,但是總體耗時變短了。這怎么解釋呢?實例二中,有4個請求被放到burst隊列當中,工作進程每隔500ms(rate=2r/s)取一個請求進行處理,最后一個請求要排隊2s才會被處理;實例三中,請求放入隊列跟實例二是一樣的,但不同的是,隊列中的請求同時具有了被處理的資格,所以實例三中的5個請求可以說是同時開始被處理的,花費時間自然變短了。

但是請注意,雖然設置burst和nodelay能夠降低突發請求的處理時間,但是長期來看并不會提高吞吐量的上限,長期吞吐量的上限是由rate決定的,因為nodelay只能保證burst的請求被立即處理,但Nginx會限制隊列元素釋放的速度,就像是限制了令牌桶中令牌產生的速度。

看到這里你可能會問,加入了nodelay參數之后的限速算法,到底算是哪一個“桶”,是漏桶算法還是令牌桶算法?當然還算是漏桶算法。考慮一種情況,令牌桶算法的token為耗盡時會怎么做呢?由于它有一個請求隊列,所以會把接下來的請求緩存下來,緩存多少受限于隊列大小。但此時緩存這些請求還有意義嗎?如果server已經過載,緩存隊列越來越長,RT越來越高,即使過了很久請求被處理了,對用戶來說也沒什么價值了。所以當token不夠用時,最明智的做法就是直接拒絕用戶的請求,這就成了漏桶算法。

示例四 自定義返回值
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server {location / {limit_req zone=mylimit burst=4 nodelay;limit_req_status 598;} }

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的nginx限流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色岛国片 | 蜜桃精品在线观看 | 国产精品白嫩白嫩大学美女 | 亚洲激情视频在线 | 亚洲性网| 国产91精品露脸国语对白 | 日韩三级电影网址 | 亚洲国产视频一区二区 | 日日射av| 国产欧美日韩一区二区三区 | 国产精品人人 | 日韩中文字 | 国产亚洲精品久久久久久久 | 久久久国产成人一区二区三区 | 美女视频黄a视频全免费观看 | 久久机热| 天天干网址 | 国产三区四区视频 | 狗爬女子的视频 | 国产51页 | 亚洲免费观看高清在线观看 | 日韩欧美一区二区视频 | 婷婷777| 人妻大战黑人白浆狂泄 | 特级西西444www高清大胆免费看 | 久久久久9999| 波多野结衣喷潮 | 一级黄色片在线看 | 国产成人啪精品午夜在线观看 | 女人天堂av | 男女啪啪网站 | 热久久亚洲 | 一区二区免费在线 | 色呦呦网站入口 | 亚洲二三区 | 丝袜理论片在线观看 | 777色| 亚洲无人区小视频 | 一本久久a精品一合区久久久 | 亚洲欧美日韩天堂 | 久久亚洲一区二区三区四区五区 | 国产精品久久久爽爽爽麻豆色哟哟 | 中文字幕一区二区三区精彩视频 | 亚洲成av人片在线观看无码 | 日本福利片在线观看 | 中文在线а√天堂 | 99999精品视频 | 人人妻人人澡人人爽精品欧美一区 | av噜噜色| 日本在线不卡一区二区 | 无码成人精品区在线观看 | 美女扒开粉嫩的尿囗给男生桶 | 日韩久久精品 | 欧美成人手机视频 | 亚洲国产成人精品久久 | 日韩精品一区二区三区 | www.av网址| av网子| 最新99热 | 国产成人免费在线视频 | 女同亚洲精品一区二区三 | 国产麻豆一区二区 | 欧美综合网站 | 国产精品久久久久久久久久免费 | 999精品视频在线观看 | 亚洲精品aaaaa | 亚洲精品免费观看 | 99久在线精品99re8热 | 毛片在线免费 | 欧美性视屏| 国内自拍区| 免费黄色在线网站 | 欧美日韩综合网 | 国产经典久久久 | 亚洲第一国产 | 男女做激情爱呻吟口述全过程 | 一级片av| 免费成人福利视频 | 菲律宾av| 日本一区二区三区在线看 | 中文字幕在线播 | 亚洲天堂99 | 亚洲视频国产精品 | 午夜网址| 久久久国产一区二区三区 | 99九九久久| 国产精品一区二区6 | 91免费在线视频观看 | 女人张开腿让男人桶爽 | 欧美日韩亚洲色图 | 免费av影视 | 亚洲熟妇av日韩熟妇在线 | wwwxxxx国产 | 久久久久久无码午夜精品直播 | 少妇名器的沉沦 | 日韩欧美中文字幕一区二区 | 日本精品一区二区三区在线观看 | 日韩污视频在线观看 | 国产网红av |