问题出现得很突然,日志倒是留得挺全。站点上了 CDN 之后响应偶尔到 3 秒,Nginx 日志里 $request_time 是 3.02,$upstream_response_time 却一直记成横杠,分不清是回源慢还是边缘慢,客服每天来问一次。

刚开始盯着「CDN 回源时改写了 Host,命中了另一个 server 块的日志」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。请求全部命中本地静态缓存,没有走 upstream,这个变量自然为空。另一种情况是log_format 里把变量名拼错,Nginx 静默输出连字符。

另外,反向代理层自己返回 504,上游请求没有完整建立。

先确认变量名和实际输出

nginx -T | grep -n 'upstream_response_time'

随后找一条耗时超过 2 秒的请求看上下文

awk '$NF>2 {print}' /var/log/nginx/access.log | tail -20

接着对比命中缓存与回源两类请求的耗时

awk '{print $9, $NF}' access.log | sort | uniq -c | sort -rn | head

剩下的就是在

改完先别撤,确认这几项。对齐两边日志后慢请求集中在回源那 8%,源站的慢查询被定位到,修完 P95 从 3.1 秒回落到 600 毫秒。

变量输出连字符不一定是故障,先确认这条请求到底有没有经过 upstream,再谈优化。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189