要在 Nginx access_log 中记录反向代理实际转发的后端服务器 IP(含端口),需使用 $upstream_addr 变量,该变量在 proxy_pass 执行完成后自动填充,准确反映本次请求最终抵达的 upstream 地址;必须在 http 块中定义 log_format 并启用 access_log,且 proxy_pass 需配置在有效 location 内,支持单后端固定地址与 upstream 负载均衡动态选节点,还可结合 $http_x_forwarded_for 和 $upstream_http_x_real_ip 同时记录客户端与后端 IP。

要在 Nginx 的 access_log 中记录反向代理实际转发到的后端服务器 IP(含端口),核心是使用 $upstream_addr 变量,它在 proxy_pass 执行完成后自动填充,能准确反映本次请求最终抵达的 upstream 地址。
配置日志格式并启用 $upstream_addr
该变量必须在 http 块中定义日志格式,不能只写在 location 里。推荐格式示例如下:
- 在
http{...}区域添加:log_format backend_log '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$upstream_addr"'; - 在对应 server 或 location 中启用:
access_log /var/log/nginx/backend_access.log backend_log;
确保 proxy_pass 生效且位置正确
$upstream_addr 仅在配置了 proxy_pass 的 location 内有效,且需请求完成(含失败)后才可记录。常见有效写法包括:
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- 直接指向 upstream 块:
proxy_pass http://app_backend; - 指向具体地址:
proxy_pass http://10.0.2.5:8080; - 避免 proxy_pass 后带多余路径导致变量失效(如
proxy_pass http://backend/;与proxy_pass http://backend;行为不同)
区分单后端与负载均衡场景
行为取决于 upstream 配置方式:
- 若只配一个后端(如
proxy_pass http://192.168.1.10:3000),日志中$upstream_addr恒为该固定值 - 若使用 upstream 块(含多个 server),它会如实记录本次选中的节点,如
192.168.1.10:3000;重试时可能显示192.168.1.11:3000, 192.168.1.10:3000 - 支持轮询、ip_hash、least_conn 等策略,变量始终反映真实处理节点
同时记录客户端 IP 和后端 IP
生产中常需两者共存,可组合变量构建完整日志:
- 推荐格式:
log_format full_proxy '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$upstream_addr" "$upstream_http_x_real_ip"'; -
$http_x_forwarded_for获取原始客户端 IP(需前端已设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for) -
$upstream_http_x_real_ip可捕获后端响应头中返回的X-Real-IP,用于交叉验证后端是否识别正确

















