欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Nginx 中的兩種限流方式

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

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

生活中的 “限流”?

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

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

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

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

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

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

Nginx 限流

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

控制速率

正常限流

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

在 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 指令應(yīng)用限流。

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

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

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

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

處理突發(fā)流量

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

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

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

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

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

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

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

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

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

限制連接數(shù)

ngx_http_limit_conn_module 提供了限制連接數(shù)的能力,利用 limit_conn_zone 和 limit_conn 兩個(gè)指令即可。下面是 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,表示限制單個(gè)IP同時(shí)最多能持有10個(gè)連接。

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

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

設(shè)置白名單

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

在 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 對(duì)于白名單(子網(wǎng)或IP都可以) 將返回0,其他IP將返回1。

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

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

拓展閱讀

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

例如:

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

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

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

相關(guān)文章

  • nginx實(shí)現(xiàn)動(dòng)靜分離的示例代碼

    nginx實(shí)現(xiàn)動(dòng)靜分離的示例代碼

    這篇文章主要介紹了nginx實(shí)現(xiàn)動(dòng)靜分離的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Nginx 緩存清理的具體實(shí)現(xiàn)

    Nginx 緩存清理的具體實(shí)現(xiàn)

    Nginx通過(guò)緩存機(jī)制加速Web服務(wù),并提供高效的響應(yīng)和減少后端服務(wù)器負(fù)載,緩存數(shù)據(jù)需要定期清理以管理磁盤(pán)空間和確保數(shù)據(jù)時(shí)效性,下面就來(lái)介紹一下,感興趣的可以了解一下
    2024-12-12
  • Nginx與安全相關(guān)的幾個(gè)配置小結(jié)

    Nginx與安全相關(guān)的幾個(gè)配置小結(jié)

    Nginx提供了一系列的安全相關(guān)參數(shù),可以幫助加固網(wǎng)站安全性,本文主要介紹了Nginx與安全相關(guān)的幾個(gè)配置小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 教你在容器中使用nginx搭建上傳下載的文件服務(wù)器

    教你在容器中使用nginx搭建上傳下載的文件服務(wù)器

    這篇文章主要介紹了容器中使用nginx搭建支持上傳下載的文件服務(wù)器,在這需要注意為了讓nginx支持文件上傳,需要下載并運(yùn)行帶有nginx-upload-module模塊的容器,需要的朋友可以參考下
    2022-05-05
  • Nginx 反向代理并緩存及緩存清除的方法

    Nginx 反向代理并緩存及緩存清除的方法

    本篇文章主要介紹了Nginx 反向代理并緩存及緩存清除的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Windows系統(tǒng)下Nginx服務(wù)器的基本安裝和配置方法介紹

    Windows系統(tǒng)下Nginx服務(wù)器的基本安裝和配置方法介紹

    這篇文章主要介紹了Windows系統(tǒng)下Nginx服務(wù)器的基本安裝和配置方法,文中給出了一個(gè)配置文件的實(shí)例并作出了些說(shuō)明,需要的朋友可以參考下
    2015-12-12
  • 詳解Linux中Nginx反向代理下的tomcat集群

    詳解Linux中Nginx反向代理下的tomcat集群

    本篇文章主要介紹了詳解Linux中Nginx反向代理下的tomcat集群,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Nginx + consul + upsync 完成動(dòng)態(tài)負(fù)載均衡的方法詳解

    Nginx + consul + upsync 完成動(dòng)態(tài)負(fù)載均衡的方法詳解

    這篇文章主要介紹了Nginx + consul + upsync 完成動(dòng)態(tài)負(fù)載均衡,需要的朋友可以參考下
    2020-11-11
  • Nginx的流式響應(yīng)配置小結(jié)

    Nginx的流式響應(yīng)配置小結(jié)

    Nginx的流式響應(yīng)功能是一項(xiàng)非常實(shí)用的特性,它允許Nginx在接收后端服務(wù)器響應(yīng)的同時(shí),逐步將內(nèi)容發(fā)送給客戶端,本文主要介紹了Nginx的流式響應(yīng)配置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 用Nginx反向代理Node.js的方法

    用Nginx反向代理Node.js的方法

    本篇文章主要介紹了用Nginx反向代理Node.js的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05

最新評(píng)論