nginx需借助第三方模块(如nginx-upstream-check-module)实现负载均衡节点状态监控,通过健康检查配置、自定义日志格式、/status接口暴露及error_log状态事件捕获,结合prometheus、elk等工具完成可观测性建设。

在 Nginx 中记录负载均衡集群各节点的运行状态,核心是利用 ngx_http_upstream_module 提供的内置变量和健康检查机制,并配合日志格式自定义与第三方模块(如 nginx-upstream-check-module)来实现。Nginx 开源版本身不直接提供节点状态变更日志,但可通过组合手段达成可观测目标。
启用 upstream 健康检查并暴露状态接口
Nginx 官方开源版不带主动健康检查功能,需编译安装第三方模块 nginx-upstream-check-module(常与 Tengine 或 OpenResty 一起使用,也支持标准 Nginx)。启用后可在 upstream 块中添加检查配置:
- 在 upstream 块中加入
check interval=3 rise=2 fall=3 timeout=1 type=http,表示每 3 秒探测一次,连续 2 次成功标记为 up,连续 3 次失败标记为 down - 搭配
check_http_send和check_http_expect_alive自定义探测请求与成功判定条件(如期望返回 HTTP 200) - 通过
location /status暴露 JSON 或 HTML 格式的实时节点状态页(需启用check_status指令)
自定义 access_log 记录节点转发与异常行为
即使没有主动健康检查,也可通过日志间接反映节点状态波动:
- 在
http或server块中定义增强日志格式,包含上游信息:log_format upstreamlog '[$time_local] $remote_addr - $upstream_addr : $upstream_status : $upstream_response_time : $request'; - 其中
$upstream_addr显示实际转发的后端地址(含 IP:port),$upstream_status是后端返回的状态码,$upstream_response_time可识别慢节点或超时 - 当某节点频繁出现
502/503/504或响应时间突增(如 >5s),结合日志时间窗口可人工或脚本识别异常节点
捕获状态变更事件(需 Lua 或外部工具辅助)
若需自动记录“节点从 up 切为 down”这类事件,纯 Nginx 配置无法直接实现,但有实用路径:
- 使用 OpenResty + lua-resty-upstream-healthcheck 模块,在 Lua 层监听状态变化,调用
ngx.log写入 error_log,或通过ngx.timer.at触发外部告警脚本 - 定期轮询
/status接口(如用 curl + cron),比对前后两次 JSON 输出中的status字段,发现变化即写入独立状态日志文件 - 将 Nginx error_log 级别设为
notice或更高,部分健康检查模块会在节点状态切换时输出类似"upstream check: server 192.168.1.10:8000 is down"的日志行
整合日志与监控(推荐生产实践)
真实运维中,不依赖单一方式,而是分层采集:
- 基础层:access_log + custom format → 用于分析流量分布、错误率、延迟趋势
- 状态层:/status 接口 + Prometheus exporter(如
nginx-lua-prometheus或自研 exporter)→ 抓取节点 up/down、check count、fall/rise 计数器 - 事件层:error_log 关键字过滤(如
grep "is down\|is up" /var/log/nginx/error.log)→ 提取状态变更时间点,接入 ELK 或 Loki 做告警











