nginx 流量整形应基于客户端类型(移动/低带宽/内网)识别带宽能力,通过 ua、save-data 头、ip 段等特征分类,再用 limit_rate 分层限速并动态适配响应内容,同时避免缓存分裂与连接占用。

优化 Nginx 针对不同带宽的传输流量整形,核心不是“按带宽值配置”,而是根据客户端网络条件(如移动 4G/5G、家庭宽带、企业专线)识别其典型带宽能力,并施加匹配的限速与响应策略。Nginx 本身不测速,但可通过客户端特征间接判断,再结合 limit_rate、limit_req 和缓存协同实现差异化传输控制。
按客户端类型做带宽感知分类
真实带宽无法实时探测,但可基于可靠代理头或 UA 特征做合理推测:
-
移动设备:用
$http_user_agent匹配常见移动 UA(如 iOS Safari、Android Chrome),或检查$http_x_mobile(若前端 SDK 注入) -
低带宽标识:识别请求头中的
Save-Data: on(Chrome/Firefox 支持),这是明确的“省流模式”信号 -
内网/高带宽来源:通过
$remote_addr或$http_x_forwarded_for判断是否来自办公网段或 CDN 回源 IP 段
用 limit_rate 实现分层下行限速
对已分类的请求,直接限制 Nginx 向客户端吐数据的速度,避免大文件拖慢弱网用户:
- 移动用户限速 256k/s:
limit_rate 256k; - Save-Data 用户限速 128k/s:
limit_rate 128k; - 内网或高优先级用户不限速:
limit_rate 0;(0 表示关闭限速) - 配合
limit_rate_after 1m可设“前 1MB 不限速”,兼顾首屏加载体验
结合响应内容动态适配
限速只是控制“怎么发”,更要控制“发什么”:
- 对移动/低带宽请求,重写 URL 指向压缩版资源,例如将
/video.mp4→/video-mobile.mp4 - 用
add_header X-Bandwidth-Class $bandwidth_class;通知后端,由应用返回适配分辨率的图片或精简 JSON 字段 - 对视频类路径,启用
mp4模块并配合limit_rate,让 Nginx 原生支持范围请求+速率控制
避免限速干扰缓存与连接复用
不当限速会破坏 HTTP 缓存效率和 TCP 复用:
- 不要在
location ~ \.(js|css|png)$中直接写limit_rate,应先分类再限速,否则同一静态资源对不同用户产生不同 ETag,导致缓存分裂 - 限速不影响 keepalive,但建议搭配
keepalive_timeout 15s;和keepalive_requests 100;,防止慢速连接长期占用 worker 连接槽位 - 若使用 proxy_pass,限速应在 upstream 后端响应阶段生效(即在
location块中设置),而非在 proxy_read_timeout 等超时参数上硬调











