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