实现差异化服务的关键是基于网络特征推断带宽而非测速:利用Save-Data头、UA、IP段等信号分类用户,再通过limit_rate分层限速、Vary头缓存适配及内容重写实现精准控制。

实现按客户端带宽的差异化服务,关键不是测速,而是基于可识别的网络特征做合理推断,再联动限速、缓存、响应内容等策略。Nginx 本身不测量实时带宽,但能通过请求头、UA、IP 段等信号分类用户,并施加匹配的传输控制。
识别带宽相关客户端特征
真实带宽无法动态探测,但以下字段具备强业务含义,可作为分类依据:
-
Save-Data 头:浏览器明确声明“省流模式”,值为
on时,代表用户主动选择低带宽体验,应优先适配 -
User-Agent:匹配移动设备标识(如
iOS、Android、Mobile)可大致对应 4G/5G 典型速率区间 -
IP 段来源:内网地址(如
10.0.0.0/8)、办公网段或 CDN 回源 IP,通常对应高带宽环境;海外公网 IP 可默认归为中低带宽组 -
自定义请求头:前端 SDK 或网关可注入
X-Network-Quality或X-Bandwidth-Class等字段,提供更精准分级
用 limit_rate 分层限速
限速是带宽感知最直接的落地方式,建议配合 limit_rate_after 提升首屏或预览体验:
- Save-Data 用户:
limit_rate 128k; limit_rate_after 512k;(前 512KB 快速加载,之后限速) - 移动设备用户:
limit_rate 256k; limit_rate_after 1m; - 内网或白名单 IP:
limit_rate 0;(不限速) - 其他普通用户:
limit_rate 512k;
这些指令应放在匹配静态资源或下载路径的 location 块中,例如 location ^~ /media/ 或 location ~ \.(mp4|zip|pdf)$。
结合缓存与响应内容适配
仅限速不够,还需让内容本身适配带宽能力:
- 添加
Vary: Save-Data, User-Agent响应头,确保 CDN 和 Nginx 缓存区分不同带宽版本 - 若后端支持,可通过
proxy_set_header Save-Data $http_save_data;将省流信号透传,由应用返回压缩版 HTML 或 WebP 图片 - 对视频类资源,可在 location 中用
map指令根据$http_save_data重写请求路径,例如将/video/abc.mp4改为/video/abc-low.mp4
避免常见陷阱
几个容易被忽略但影响实际效果的细节:
-
limit_rate作用于单连接发送速率,不控制并发数;高并发弱网用户仍可能挤占带宽,需配合limit_conn控制连接总数 - 不要在
if块中使用limit_rate,Nginx 不支持条件限速,应改用map预计算变量 - 启用
sendfile on时,limit_rate依然生效,但内核零拷贝会略微降低 CPU 开销 - 若使用 proxy_cache,必须把带宽标识(如
$http_save_data)加入proxy_cache_key,否则缓存会混用


















