在nginx中,对特定虚拟主机下行限速需将limit_rate置于对应server块内,支持单位k/m/b,值为0表示禁用;可配合limit_rate_after实现首部不限速后限速;该指令仅作用于响应体,具继承性且按就近原则覆盖。

在 Nginx 中,limit_rate 指令可用于限制响应给客户端的下行带宽(即服务器发往客户端的数据速率),且可作用于特定虚拟主机(server 块)、location 块甚至整个 http 上下文。要实现“对特定虚拟主机的下行限速”,关键在于将 limit_rate 正确放在对应 server 块内,并注意其继承与覆盖行为。
1. 在 server 块中直接配置 limit_rate
这是最直接的方式:只要把 limit_rate 放在目标虚拟主机的 server 块中,该 server 下所有请求(除非被子块显式覆盖)都会受此限速约束。
示例:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;"># 对该虚拟主机所有响应统一限速为 500KB/s
limit_rate 500k;
location / {
root /var/www/example;
index index.html;
}
location /api/ {
# 此处可单独取消或调整限速
limit_rate 0; # 0 表示不限速
proxy_pass http://backend;
}}
说明:
• limit_rate 500k 表示每秒最多发送 500 KiB(即 512,000 字节),单位支持 k(KiB)、m(MiB)、b(字节);
• limit_rate 0 表示禁用限速(注意不是“不限制”,而是显式关闭该指令的效果);
• 该指令仅控制响应体(response body)的发送速率,不包括响应头(headers)和文件元数据。
2. 结合 limit_rate_after 实现“首 X 字节不限速”
对于大文件下载等场景,常希望前几 MB 快速加载(提升感知速度),之后再限速。Nginx 提供 limit_rate_after 配合 limit_rate 实现该逻辑。
示例(仅对该虚拟主机生效):
server {
listen 443 ssl;
server_name files.example.com;
<pre class="brush:php;toolbar:false;">limit_rate_after 2m; # 前 2 MiB 不限速
limit_rate 100k; # 超过后限速 100 KiB/s
location /downloads/ {
alias /data/downloads/;
}}
说明:
• limit_rate_after 必须与 limit_rate 同级使用(同在 server 或 location 中);
• 它统计的是单个 HTTP 响应的已发送响应体字节数,不是连接总流量;
• 该组合只影响当前 server 块,不影响其他虚拟主机。
3. 注意作用域与继承关系
limit_rate 是可继承指令,但优先级遵循“就近原则”。需避免意外覆盖或遗漏:
- 若在
http块设了全局limit_rate 100k,又想某个server不限速,必须在该server内显式写limit_rate 0; - 若在
location中设置了更细粒度的限速(如视频流用limit_rate 2m),它会覆盖server级设置; - 限速基于每个 TCP 连接独立生效,不跨请求累积,也不做用户级或 IP 级聚合控制(如需 IP 限速,请用
limit_conn或limit_req)。
4. 验证与调试建议
限速生效后可通过以下方式确认:
- 用
wget -S或curl -v查看响应头,限速本身不修改 header,但可观察传输耗时是否符合预期; - 用
ab、wrk或浏览器开发者工具的 Network 面板下载一个 >5MB 的静态文件,观察平均下载速率是否稳定在设定值附近; - 检查 Nginx error log 是否有相关警告(如单位解析错误),确保配置语法正确(
nginx -t); - 注意:限速在启用 gzip 或 brotli 压缩时,是对压缩后的响应体限速,不是原始内容大小。











