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

nginx控制連接數(shù)及訪問速率的實現(xiàn)

 更新時間:2024年12月27日 09:49:59   作者:曹朋羽  
本文主要介紹了Nginx中ngx_http_limit_conn_module和ngx_http_limit_req_module模塊的使用,用于控制連接數(shù)和請求速率,具有一定的參考價值,感興趣的可以了解一下

連接數(shù)控制

ngx_http_limit_conn_module 模塊用來限制每個定義的key對應的連接數(shù)。

不是所有的連接都會被計數(shù),當一個連接請求被服務端處理并且這個請求頭被讀取時候,這個連接被算作一個連接。

limit_conn_zone key zone=name:size;

limit_conn_zone 用來定義在 http 塊中定義一個共享內(nèi)存區(qū)域,存儲客戶端的連接數(shù)。key用來區(qū)分不同的客戶端連接。name用來指定區(qū)域的名稱,size指定內(nèi)存大小。key可以是文本或變量,如果一個請求的key是空不會進行請求計數(shù)。這里實際就是維護了一個內(nèi)存map區(qū)域(key,count)。

如下:

limit_conn_zone $binary_remote_addr zone=addr:10m;

開辟一個10m的內(nèi)存區(qū)域,名稱為addr,key為b i n a r y r e m o t e a d d r 。 binary_remote_addr。binaryr?emotea?ddr。binary_remote_addr表示按客戶端 IP 地址進行計數(shù)。zone定義完成后主要是為了limit_conn 指令限連接數(shù)使用。

limit_conn zone number;

limit_conn指令用于限制同一客戶端的最大連接數(shù)。要與 limit_conn_zone 配合使用。這里的zone就是引用的limit_conn_zone 定義的區(qū)域名稱,number是限制最大連接數(shù)。當超過最大連接數(shù)時,會返回特定的錯誤。默認是503.可以通過limit_conn_status code; 來指定特定的錯誤碼。

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_status 429;
server {
    location /download/ {
        limit_conn addr 2;
}

上面表示開辟一個10M的內(nèi)存區(qū)域名為addr,用來統(tǒng)計每個客戶端IP($binary_remote_addr)的請求數(shù)量,限制每個IP最多只能有2個并發(fā)連接。如果超過并發(fā)數(shù),則返回429錯誤。

limit_conn指令可以重復出現(xiàn)

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 5;
    limit_conn perserver 100;
}

如上表示限制每個客戶端最大并發(fā)數(shù)是5,一個server同時最大支持連接是100.

https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

請求速率控制

處理限制客戶端連接數(shù)外,還可以通過ngx_http_limit_req_module模塊來限制客戶端的請求速率。指令和限制連接數(shù)差不多。

limit_req_zone key zone=name:size rate=rate ;

limit_req_zone 指令用來定義請求速率限制內(nèi)存區(qū)域,key同limit_zone指令,用來標識計算速率的key值,name是內(nèi)存區(qū)域名稱,size是內(nèi)存大小,rate是速率,單位 每秒是(r/s),沒分鐘是 (r/m)。該指令只能在http塊使用。

limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;

上面配置表示使用客戶端IP為key,統(tǒng)計客戶端請求速率,內(nèi)存大小為10m。1M的內(nèi)存大約可存儲16000個IP的統(tǒng)計信息,所以10M大概可以統(tǒng)計16萬個IP。 內(nèi)存區(qū)域名稱為limitbyaddr,控制客戶端請求速率為每秒3個請求。

limit_req指令限制速率

limit_req zone=name [burst=number] [nodelay | delay=number];

limit_req用來設置請求速率,zone指定使用的limit_req_zone 設定的區(qū)域名稱。這樣nginx會安裝zone指定的速率來控制客戶端請求。對應超過給定速率的請求,nginx 會進行拒絕處理。防止過多的請求對服務器造成壓力。

如果zone的內(nèi)存耗盡后,nginx會移除最早的key。如果此時空間還不夠存儲新的請求記錄,則nginx或返回503錯誤。

然而對應一個網(wǎng)站或應用來說,訪問流量起始不是平順的,存在波動,如果波動超過速率就進行拒絕其實這也不是我們想要的,影響應用整體穩(wěn)定性。這個時候可以使用burst參數(shù)來處理突發(fā)流量。burst 參數(shù)允許請求數(shù)量短時間內(nèi)超過正常的速率限制,最多可達到指定的 burst 值。

配合burst使用還有一個 delay和nodelay參數(shù)。nodelay 表示在處理突發(fā)請求時,不會延遲這些突發(fā)請求的處理。如果沒有這個參數(shù),突發(fā)的請求會被排隊并延遲,直到可以按照速率限制處理為止。

limit_req_zone $binary_remote_addr zone=limitbyaddr:10m rate=3r/s;
server {
    location / {
        limit_req zone=limitbyaddr burst=12 delay=9;
    }
}

上面配置正常每秒鐘限制3個請求 ,允許最大峰值波動請求是12個,第9個超過速率的請求會放入隊列延遲處理。

超過限制速率被拒絕的請求,也可以自動義狀態(tài)碼,通過limit_req_status 指令設置。

到此這篇關于nginx控制連接數(shù)及訪問速率的實現(xiàn)的文章就介紹到這了,更多相關nginx控制連接數(shù)及訪問速率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論