定位网关层损耗的关键是分析$request_time与$upstream_response_time的差值,差值大(如>200ms)表明损耗发生在nginx网关本体或中间网络;常见原因包括客户端上传卡顿、nginx自身开销大、网络延迟抖动、请求排队等待;日志中需同时记录两字段,并用awk提取异常样本;若$upstream_response_time为“-”,说明请求未发往后端,整段时间均属网关损耗;进一步定位需补充$upstream_connect_time、$upstream_header_time等细粒度变量。

定位网关层损耗,关键不是看 $request_time 或 $upstream_response_time 的绝对值,而是盯住它们的差值:$request_time − $upstream_response_time。
差值大,说明损耗在网关或链路层
当差值显著偏高(例如 >200ms),意味着请求在 Nginx 网关本体或中间网络环节被明显拖慢,后端实际处理很快。常见原因包括:
- 客户端上传卡顿:如移动端上传大图、视频,$request_time 高但 $upstream_response_time 很低(如 6.2s vs 0.041s)
- Nginx 自身开销大:启用 gzip 压缩大响应体、使用 sub_filter 替换内容、SSL 握手耗时长、proxy_buffering off 导致流式阻塞
- 网络传输延迟或抖动:跨地域访问、CDN 回源路径绕行、中间防火墙/负载均衡设备引入额外延迟
- 请求排队等待:Nginx 启用了 limit_req 或 worker_connections 不足,导致请求在接入队列中滞留
如何从日志中快速识别这类损耗
确保 log_format 中已同时包含两个字段,并用简单命令提取异常样本:
- 查差值最大的前 10 条: awk '{diff = $NF - $(NF-1); if (diff > 0.2) print diff, $0}' /var/log/nginx/access.log | sort -nr | head -10
- 统计某类接口的平均差值(排除后端影响): awk '$7 ~ /^\/upload/ && $(NF-1) != "-" {diff += $NF - $(NF-1); cnt++} END {print "avg gateway overhead:", diff/cnt}' /var/log/nginx/access.log
- 注意:若 $upstream_response_time 为 “-”,说明请求根本未发往后端(如 499 客户端断连、503 服务不可用),此时整个 $request_time 都属于网关层损耗
进一步缩小网关内因,可补充采集更细粒度变量
仅靠差值只能确认“问题在网关侧”,要定位具体环节,需扩展日志字段:
- $upstream_connect_time:建连耗时高 → 检查跨机房延迟、后端连接池满、防火墙拦截
- $upstream_header_time:首字节返回慢但整体响应快 → 后端业务逻辑有同步阻塞(如锁竞争、远程调用未超时但慢)
- $request_length 与 $body_bytes_sent:上传/下载体巨大 → 对应优化 client_max_body_size、proxy_buffering、timeout 设置











