$upstream_response_time 是 Nginx 记录后端处理请求耗时的关键变量,单位秒、精确到毫秒,仅统计从发完请求到收完响应头的时间,不含 Nginx 自身网络开销;可用于区分后端慢或网络/Nginx 层慢,并通过日志、map 分级、upstream_addr 关联分析实现精准定位与监控。

在 Nginx 中,$upstream_response_time 是一个关键变量,用于记录后端服务(如 FastAPI、Django、Node.js 等)处理请求所花费的时间,单位是秒,精确到毫秒(例如 0.042 表示 42ms)。它不包含 Nginx 自身的网络开销(如 DNS 查询、TCP 握手、SSL 握手),只统计从 Nginx 向上游发送完请求,到收到完整响应头之间的时间。合理利用它,能快速定位是“后端慢”还是“Nginx 或网络层慢”。
在日志中记录并分析延迟分布
将 $upstream_response_time 加入 access log,是诊断的第一步。修改 http 或 server 块中的 log_format:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time $upstream_addr';其中:
– $request_time:整个请求在 Nginx 内部耗时(含网络接收、转发、响应返回);
– $upstream_response_time:纯后端处理时间;
– 二者差值大(如 $request_time=1.234,$upstream_response_time=0.012),说明瓶颈在 Nginx 到客户端之间(如慢客户端、大响应体、带宽受限);
– 若两者接近且都高,则问题大概率出在后端应用或其依赖(DB、缓存、外部 API)。
用 map 指标分类,辅助监控告警
可结合 map 指令,把 $upstream_response_time 映射为延迟等级,便于按级别统计或打标:
map $upstream_response_time $upstream_latency_level {
~^[0-9]\.[0-5][0-9]{2}$ "fast"; # < 0.6s
~^[0-9]\.[6-9][0-9]{2}$ "slow"; # 0.6–0.999s
~^[1-9][0-9]*\.[0-9]{3}$ "very_slow"; # ≥ 1s
default "unknown";
}然后在 log_format 或自定义 header 中使用 $upstream_latency_level,配合 Prometheus 的 nginx-exporter 或 ELK,就能做延迟分桶统计和 P95/P99 趋势分析。
配合 upstream 模块识别具体慢节点
当使用多台后端(如 upstream backend { server 10.0.1.10; server 10.0.1.11; })时,$upstream_response_time 默认只记录本次选中的节点耗时。但加上 $upstream_addr(实际通信地址)就能关联定位:
- 若某 IP 地址持续出现在 high
$upstream_response_time日志中,可能是该实例 CPU 过载、GC 频繁或连接池枯竭; - 对比同一请求路径下不同
$upstream_addr的响应时间差异,可判断是否负载不均或个别节点异常; - 配合
keepalive和max_fails设置,可验证健康检查是否及时剔除慢节点。
注意边界与常见误区
$upstream_response_time 不是万能指标,需结合上下文理解:
- 它仅对成功转发到 upstream 的请求有效;502/503/504 错误时该变量为空或为“-”,不能直接参与平均计算;
- 如果启用了 proxy_buffering off 或流式响应(如 SSE、gRPC streaming),该值可能只反映首包时间,不代表整体处理完成;
- 重试场景下(
proxy_next_upstream error timeout),该变量记录的是**最后一次成功响应**的时间,不是首次尝试; - 它不含 upstream 建立连接的时间(由
$upstream_connect_time单独提供),若连接建立慢(如 TLS 握手长),需额外关注后者。


















