最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Nginx 中的兩種限流方式

 更新時間:2020年11月06日 16:26:49   作者:碼代碼的陳同學  
這篇文章主要介紹了淺談Nginx 中的兩種限流方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

系統(tǒng)設計時一般會預估負載,當系統(tǒng)暴露在公網(wǎng)中時,惡意攻擊或正常突發(fā)流量等都可能導致系統(tǒng)被壓垮,而限流就是保護措施之一。限流即控制流量,本文將記錄 Nginx 的二種限流設置。

生活中的 “限流”?

限流并非新鮮事,在生活中亦無處不在,下面例舉一二:

博物館:限制每天參觀總?cè)藬?shù)以保護文物

高鐵安檢:有若干安檢口,旅客依次排隊,工作人員根據(jù)安檢快慢決定是否放人進去。遇到節(jié)假日,可以增加安檢口來提高處理能力(橫向拓展),同時增加排隊等待區(qū)長度(緩存待處理任務)。

辦理銀行業(yè)務:所有人先領號,各窗口叫號處理。每個窗口處理速度根據(jù)客戶具體業(yè)務而定,所有人排隊等待叫號即可。若快下班時,告知客戶明日再來(拒絕流量)。

水壩泄洪:水壩可以通過閘門控制泄洪速度(控制處理速度)。

以上"限流"例子,可以讓服務提供者穩(wěn)定的服務客戶。

Nginx 限流

Nginx 提供兩種限流方式,一是控制速率,二是控制并發(fā)連接數(shù)。

控制速率

正常限流

ngx_http_limit_req_module 模塊提供限制請求處理速率能力,使用了漏桶算法(leaky bucket)。下面例子使用 nginx limit_req_zone 和 limit_req 兩個指令,限制單個IP的請求處理速率。

在 nginx.conf http 中添加限流配置:

格式:limit_req_zone key zone rate

http {
 limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s;
}

配置 server,使用 limit_req 指令應用限流。

server {
 location / {
 limit_req zone=myRateLimit;
 proxy_pass http://my_upstream;
 }
}

key :定義限流對象,binary_remote_addr 是一種key,表示基于 remote_addr(客戶端IP) 來做限流,binary_ 的目的是壓縮內(nèi)存占用量。

zone:定義共享內(nèi)存區(qū)來存儲訪問信息, myRateLimit:10m 表示一個大小為10M,名字為myRateLimit的內(nèi)存區(qū)域。1M能存儲16000 IP地址的訪問信息,10M可以存儲16W IP地址訪問信息。

rate 用于設置最大訪問速率,rate=10r/s 表示每秒最多處理10個請求。Nginx 實際上以毫秒為粒度來跟蹤請求信息,因此 10r/s 實際上是限制:每100毫秒處理一個請求。這意味著,自上一個請求處理完后,若后續(xù)100毫秒內(nèi)又有請求到達,將拒絕處理該請求。

處理突發(fā)流量

上面例子限制 10r/s,如果有時正常流量突然增大,超出的請求將被拒絕,無法處理突發(fā)流量,可以結(jié)合 burst 參數(shù)使用來解決該問題。

server {
 location / {
 limit_req zone=myRateLimit burst=20;
 proxy_pass http://my_upstream;
 }
}

burst 譯為突發(fā)、爆發(fā),表示在超過設定的處理速率后能額外處理的請求數(shù)。當 rate=10r/s 時,將1s拆成10份,即每100ms可處理1個請求。

此處,**burst=20 **,若同時有21個請求到達,Nginx 會處理第一個請求,剩余20個請求將放入隊列,然后每隔100ms從隊列中獲取一個請求進行處理。若請求數(shù)大于21,將拒絕處理多余的請求,直接返回503.

不過,單獨使用 burst 參數(shù)并不實用。假設 burst=50 ,rate依然為10r/s,排隊中的50個請求雖然每100ms會處理一個,但第50個請求卻需要等待 50 * 100ms即 5s,這么長的處理時間自然難以接受。

因此,burst 往往結(jié)合 nodelay 一起使用。

server {
 location / {
 limit_req zone=myRateLimit burst=20 nodelay;
 proxy_pass http://my_upstream;
 }
}

nodelay 針對的是 burst 參數(shù),burst=20 nodelay 表示這20個請求立馬處理,不能延遲,相當于特事特辦。不過,即使這20個突發(fā)請求立馬處理結(jié)束,后續(xù)來了請求也不會立馬處理。burst=20 相當于緩存隊列中占了20個坑,即使請求被處理了,這20個位置這只能按 100ms一個來釋放。

這就達到了速率穩(wěn)定,但突然流量也能正常處理的效果。

限制連接數(shù)

ngx_http_limit_conn_module 提供了限制連接數(shù)的能力,利用 limit_conn_zone 和 limit_conn 兩個指令即可。下面是 Nginx 官方例子:

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 perip 10 作用的key 是 $binary_remote_addr,表示限制單個IP同時最多能持有10個連接。

limit_conn perserver 100 作用的key是 $server_name,表示虛擬主機(server) 同時能處理并發(fā)連接的總數(shù)。

需要注意的是:只有當 request header 被后端server處理后,這個連接才進行計數(shù)。

設置白名單

限流主要針對外部訪問,內(nèi)網(wǎng)訪問相對安全,可以不做限流,通過設置白名單即可。利用 Nginx ngx_http_geo_modulengx_http_map_module 兩個工具模塊即可搞定。

在 nginx.conf 的 http 部分中配置白名單:

geo $limit {
 default 1;
 10.0.0.0/8 0;
 192.168.0.0/24 0;
 172.20.0.35 0;
}

map $limit $limit_key {
 0 "";
 1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo 對于白名單(子網(wǎng)或IP都可以) 將返回0,其他IP將返回1。

map 將 limit **轉(zhuǎn)換為** limit_key,如果是 $limit 是0(白名單),則返回空字符串;如果是1,則返回客戶端實際IP。

limit_req_zone 限流的key不再使用 而是 **limit_key 來動態(tài)獲取值。如果是白名單,limit_req_zone 的限流key則為空字符串,將不會限流;若不是白名單,將會對客戶端真實IP進行限流。

拓展閱讀

除限流外,ngx_http_core_module 還提供了限制數(shù)據(jù)傳輸速度的能力(即常說的下載速度)。

例如:

location /flv/ {
 flv;
 limit_rate_after 20m;
 limit_rate 100k;
}

這個限制是針對每個請求的,表示客戶端下載前20M時不限速,后續(xù)限制100kb/s。

以上這篇淺談Nginx 中的兩種限流方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • nginx配置ssl證書實現(xiàn)https訪問的示例

    nginx配置ssl證書實現(xiàn)https訪問的示例

    這篇文章主要介紹了nginx配置ssl證書實現(xiàn)https訪問的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程

    nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程

    下面小編就為大家分享一篇nginx+tomcat實現(xiàn)Windows系統(tǒng)下的負載均衡搭建教程,具有很好的參考價值,希望對大家有所幫助
    2017-12-12
  • Nginx配置proxy_pass后返回404的問題及解決

    Nginx配置proxy_pass后返回404的問題及解決

    這篇文章主要介紹了Nginx配置proxy_pass后返回404的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • CentOS7安裝Nginx并配置自動啟動的方法步驟

    CentOS7安裝Nginx并配置自動啟動的方法步驟

    這篇文章主要介紹了CentOS7安裝Nginx并配置自動啟動的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 阿里云ssl證書如何通過Nginx部署到服務器

    阿里云ssl證書如何通過Nginx部署到服務器

    這篇文章主要介紹了阿里云ssl證書通過Nginx部署到服務器的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • windows查看nginx是否啟動的四種方法

    windows查看nginx是否啟動的四種方法

    本文主要介紹了windows查看nginx是否啟動的兩種方法,文中通過圖文代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Nginx中報錯:Permission denied與Connection refused的解決

    Nginx中報錯:Permission denied與Connection refused的解決

    這篇文章主要給大家介紹了在Nginx中報錯:13: Permission denied與111: Connection refused的解決方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Nginx + lua 實現(xiàn)WAF的詳細過程

    Nginx + lua 實現(xiàn)WAF的詳細過程

    這篇文章主要介紹了Nginx + lua 實現(xiàn)WAF的詳細過程,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 一文詳解nginx中的root與alias

    一文詳解nginx中的root與alias

    Nginx是一款流行的高性能Web服務器和反向代理服務器,這篇文章主要給大家介紹了關于如何通過一文詳解nginx中的root與alias的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 利用nginx和騰訊云免費證書制作https的方法

    利用nginx和騰訊云免費證書制作https的方法

    這篇文章主要介紹了利用nginx和騰訊云免費證書制作https的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論

阳新县| 扬中市| 望谟县| 洛南县| 土默特左旗| 福安市| 汶上县| 大洼县| 满洲里市| 稷山县| 油尖旺区| 华池县| 阳曲县| 中宁县| 花垣县| 阿拉善盟| 库车县| 射洪县| 祁连县| 治县。| 绥棱县| 永德县| 子长县| 庆云县| 磐石市| 水城县| 黄骅市| 石门县| 崇文区| 河源市| 萍乡市| 维西| 开封市| 芜湖市| 秦安县| 金溪县| 称多县| 宿松县| 沙坪坝区| 高雄县| 泰安市|