要在 nginx 负载均衡中准确记录集群访问指标,关键不是堆砌变量,而是分层采集、按需打点:既要看整体流量分布,也要能下钻到单个节点表现;既要记录转发结果,也要捕获状态变化。

要在 Nginx 负载均衡中准确记录集群访问指标,关键不是堆砌变量,而是分层采集、按需打点:既要看整体流量分布,也要能下钻到单个节点表现;既要记录转发结果,也要捕获状态变化。纯靠默认日志远远不够,必须主动配置。
记录每个请求的实际转发路径与耗时
这是最基础也最重要的指标。Nginx 提供一组 $upstream_* 变量,但只在启用 proxy_pass 的 location 中有效:
-
$upstream_addr:显示最终被选中的后端地址(如10.0.1.10:8080),失败时为- -
$upstream_response_time:Nginx 等待该后端响应的时间(秒,精度毫秒) -
$upstream_status:后端返回的 HTTP 状态码(如200、502),可识别后端异常 -
$upstream_connect_time和$upstream_header_time:分别反映建连和首字节时间,用于定位慢节点根源
把这些变量写入自定义日志格式,例如:
log_format upstream_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'upstream:$upstream_addr status:$upstream_status rt:$upstream_response_time';access_log /var/log/nginx/upstream.log upstream_log;
按节点分离日志,验证权重与负载是否真实生效
全局日志看不出哪个节点扛了更多压力。用 map 指令将后端地址映射为可读标识,再动态生成日志路径:
- 先定义 upstream 和 map 映射(地址必须完全一致,含端口)
- log_format 中包含
$backend_id和关键指标(响应时间、状态码) - access_log 路径里直接写
/var/log/nginx/backend/$backend_id-access.log
这样每台后端都有独立日志文件,用 wc -l 或简单脚本就能算出各节点请求数占比,对照 weight 配置验证策略是否落地。
暴露并采集节点健康状态变更
Nginx 开源版不自带主动健康检查,需借助 nginx-upstream-check-module:
- 在 upstream 块中加
check interval=3 rise=2 fall=3 timeout=1 type=http - 配
location /status暴露 JSON/HTML 状态页,支持定时轮询比对 - 把 error_log 级别调至
notice,模块会在节点 up/down 时输出明确日志行,如"server 10.0.1.10:8080 is down"
这些日志可接入 ELK 或 Prometheus,实现状态切换告警。
补全客户端真实 IP 与压测标识
否则指标失真:
- 在 proxy_pass 前加
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for,确保后端能记录真实访客 IP - 压测时用 wrk 或 hey 加
-H "X-Loadtest-ID: v2",并在 log_format 中加入$http_x_loadtest_id,方便从海量日志中快速筛选压测流量 - 要求后端在响应头返回
X-Backend-Process-Time,Nginx 可通过$upstream_http_x_backend_process_time记录,对比$upstream_response_time就能判断是网络延迟还是后端处理慢











