要让 Nginx access_log 显示后端实际响应 IP(含端口),必须使用内置变量 $upstream_addr,该变量在 proxy_pass 执行后自动填充真实 upstream 节点地址;需在 http 块中定义 log_format 并在启用 proxy_pass 的 location 中配置 access_log,且确保 proxy_pass 有效执行。

使用 $upstream_addr 记录后端实际响应 IP
要让 Nginx access_log 显示请求最终转发到的后端服务器 IP(含端口),必须使用内置变量 $upstream_addr。这个变量在 proxy_pass 执行完成后自动填充,反映本次请求真实抵达的 upstream 节点地址,包括负载均衡场景下的动态选择结果。
配置步骤和关键位置
该变量只能在 http 块中定义 log_format,不能只写在 location 里。示例配置如下:
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
- 在 http { } 区域添加日志格式:
log_format backend_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr"'; - 在启用 proxy_pass 的 server 或 location 块中启用日志:
access_log /var/log/nginx/backend_access.log backend_log; - 确保 location 内存在有效的 proxy_pass 指令,例如:
proxy_pass http://app_backend; 或 proxy_pass http://10.0.2.5:8080;
注意不同部署方式的表现
$upstream_addr 的值取决于 upstream 配置方式:
- 若 proxy_pass 直接指向单个固定地址(如 http://192.168.1.10:3000),日志中该字段恒为该地址
- 若使用 upstream 块定义多个节点,它会如实记录本次选中的后端,例如 192.168.1.10:3000;重试时可能变为 192.168.1.11:3000
- 支持轮询、ip_hash、least_conn 等策略,变量始终反映真实处理节点
常见问题排查
如果 $upstream_addr 显示为空或“-”,需检查:
- proxy_pass 是否配置在当前 location 中,且未因语法错误(如末尾多余斜杠)导致失效
- 请求是否真正走到了 proxy_pass 流程(例如被 rewrite 或 return 提前终止)
- 是否在非 proxy 场景(如静态文件服务)下误用了该变量

















