nginx 1.18 反向代理静态资源,日志里 request_time 平均三秒多,upstream_response_time 只有 0.1 秒,带宽监控也没跑满,可用户就是觉得慢,弱网下更明显。

一开始怀疑是「大文件没有开 sendfile,多了一次用户态拷贝」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。客户端接收慢,nginx 的发送缓冲区塞满之后一直被拖住,请求迟迟不结束。另一种情况是对已经压缩过的图片又开 gzip,压缩耗 CPU 且对体积没帮助。

少数情况下是keepalive 连接上排队,前一个慢请求把后面的请求堵在同一个连接里。

先按两列差把慢请求筛出来

awk '{d=$(NF-1)-$NF; if (d>1) print $7, $(NF-1), $NF}' /var/log/nginx/access.log | head -20

接着确认 gzip 与 sendfile 的当前配置

grep -E 'gzip|sendfile|keepalive_timeout' /etc/nginx/nginx.conf

然后关掉全站 gzip,只给文本类开

sed -i 's/^\s*gzip on;/    gzip off;/' /etc/nginx/nginx.conf && nginx -t && nginx -s reload

限速拉一个客户端复现发送慢的场景

curl --limit-rate 50k -o /dev/null -s -w '%{time_total}\n' http://127.0.0.1/big.js

别只看报错消失,验证要多做一步。同类请求的 request_time 与 upstream_response_time 差值降到 0.2 秒以内,限速复现时耗时随限速值线性变化而不再翻倍。

这里还有个坑。这两列的差值基本等于发送给客户端的时间,排查方向应该放在链路和客户端,而不是继续查后端。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189