Nginx 无法透传客户端真实带宽,因 HTTP 协议无标准头定义带宽信息,且 Nginx 无测量能力;可行方案仅限前端主动探测上报或内网客户端配合上报,Nginx 仅能透传自定义头。

Nginx 的 proxy_set_header 无法透传客户端真实网络带宽状况。
原因很明确:
HTTP 协议本身没有定义任何标准请求头来携带客户端的实时带宽(如 Mbps、延迟、丢包率等),Nginx 也不具备测量或获取客户端出口带宽的能力。$remote_addr 可取 IP,$request_time 可记本机处理耗时,但没有任何内置变量能反映用户侧的网络吞吐能力。
目前不存在 proxy_set_header X-Client-Bandwidth $xxx 这样的可行方案。
为什么常见思路都行不通?
没有
$client_bandwidth或类似变量
Nginx 变量文档中完全不包含带宽相关字段;$bytes_sent、$upstream_response_length等是服务端统计值,与客户端带宽无关。浏览器不主动上报带宽
标准 HTTP 请求头(如User-Agent、Accept)不含网络质量信息;WebRTC 或自定义 JS 测速结果属于前端应用层行为,需主动发起并上传,不能由 Nginx 自动注入。中间设备(CDN/WAF/SLB)也不会提供该信息
即使请求经过阿里云 CDN 或 Cloudflare,它们同样不向源站透传“客户端带宽”,最多提供X-Forwarded-For、CF-Connecting-IP等 IP 类信息。
如果业务真需要带宽感知,可考虑这些替代路径:
前端主动探测 + 上报
页面加载时用navigator.connection.effectiveType(如4g、slow-2g)或navigator.connection.downlink(粗略 Mbps 值),再通过 AJAX 或埋点 header(如X-Client-Downlink: 3.2)发给后端。
⚠️ 注意:该 API 非全浏览器支持,且值为估算,非实时实测。-
服务端主动测速(仅限可控内网场景)
若客户端是公司内部终端,可通过预置 SDK 定期 ping/udp-traceroute 或下载小文件测算,再将结果写入请求头(如X-Reported-Bandwidth: 85Mbps),Nginx 可透传:proxy_set_header X-Reported-Bandwidth $http_x_reported_bandwidth;
但需开启
underscores_in_headers on;,且依赖客户端配合。 用已知特征间接推测(弱相关)
比如结合User-Agent判断设备类型(移动端 vs PC)、Accept-Encoding判断是否支持压缩、RTT(若接入了支持 TCP Info 的定制模块)等,做粗粒度分组——但这不是真实带宽,只是启发式策略。
总结一句话:
Nginx 是七层代理,它只处理已有 HTTP 头和连接元数据;带宽是四层以下的动态网络指标,不在其可观测范围内。想让后端“知道”带宽,必须由客户端主动提供,Nginx 最多负责透传那个自定义头。


















