ngx_http_limit_req_module
ngx_http_limit_req_module模塊按照定義的key值限制請(qǐng)求處理速率,特別是對(duì)來(lái)自單個(gè)IP請(qǐng)求的速率限制。
limit_req_zone指令
- 按key設(shè)置一塊共享內(nèi)存存儲(chǔ)狀態(tài)信息、超限請(qǐng)求數(shù)量;key可以包含文本、變量、文本和變量的組合。如果請(qǐng)求中的key為空不會(huì)計(jì)算到請(qǐng)求數(shù)量中。
- limit_req_zone指令只能設(shè)置在http塊中。
- 語(yǔ)法:
limit_req_zone key zone=name:size rate=rate [sync];
- 例:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
。
$binary_remote_addr
將客戶端IP設(shè)置為key(按客戶端IP限制速率)。zone=one:10m
表示區(qū)域命名為one,10m內(nèi)存空間;如果10m空間用完,按最近最少使用原則移除狀態(tài)數(shù)據(jù),如果空間仍然不夠就拒絕處理新請(qǐng)求(返回503)。rate=3r/s
表示速率為每秒3個(gè)請(qǐng)求,單位r/s
表示每秒請(qǐng)求數(shù),如果要設(shè)置的速率小于1r/s
,可以使用r/m
單位,表示每分鐘請(qǐng)求數(shù)。sync
用于集群節(jié)點(diǎn)間的共享內(nèi)存數(shù)據(jù)同步,這里不介紹。
limit_req指令
- limit_req指令用于限制請(qǐng)求速率。
- limit_req會(huì)設(shè)置一塊內(nèi)存區(qū)域用于實(shí)現(xiàn)/管理速率限制,可以給這塊內(nèi)存設(shè)置區(qū)域名、空間大小、速率、瞬間最大請(qǐng)求量。
- 如果請(qǐng)求速率超過(guò)設(shè)置,nginx會(huì)按設(shè)置的速率平滑處理請(qǐng)求(將一些請(qǐng)求延遲處理以達(dá)到設(shè)置速率)。
- 超過(guò)瞬間最大請(qǐng)求量以前的請(qǐng)求會(huì)被延遲處理,而超過(guò)瞬間最大請(qǐng)求量的請(qǐng)求不會(huì)被處理,直接返回錯(cuò)誤狀態(tài)碼為503,可以用limit_req_status指令自定義錯(cuò)誤狀態(tài)碼。
- 語(yǔ)法:
limit_req zone=name [burst=number] [nodelay | delay=number];
。
burst=number
設(shè)置瞬間最大請(qǐng)求量。delay=number
表示延遲處理的請(qǐng)求數(shù)量,默認(rèn)值為0,即所有超過(guò)速率限制的請(qǐng)求都會(huì)被延遲。
7. 只有當(dāng)前配置塊(級(jí)別)沒(méi)有設(shè)置limit_req指令時(shí),才會(huì)從上一個(gè)配置塊繼承配置。 8. limit_req指令可以設(shè)置多個(gè),如以下配置:限制同個(gè)客戶端IP的請(qǐng)求速率,同時(shí)也限制虛擬主機(jī)的請(qǐng)求速率。server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
limit_req_statu指令
設(shè)置拒絕處理的狀態(tài)碼,默認(rèn)值為503 語(yǔ)法:limit_req_status code;
可配置塊:http, server, location
limit_req_log_level指令
1. 設(shè)置拒絕處理和延遲處理的日志級(jí)別,延遲處理級(jí)別比拒絕處理級(jí)別低一級(jí),如imit_req_log_level notice
表示拒絕處理為notice級(jí),延遲處理低一級(jí)為info。
2. 語(yǔ)法 :limit_req_log_level info | notice | warn | error;
默認(rèn)日志級(jí)別:error 可配置塊:http, server, location
測(cè)試
測(cè)試1. 限制同一IP每秒3個(gè)請(qǐng)求,nginx配置:
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location / {
# 限制速率
limit_req zone=one;
root html;
index index.html index.htm;
}
}
1秒鐘內(nèi)啟動(dòng)10個(gè)請(qǐng)求,因?yàn)樗俾氏拗茷?r/s,3個(gè)請(qǐng)求正常響應(yīng),7個(gè)請(qǐng)求返回503:
測(cè)試2. 限制同一IP每秒1個(gè)請(qǐng)求,瞬間最大請(qǐng)求量為5:# 方便查看limit_req限制效果
log_format main '$time_local,$request,$status,limit_req_status=$limit_req_status';
access_log /usr/local/nginx/logs/access.log main;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name xxx.xxx.xxx.xxx;
location /download/ {
alias /var/www/images/;
limit_req zone=one burst=5 nodelay;
}
}
本機(jī)同時(shí)啟動(dòng)15個(gè)請(qǐng)求ab -n 15 -c 15 http://127.0.0.1/download/1.jpg
,因?yàn)楸緳C(jī)發(fā)起的請(qǐng)求能夠第一時(shí)間到達(dá)nginx服務(wù),客戶端jmeter測(cè)試可能因網(wǎng)絡(luò)原因有延遲。速率為1r/s,允許瞬間最大請(qǐng)求5(burst)無(wú)延遲處理,15個(gè)請(qǐng)求中6個(gè)處理成功,9個(gè)錯(cuò)誤返回503,如下圖:
閱讀原文:原文鏈接
該文章在 2025/7/1 23:45:05 編輯過(guò)