协商缓存带宽节省能力需在可控弱网下验证:确保etag/last-modified正确生成与传递,nginx保留响应头并启用proxy_cache,用tc模拟弱网,对比首次与协商请求的body size和wire size,304响应体为0、传输量降99.7%以上。

直接在弱网环境下测协商缓存的带宽节省能力,关键不是“让 Nginx 做什么新配置”,而是构建可比、可观测、能复现的验证链路。协商缓存(ETag / Last-Modified)是否真省带宽,取决于整个请求—响应闭环是否稳定生效,尤其在网络延迟高、丢包率高的条件下,它的收益和风险都会被放大。
确认协商缓存链路已完整就位
弱网测试前必须确保基础链路无缺陷,否则测出的结果全是噪音:
- 后端响应必须稳定输出语义准确的 ETag(推荐内容哈希,禁用时间戳或随机值)或 Last-Modified(精度为秒,需确保时钟同步)
- 客户端(如 curl 或 Chrome DevTools)发起的第二次请求,必须携带 If-None-Match 或 If-Modified-Since 头
- Nginx 需启用缓存并保留原始响应头:确认
proxy_cache已开启,且未用proxy_hide_header ETag等指令破坏头信息 - 避免干扰项:后端返回
Set-Cookie会默认导致 Nginx 跳过缓存;若接口无用户态,加proxy_ignore_headers Set-Cookie;
模拟弱网并隔离测量维度
用工具制造可控弱网条件,分别抓取「首次请求」和「协商请求」的完整传输数据:
- 用
tc(Linux Traffic Control)在 Nginx 服务器或客户端侧限速+丢包,例如:tc qdisc add dev eth0 root netem delay 300ms loss 2% - 用
curl -v或httpie --print=hb发起两次请求,手动添加条件头:curl -H "If-None-Match: \"abc123\"" http://example.com/api/data - 重点对比两项:响应体大小(Body Size) 和 实际传输字节数(Wire Size) —— 协商成功时 Body Size 应为 0,Wire Size 通常在 200–500 字节(仅响应头)
观察真实带宽节省效果
协商缓存的带宽节省不体现在“单次请求快慢”,而体现在“重复请求下体数据归零”:
- 在弱网下,200 响应需传输完整资源(比如 120KB JSON),耗时长、易因丢包重传
- 304 响应只传头部(比如 320 字节),即使延迟 300ms,总传输量也下降 99.7% 以上
- 用
nginx日志记录$body_bytes_sent字段,配合$status过滤,可统计 304 占比与对应字节数节省比例 - 注意:若 304 比例低,问题大概率不在 Nginx,而在后端未正确校验 ETag 或客户端未发条件头
警惕弱网下的副作用
协商缓存在弱网中可能暴露设计缺陷,反而增加负担:
- 每次协商都需一次往返(RTT),300ms 延迟下,首字节时间(TTFB)必然升高 —— 它省的是“体”,不是“时”
- 若后端校验逻辑慢(如数据库查 hash),304 可能比 200 还慢,此时应考虑延长强缓存时间(
s-maxage),减少协商频次 - 丢包可能导致条件请求失败,Nginx 默认降级为 200(除非配置了
proxy_next_upstream error timeout http_500;等容错)











