ngx_http_limit_req_module
ngx_http_limit_req_module模塊按照定義的key值限制請求處理速率,特別是對來自單個IP請求的速率限制。
limit_req_zone指令
- 按key設(shè)置一塊共享內(nèi)存存儲狀態(tài)信息、超限請求數(shù)量;key可以包含文本、變量、文本和變量的組合。如果請求中的key為空不會計算到請求數(shù)量中。
- limit_req_zone指令只能設(shè)置在http塊中。
- 語法:
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ù),如果空間仍然不夠就拒絕處理新請求(返回503)。rate=3r/s
表示速率為每秒3個請求,單位r/s
表示每秒請求數(shù),如果要設(shè)置的速率小于1r/s
,可以使用r/m
單位,表示每分鐘請求數(shù)。sync
用于集群節(jié)點間的共享內(nèi)存數(shù)據(jù)同步,這里不介紹。
limit_req指令
- limit_req會設(shè)置一塊內(nèi)存區(qū)域用于實現(xiàn)/管理速率限制,可以給這塊內(nèi)存設(shè)置區(qū)域名、空間大小、速率、瞬間最大請求量。
- 如果請求速率超過設(shè)置,nginx會按設(shè)置的速率平滑處理請求(將一些請求延遲處理以達到設(shè)置速率)。
- 超過瞬間最大請求量以前的請求會被延遲處理,而超過瞬間最大請求量的請求不會被處理,直接返回錯誤狀態(tài)碼為503,可以用limit_req_status指令自定義錯誤狀態(tài)碼。
- 語法:
limit_req zone=name [burst=number] [nodelay | delay=number];
。
burst=number
設(shè)置瞬間最大請求量。delay=number
表示延遲處理的請求數(shù)量,默認(rèn)值為0,即所有超過速率限制的請求都會被延遲。
7. 只有當(dāng)前配置塊(級別)沒有設(shè)置limit_req指令時,才會從上一個配置塊繼承配置。 8. limit_req指令可以設(shè)置多個,如以下配置:限制同個客戶端IP的請求速率,同時也限制虛擬主機的請求速率。server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
limit_req_statu指令
設(shè)置拒絕處理的狀態(tài)碼,默認(rèn)值為503 語法:limit_req_status code;
可配置塊:http, server, location
limit_req_log_level指令
1. 設(shè)置拒絕處理和延遲處理的日志級別,延遲處理級別比拒絕處理級別低一級,如imit_req_log_level notice
表示拒絕處理為notice級,延遲處理低一級為info。
2. 語法 :limit_req_log_level info | notice | warn | error;
默認(rèn)日志級別:error 可配置塊:http, server, location
測試
測試1. 限制同一IP每秒3個請求,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)啟動10個請求,因為速率限制為3r/s,3個請求正常響應(yīng),7個請求返回503:
測試2. 限制同一IP每秒1個請求,瞬間最大請求量為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;
}
}
本機同時啟動15個請求ab -n 15 -c 15 http://127.0.0.1/download/1.jpg
,因為本機發(fā)起的請求能夠第一時間到達nginx服務(wù),客戶端jmeter測試可能因網(wǎng)絡(luò)原因有延遲。速率為1r/s,允許瞬間最大請求5(burst)無延遲處理,15個請求中6個處理成功,9個錯誤返回503,如下圖:
閱讀原文:原文鏈接
該文章在 2025/7/1 23:45:05 編輯過