Nginx 中记录后端 upstream 处理时间需使用 $upstream_response_time 变量,仅在显式定义 upstream 块并 proxy_pass 引用时生效;该字段表示后端响应耗时(单位秒,毫秒精度),多个 upstream 调用时以逗号分隔,超时或失败时显示为“-”或空。

要在 Nginx 日志中记录后端 upstream 的处理时间(即后端服务真正响应耗时),关键字段是 $upstream_response_time,它表示 Nginx 从发送请求到收到后端完整响应所花费的时间(单位:秒,精度为毫秒,用小数表示)。
确认 upstream 配置已启用
该变量仅在请求实际转发给 upstream 块(如 proxy_pass 指向一个 upstream 名称)时才有值。如果直接 proxy_pass 到固定地址(如 proxy_pass http://127.0.0.1:8000)且未定义 named upstream,部分旧版本 Nginx 可能不填充该变量。
- 推荐显式定义 upstream 块,例如:
upstream backend {
server 127.0.0.1:8000;
}再在 location 中使用:proxy_pass http://backend;
在 log_format 中添加 $upstream_response_time
默认日志格式不含该字段,需自定义日志格式并引用:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';注意:$request_time 是整个请求处理时间(含 Nginx 接收请求、转发、等待响应、发送响应全过程),而 $upstream_response_time 仅反映后端响应耗时,两者常一起对比分析性能瓶颈。
处理多个 upstream 请求的情况
若一次请求触发多次 upstream 调用(如 proxy_next_upstream、内部子请求、或使用了 mirror、auth_request 等模块),$upstream_response_time 默认只记录**最后一次** upstream 的响应时间,且多个值会以逗号分隔(如 "0.002, 0.045, 0.001")。
- 如需统计平均或最大 upstream 时间,建议在日志采集端(如 Filebeat + Logstash 或 Loki)做解析和聚合
- 若只需首个 upstream 时间,可用
$upstream_response_time结合正则提取第一个数值(如~^([0-9.]+))
注意事项与常见问题
$upstream_response_time 在后端超时、连接失败或 Nginx 主动中断时可能为“-”或为空字符串,日志中会显示为短横线或留空。
- 确保
proxy_connect_timeout、proxy_read_timeout设置合理,否则超时会导致该字段缺失,影响监控准确性 - 该变量不包含 DNS 解析、SSL 握手等前置耗时(这些属于连接建立阶段,由 Nginx 自行完成)
- 若使用了 keepalive 连接池,该时间仍准确反映本次请求的后端处理耗时,不受连接复用影响










