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

分布式限流之Nginx層限流方式

 更新時(shí)間:2024年08月13日 10:16:32   作者:it_lihongmin  
這篇文章主要介紹了分布式限流之Nginx層限流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

寫(xiě)在前面的話

  • 高并發(fā)的三駕馬車(chē):緩存、降級(jí)、限流,這里僅僅說(shuō)限流
  • 常用的限流算法有:計(jì)數(shù)器算法、固定窗口算法、滑動(dòng)窗口算法、漏桶算法、令牌桶算法;每種算法的特點(diǎn)和優(yōu)缺點(diǎn)這里不展開(kāi),比較適用的限流算法基本都會(huì)選擇令牌桶,并且這里基于Spring Cloud Gateway Redis本身默認(rèn)就是基于令牌桶算法實(shí)現(xiàn)
  • 限流按照類型分為:?jiǎn)螜C(jī)、分布式;
  • 限流按照請(qǐng)求流量的路徑分為:nginx、gateway、微服務(wù)
  • 如果僅僅使用于單機(jī)環(huán)境:谷歌guava的RateLimiter、(AtomicInteger、Semaphore)【AQS】都是可以選擇的; 但是在說(shuō)到高并發(fā)基本已經(jīng)是分布式環(huán)境,此時(shí)的常用方案可以基于nginx的ngx_http_limit_req_module模塊、 gateway層基于 redis(底層使用lua腳本)、阿里的sentinel(需要單獨(dú)搭建服務(wù))等方案

當(dāng)前是限流的Nginx層處理,使用漏桶算法實(shí)現(xiàn),Nginx層限流允許基于客戶端ip進(jìn)行控制,允許基于服務(wù)端與客戶端建立的鏈接數(shù)進(jìn)行控制。

一定要清楚,當(dāng)前在這個(gè)位置:

1、基于ip數(shù)進(jìn)行限制

更詳細(xì)官方文檔可以參考:https://www.nginx.com/blog/rate-limiting-nginx/

Ngixn層運(yùn)行對(duì)請(qǐng)求的ip使用漏桶算法(leaky bucket algorithm)進(jìn)行請(qǐng)求速率控制,速率限制配置有兩個(gè)主要指令,limit_req_zonelimit_req

比如配置如下:

http {
    limit_req_zone $binary_remote_addr zone=iplimit:10m rate=1r/s;
    limit_req_zone $server_name zone=iplimit:10m rate=1r/s;
    server {
        server_name  www.nginx-lyntest.com;
        listen       80;
        location ^~/my-api/ {
            proxy_pass   http://127.0.0.1:9999/;
            limit_req zone=iplimit burst=20 nodelay;
            limit_req_status 429; # 默認(rèn)返回 http 503狀態(tài)碼
            limit_req_log_level warn; # 默認(rèn)為 error級(jí)別
        }
    }
}

參數(shù)說(shuō)明(當(dāng)定義并且配置了多個(gè)限流規(guī)則時(shí),以最嚴(yán)格的為準(zhǔn)):

limit_req_zone指令:在http模塊進(jìn)行設(shè)置;limit_conn_zone key鏈接限制的可選項(xiàng),可以是下面的 $server_name 或 $binary_remote_addr

  • $binaty_remote_addr NGINX 變量以保存客戶端 IP 地址($remote_addr)的二進(jìn)制;
  • $server_name Nginx的變量,按照Server的server_name進(jìn)行限流;
  • zone=iplimit:10m 指定一個(gè)變量名(iplimit)以保存上面指定的客戶端ip,當(dāng)前配置大小為10M,1M可以存儲(chǔ)大約 16,000 個(gè) IP,這里的10M可以存儲(chǔ)16w個(gè)IP;
  • rate=1r/s 漏桶請(qǐng)求速率,控制在每秒1個(gè)請(qǐng)求;

limit_req指令:在location模塊指定上面http模塊約定的配置

  • zone=iplimit 這里使用上面定義的zone區(qū)域以保存當(dāng)前l(fā)ocation的請(qǐng)求;
  • burst=20 設(shè)置一個(gè)大小20的槽的隊(duì)列,當(dāng)前超過(guò)漏桶速率數(shù)時(shí)將請(qǐng)求放入槽內(nèi),并且每 100 毫秒釋放 1 個(gè)插槽;官方解釋是以應(yīng)對(duì)流量突刺的情況。
  • nodelay(或delay=8):當(dāng)前超過(guò)令牌桶速率時(shí),并且上面配置的burst槽都滿的情況下,對(duì)請(qǐng)求處理。nodelay即不允許延遲馬上進(jìn)行拒絕比較適用于需要高性能的接口??梢栽O(shè)置delay=一個(gè)指定的數(shù)值

  • limit_req_status:可以在【http、server、location】中使用,當(dāng)需要執(zhí)行拒絕時(shí)的http狀態(tài)碼,默認(rèn)為503,這里也可以指定為 429(Too Many Request)限流
  • limit_req_log_level:可以在【http、server、location】中使用,限流的日志,默認(rèn)為error級(jí)別,這里可以指定為warm級(jí)別,官方的日志格式如

2015/06/13 04:20:00 [error] 120315#0: *32086 limiting requests, excess: 1.000 by 
zone "mylimit", client: 192.168.1.2, server: nginx.com, request: "GET / HTTP/1.0", 
host: "nginx.com"

正常請(qǐng)求沒(méi)有被限流的效果為:

默認(rèn)返回狀態(tài)狀態(tài)碼(limit_req_status默認(rèn)返回Http 503 狀態(tài)碼),效果為:

可以將limit_req_status調(diào)整為 Http 429狀態(tài)碼,效果為:

2、基于客戶端鏈接數(shù)進(jìn)行控制

基于ngx_http_limit_conn_module,更詳細(xì)官方文檔可以參考:https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_zone

http {
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    server {
        server_name  www.nginx-lyntest.com;
        listen       80;
        location /my-api/ {
            proxy_pass   http://127.0.0.1:9999/;
            # 每個(gè)server最多保持100個(gè)連接
            limit_conn perserver 100;
            # 每個(gè)ip最多保持1個(gè)連接
            limit_conn perip 1;
            limit_conn_log_level warm;
        }
    }
}

limit_conn_zone指令,同樣在http模塊中進(jìn)行設(shè)置;limit_conn_zone key鏈接限制的可選項(xiàng),可以是下面的 $server_name 或 $binary_remote_addr

  • $binaty_remote_addr NGINX 變量以保存客戶端 IP 地址($remote_addr)的二進(jìn)制;
  • $server_name Nginx的變量,按照Server的server_name進(jìn)行限流;
  • zone= perip:10m 指定一個(gè)變量名(perip)以保存上面指定的客戶端ip,當(dāng)前配置大小為10M,1M可以存儲(chǔ)大約 16,000 個(gè) IP,這里的10M可以存儲(chǔ)16w個(gè)IP;
  • zone=perserver:10m 指定一個(gè)變量名(perserver)以保存根據(jù)server模塊名請(qǐng)求的統(tǒng)計(jì)進(jìn)行限流;

limit_conn:配置上面設(shè)置的配置,并且設(shè)置鏈接個(gè)數(shù), 如上配置的是ip就限制ip的鏈接個(gè)數(shù),設(shè)置的是server模塊的名稱就限制其鏈接的個(gè)數(shù);

limit_conn_status:限制鏈接的返回Http 狀態(tài)碼,可以在【http、server、location】中使用,默認(rèn)返回值為 Http 503狀態(tài)碼,可以設(shè)置為 429 (Too Many Request)

limit_conn_log_level:可以在【http、server、location】中使用,連接日志可選項(xiàng)有:info| notice| warn| error,默認(rèn)級(jí)別為 error

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 查看nginx日志的實(shí)現(xiàn)

    查看nginx日志的實(shí)現(xiàn)

    在 Nginx 中,查看日志是診斷問(wèn)題和監(jiān)控 Nginx 服務(wù)狀態(tài)的重要手段,本文主要介紹了查看nginx日志的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Nginx訪問(wèn)日志access_log配置及信息詳解(推薦)

    Nginx訪問(wèn)日志access_log配置及信息詳解(推薦)

    當(dāng)你設(shè)置日志級(jí)別成debug,如果你在調(diào)試一個(gè)在線的高流量網(wǎng)站的話,你的錯(cuò)誤日志可能會(huì)記錄每個(gè)請(qǐng)求的很多消息,這樣會(huì)變得毫無(wú)意義,下面小編給大家介紹Nginx訪問(wèn)日志access_log配置及信息詳解,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Nginx配置多端口多域名訪問(wèn)的實(shí)現(xiàn)

    Nginx配置多端口多域名訪問(wèn)的實(shí)現(xiàn)

    這篇文章主要介紹了Nginx配置多端口多域名訪問(wèn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Nginx如何配置多個(gè)服務(wù)域名解析共用80端口詳解

    Nginx如何配置多個(gè)服務(wù)域名解析共用80端口詳解

    對(duì)于Web而已,80端口和443端口是十分重要的,下面這篇文章主要給大家介紹了關(guān)于Nginx如何配置多個(gè)服務(wù)域名解析共用80端口的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Nginx代理axios請(qǐng)求以及注意事項(xiàng)詳解

    Nginx代理axios請(qǐng)求以及注意事項(xiàng)詳解

    這篇文章主要給大家介紹了關(guān)于Nginx代理axios請(qǐng)求以及注意事項(xiàng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解Nginx服務(wù)器中的nginx.conf配置文件

    詳解Nginx服務(wù)器中的nginx.conf配置文件

    這篇文章主要介紹了詳解Nginx服務(wù)器中的nginx.conf配置文件,包括對(duì)HTTP服務(wù)的基本配置方法,需要的朋友可以參考下
    2015-08-08
  • 配置nginx 重定向到系統(tǒng)維護(hù)頁(yè)面

    配置nginx 重定向到系統(tǒng)維護(hù)頁(yè)面

    今天抽時(shí)間給大家普及nginx 重定向到系統(tǒng)維護(hù)頁(yè)面的配置內(nèi)容,nginx重定向問(wèn)題說(shuō)起來(lái)也很簡(jiǎn)單,因?yàn)橹囟ㄏ蚝笾苯犹D(zhuǎn)到靜態(tài)頁(yè)面,不需要后續(xù)操作和記錄,所以直接301永久重定向。今天簡(jiǎn)單給大家介紹配置方法,一起看看吧
    2021-06-06
  • nginx根據(jù)二級(jí)目錄轉(zhuǎn)發(fā)服務(wù)以及帶/和不帶/的區(qū)別說(shuō)明

    nginx根據(jù)二級(jí)目錄轉(zhuǎn)發(fā)服務(wù)以及帶/和不帶/的區(qū)別說(shuō)明

    Nginx使用proxy_pass進(jìn)行二級(jí)目錄轉(zhuǎn)發(fā)時(shí),配置中的斜杠(/)影響路徑的處理方式:帶斜杠表示絕對(duì)路徑,不帶斜杠表示相對(duì)路徑,具體轉(zhuǎn)發(fā)到后端服務(wù)的URL會(huì)有所不同
    2024-12-12
  • Nginx部署多個(gè)vue項(xiàng)目的方法步驟

    Nginx部署多個(gè)vue項(xiàng)目的方法步驟

    本文主要介紹了Nginx部署多個(gè)vue項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Nginx代理接口訪問(wèn)返回404的實(shí)現(xiàn)示例

    Nginx代理接口訪問(wèn)返回404的實(shí)現(xiàn)示例

    因?yàn)椴煌瑯I(yè)務(wù)系統(tǒng)間有接口調(diào)用,存在跨域問(wèn)題,為了解決同源策略,需要將接口通過(guò)nginx去轉(zhuǎn)發(fā),本文主要介紹了Nginx代理接口訪問(wèn)返回404的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-06-06

最新評(píng)論