必须组合使用$upstream_response_time、$upstream_status、$upstream_tries三个变量,配置proxy_next_upstream触发重试,并通过log_format显式记录,才能准确监控upstream耗时与重试次数。

要在 Linux 的 Nginx 中准确记录 upstream 耗时和重试次数,关键不是只加一个变量,而是组合使用几个核心字段,并确保 upstream 行为被正确触发和捕获。
必须记录的三个基础变量
在 log_format 中显式包含以下变量,缺一不可:
-
$upstream_response_time:每次 upstream 尝试的响应耗时(单位秒,毫秒精度),重试时以逗号分隔,如
0.002, 0.045, 1.203 -
$upstream_status:对应每次尝试的状态码,顺序与耗时严格对齐,如
502, 504, 200,用于判断哪次成功 -
$upstream_tries:Nginx 1.19.0+ 提供,直接表示本次请求总共尝试次数(含首次),如
3。低于该版本需靠$upstream_addr字段逗号个数 +1 间接推算
推荐日志格式示例
在 http 块中定义:
然后在 server 或 location 中启用:
access_log /var/log/nginx/upstream.log upstream_full;
确保重试行为真实发生
仅记录变量不够,必须让 Nginx 主动执行重试,否则 $upstream_tries 永远是 1:
- 在
upstream或location中配置:proxy_next_upstream error timeout http_502 http_503 http_504; - 限制最大尝试次数:
proxy_next_upstream_tries 3;(避免无限重试) - 设置合理超时:
proxy_connect_timeout 3s; proxy_read_timeout 10s; - 建议搭配多个后端节点(至少两个),便于观察不同地址的耗时与状态差异
验证是否生效
检查日志输出是否符合预期模式:
- 无重试:字段中
tries=1,upstream="10.0.1.5:8080",status_code="200",rt="0.023" - 一次重试后成功:字段中
tries=2,upstream="10.0.1.5:8080, 10.0.1.6:8080",status_code="502, 200",rt="0.001, 0.037" - 若所有 upstream 相关字段为空或为
-,说明请求未进入代理流程(如被 rewrite、return、静态文件直出拦截)


















