nginx限速怎么實(shí)現(xiàn)

nginx限速可以通過(guò) ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模塊來(lái)實(shí)現(xiàn)限速的功能。

一、ngx_http_limit_conn_module :

  該模塊主要限制下載速度。

1、并發(fā)連接限制:

http {     ...     limit_conn_zone $binary_remote_addr zone=aming:10m;     ...     server     {         ...         limit_conn aming 10;         ...        } } 說(shuō)明:首先用limit_conn_zone定義了一個(gè)內(nèi)存區(qū)塊索引aming,大小為10m,它以$binary_remote_addr作為key。 該配置只能在http里面配置,不支持在server里配置。  limit_conn 定義針對(duì)aming這個(gè)zone,并發(fā)連接為10個(gè)。在這需要注意一下,這個(gè)10指的是單個(gè)IP的并發(fā)最多為10個(gè)。

2、速度限制:

location ~ /download/ {     ...     limit_rate_after 512k;     limit_rate 150k;     ... } 說(shuō)明:limit_rate_after定義當(dāng)一個(gè)文件下載到指定大小(本例中為512k)之后開(kāi)始限速; limit_rate 定義下載速度為150k/s。  注意:這兩個(gè)參數(shù)針對(duì)每個(gè)請(qǐng)求限速。

二、ngx_http_limit_req_module:

該模塊主要用來(lái)限制請(qǐng)求數(shù)。

1、limit_req_zone:

語(yǔ)法: limit_req_zone $variable zone=name:size rate=rate; 默認(rèn)值: none 配置段: http  設(shè)置一塊共享內(nèi)存限制域用來(lái)保存鍵值的狀態(tài)參數(shù)。 特別是保存了當(dāng)前超出請(qǐng)求的數(shù)量。  鍵的值就是指定的變量(空值不會(huì)被計(jì)算)。 如limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  說(shuō)明:區(qū)域名稱為one,大小為10m,平均處理的請(qǐng)求頻率不能超過(guò)每秒一次,鍵值是客戶端IP。 使用$binary_remote_addr變量, 可以將每條狀態(tài)記錄的大小減少到64個(gè)字節(jié),這樣1M的內(nèi)存可以保存大約1萬(wàn)6千個(gè)64字節(jié)的記錄。 如果限制域的存儲(chǔ)空間耗盡了,對(duì)于后續(xù)所有請(qǐng)求,服務(wù)器都會(huì)返回 503 (Service Temporarily Unavailable)錯(cuò)誤。 速度可以設(shè)置為每秒處理請(qǐng)求數(shù)和每分鐘處理請(qǐng)求數(shù),其值必須是整數(shù), 所以如果你需要指定每秒處理少于1個(gè)的請(qǐng)求,2秒處理一個(gè)請(qǐng)求,可以使用 “30r/m”。

2、limit_req

語(yǔ)法: limit_req zone=name [burst=number] [nodelay]; 默認(rèn)值: — 配置段: http, server, location  設(shè)置對(duì)應(yīng)的共享內(nèi)存限制域和允許被處理的最大請(qǐng)求數(shù)閾值。  如果請(qǐng)求的頻率超過(guò)了限制域配置的值,請(qǐng)求處理會(huì)被延遲,所以所有的請(qǐng)求都是以定義的頻率被處理的。  超過(guò)頻率限制的請(qǐng)求會(huì)被延遲,直到被延遲的請(qǐng)求數(shù)超過(guò)了定義的閾值, 這時(shí),這個(gè)請(qǐng)求會(huì)被終止,并返回503 (Service Temporarily Unavailable) 錯(cuò)誤。  這個(gè)閾值的默認(rèn)值為0。如: limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s; server {     location /upload/ {         limit_req zone=aming burst=5;     } }  限制平均每秒不超過(guò)一個(gè)請(qǐng)求,同時(shí)允許超過(guò)頻率限制的請(qǐng)求數(shù)不多于5個(gè)。  如果不希望超過(guò)的請(qǐng)求被延遲,可以用nodelay參數(shù),如:  limit_req zone=aming burst=5

示例:

http {     limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;      server {         location  ^~ /download/ {               limit_req zone=aming burst=5;         }     } }

設(shè)置白名單:

如果是針對(duì)公司內(nèi)部IP或者lo(127.0.0.1)不進(jìn)行限速,如何做呢?這就要用到geo模塊了。  假如,預(yù)把127.0.0.1和192.168.100.0/24網(wǎng)段設(shè)置為白名單,需要這樣做。 在http { }里面增加: geo $limited {     default 1;     127.0.0.1/32 0;     192.168.100.0/24 0; }  map $limited $limit {     1 $binary_remote_addr;     0 ""; }  原來(lái)的 “l(fā)imit_req_zone $binary_remote_addr ” 改為“l(fā)imit_req_zone $limit”  完整示例:  http {     geo $limited {         default 1;         127.0.0.1/32 0;         192.168.100.0/24 0;     }      map $limited $limit {         1 $binary_remote_addr;         0 "";     }          limit_req_zone $limit zone=aming:10m rate=1r/s;      server {         location  ^~ /download/ {               limit_req zone=aming burst=5;         }     } }

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享