在 Nginx 中限制每個(gè)連接(即每個(gè)客戶端)的訪問速度,主要使用的是 limit_rate
和 limit_rate_after
這兩個(gè)指令。
這是一個(gè)非常實(shí)用的功能,常用于提供大文件(如視頻、ISO鏡像)下載的服務(wù),以確保單個(gè)客戶端不會(huì)耗盡所有帶寬,保證服務(wù)器資源的公平使用。
核心指令
limit_rate
limit_rate 100k;
表示將速率限制在每秒 100KB。
?limit_rate 500k;
表示將速率限制在每秒 500KB。?
limit_rate 1m;
表示將速率限制在每秒 1MB。
limit_rate_after
(可選,但推薦使用)
功能:指定在傳輸了多少數(shù)據(jù)之后才開始限速。在達(dá)到這個(gè)閾值之前,傳輸速度是不受限制的。
為什么需要它:這對(duì)于提升用戶體驗(yàn)非常有用。例如,允許用戶快速加載頁面的前幾兆內(nèi)容(如網(wǎng)頁本身、小圖片),或者允許視頻/音頻播放器快速緩沖開頭的部分,以保證流暢播放,然后再對(duì)后續(xù)的下載進(jìn)行限速。
單位:同樣支持 k
(千字節(jié)) 和 m
(兆字節(jié))。
示例:
配置方法
這些指令可以放在 Nginx 配置文件的多個(gè)上下文中,作用范圍不同。
在 server
塊中設(shè)置(對(duì)整個(gè)虛擬主機(jī)生效)
server {
listen 80;
server_name example.com;
# 在傳輸了 5MB 數(shù)據(jù)后,將速度限制為每秒 200KB
limit_rate_after 5m;
limit_rate 200k;
... # 其他配置
}
在 location
塊中設(shè)置(對(duì)特定請(qǐng)求生效)
這是更常見的用法,可以只對(duì)下載大文件的路徑進(jìn)行限速。
server {
listen 80;
server_name example.com;
# 正常網(wǎng)站內(nèi)容,不限速
location / {
root /usr/share/nginx/html;
}
# 對(duì)下載目錄 /download/ 下的所有文件進(jìn)行限速
location /download/ {
alias /data/downloads/;
# 前10MB不限速,之后限速為每秒 500KB
limit_rate_after 10m;
limit_rate 500k;
}
# 針對(duì)特定的文件類型,例如 .iso 文件進(jìn)行更嚴(yán)格的限速
location ~* \.(iso|img)$ {
# 前 20MB 快速下載,之后限速為每秒 100KB
limit_rate_after 20m;
limit_rate 100k;
}
}
通過 $limit_rate
變量進(jìn)行動(dòng)態(tài)控制(高級(jí)用法)
limit_rate
指令實(shí)際上設(shè)置的是 $limit_rate
變量的值。這個(gè)變量可以在運(yùn)行時(shí)被修改,從而實(shí)現(xiàn)動(dòng)態(tài)限速。
示例:根據(jù)請(qǐng)求參數(shù)中的 speed
值來動(dòng)態(tài)限速
# 在http塊中定義一個(gè)map,將參數(shù)映射為速率值
map $arg_speed $limit_rate_val {
default 100k; # 默認(rèn)100KB/s
high 500k; # ...?speed=high 則500KB/s
low 50k; # ...?speed=low 則50KB/s
unlimited off; # ...?speed=unlimited 則不限速(‘off’ 表示取消限制)
}
server {
listen 80;
server_name example.com;
location /download/ {
alias /data/downloads/;
limit_rate_after 10m;
limit_rate $limit_rate_val; # 使用map定義的變量值
}
}
這樣,用戶訪問 https://example.com/download/file.iso?speed=high
就可以獲得更快的下載速度。
重要注意事項(xiàng)
作用單位:limit_rate
限制的是每個(gè) Nginx 工作進(jìn)程與每個(gè)客戶端之間的單個(gè)連接的速率。如果一個(gè)客戶端打開了多個(gè)連接(例如,用下載工具多線程下載),那么它的總速度是 limit_rate * 連接數(shù)
。
全局限速:如果要嚴(yán)格地“每個(gè)IP地址”或“每個(gè)用戶”進(jìn)行全局限速,需要使用 limit_conn_zone
和 limit_conn
來限制并發(fā)連接數(shù),再配合 limit_rate
才能達(dá)到更好效果。limit_rate
本身不限制連接數(shù)。
生效時(shí)機(jī):limit_rate
指令在向客戶端發(fā)送響應(yīng)時(shí)生效。對(duì)于已經(jīng)建立連接的 keep-alive 請(qǐng)求,指令會(huì)在新請(qǐng)求到來時(shí)應(yīng)用。
測(cè)試:配置完成后,記得使用 nginx -t
測(cè)試配置語法是否正確,然后使用 nginx -s reload
重載配置。測(cè)試限速效果可以使用 wget
、curl
或?yàn)g覽器下載文件進(jìn)行觀察。
總結(jié)
指令 | ?作用 | 示例 | 說明 |
---|
limit_rate | 限制單個(gè)連接的傳輸速率 | limit_rate 200k; | 速度限制為 200KB/s |
limit_rate_after | 定義在傳輸多少數(shù)據(jù)后開始限速 | limit_rate_after 10m; | 前 10MB 不限速,之后開始限速 |
最簡單的配置就是在你的 server
或 location
塊中加入:
limit_rate_after 5m;
limit_rate 100k;
該文章在 2025/8/22 14:18:34 編輯過