nginx默认轮询不记录后端选择详情,需配置log_format含$upstream_addr等变量并启用access_log,才能记录每次请求转发到的具体upstream服务器地址及状态、耗时等信息。

Nginx 默认的轮询(round-robin)负载均衡不会自动记录后端服务器选择详情,要记录“哪次请求被转发到了哪个 upstream server”,需手动配置 log_format 和 $upstream_addr 等变量,并确保启用 access_log。
关键日志变量说明
以下变量可用于记录负载均衡决策过程:
- $upstream_addr:实际转发到的后端地址(含 IP:Port,多个时用逗号分隔;发生重试时会列出所有尝试过的地址)
- $upstream_status:对应每个 upstream 请求的 HTTP 状态码(如 “200,502” 表示先失败后成功)
- $upstream_response_time:各次 upstream 响应耗时(单位秒,毫秒级精度,如 “0.002,1.345”)
-
$upstream_http_xxx:可记录后端返回的特定响应头(如
$upstream_http_x_backend_name)
配置详细负载均衡日志格式
在 http 块中定义自定义日志格式,例如:
log_format upstream_log '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'upstream: $upstream_addr ' 'upstream_status: $upstream_status ' 'upstream_response_time: $upstream_response_time ' 'request_time: $request_time';
然后在 server 或 location 块中启用该日志:
access_log /var/log/nginx/upstream_access.log upstream_log;
验证日志是否生效
发送请求后检查日志文件,正常输出类似:
192.168.1.100 - - [10/Jul/2024:14:22:33 +0800] "GET /api/user HTTP/1.1" 200 124 "-" "curl/7.68.0" upstream: 10.0.1.20:8080 upstream_status: 200 upstream_response_time: 0.023 request_time: 0.024
若 $upstream_addr 显示为空或显示为 "-", 说明未命中 upstream(比如请求被本地处理、返回 error_page、或配置了 proxy_pass 但没走 upstream 名称)。
注意事项与常见问题
- 确保
proxy_pass指向的是upstream块名称(如proxy_pass http://backend;),而非直接写死 IP,否则$upstream_*变量不生效 - 如果使用了
proxy_next_upstream且发生重试,$upstream_addr和$upstream_status会包含多个值,用逗号分隔,注意日志解析逻辑 -
$upstream_response_time是每个 upstream 请求的耗时,不是总耗时;$request_time才是客户端完整请求耗时 - 高并发下频繁写入详细日志可能影响性能,生产环境建议按需开启,或通过
map控制仅对特定 path 或状态码记录











