可通过nginx的stub_status模块配合nginx-module-vts或prometheus+nginx-exporter搭建轻量可视化后端状态看板;vts方案零依赖、部署最简,支持实时展示upstream分组、节点请求量、响应时间、健康状态等;prometheus方案适合已建生态环境,可统一纳管指标并对接grafana图表;还可结合健康检查、自定义响应头或lua共享字典实现更细粒度可观测性。

可以通过 Nginx 的 stub_status 模块配合第三方模块(如 nginx-module-vts)或开源监控方案(如 Prometheus + nginx-exporter),快速搭建轻量、可视化的后端服务器状态看板。原生 Nginx 不提供带后端节点明细的实时健康状态面板,需借助扩展能力。
使用 nginx-module-vts 构建可视化状态看板
这是目前最常用、零依赖、部署最简的方案,支持实时展示 upstream 分组、各 server 的请求计数、响应时间、健康状态、失败次数等。
- 编译时添加
--add-module=/path/to/nginx-module-vts,或使用已集成该模块的预编译包(如 OpenResty) - 在 http 块中配置 vts 模块:
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on; - 为需要监控的 upstream 添加
vhost_traffic_status off;(默认开启),确保其被采集 - 新增一个 location 暴露 JSON 接口或 HTML 页面:
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
访问 /status 即可看到带分组、节点、指标表格的 Web 看板;访问 /status/format/json 获取结构化数据,便于前端二次渲染或对接 Grafana。
用 Prometheus + nginx-exporter 实现指标采集与图表化
适合已运行 Prometheus 生态的环境,将 Nginx 负载均衡指标纳入统一监控体系。
- 启用 Nginx 的 stub_status(需编译含
--with-http_stub_status_module): location /basic_status {
stub_status;
} - 部署 nginx-prometheus-exporter,它会定期抓取
/basic_status并转换为 Prometheus 格式指标(如nginx_upstream_requests_total{upstream="backend"}) - 在 Prometheus 中配置 scrape job,指向 exporter 地址
- Grafana 中导入社区模板(如 ID 10529 或 11724),即可看到 upstream 各节点的活跃连接、请求速率、5xx 比例、健康状态(需配合自定义探针逻辑)等图表
结合健康检查与自定义状态标记
Nginx 原生 health_check 只做被动探测(如 max_fails / fail_timeout),不直接暴露“当前是否健康”的布尔值到状态页。可通过以下方式增强可观测性:
- 在 upstream 中启用
health_check,并搭配match块验证 HTTP 状态码或响应体,让 Nginx 主动踢出异常节点 - 利用 vts 模块中的
upstream.fails和upstream.down字段判断节点是否处于 down 状态(值为 1 表示已被标记为不可用) - 若需更精细控制(如灰度标记、维护中),可在后端服务返回的响应头中加入自定义字段(如
X-Server-State: maintenance),再通过 Nginx 的log_format记录,并由日志分析系统(如 Loki + Grafana)聚合展示
轻量替代:用 Lua + ngx.shared.DICT 做简易心跳看板
适用于无法重编译 Nginx、又需快速上线状态页的场景(OpenResty 环境下)。
- 用定时器(
ngx.timer.at)定期向后端发送 HEAD 请求,将结果(成功/失败/耗时)写入共享内存字典 - 新建 location(如
/healthz),读取共享字典并以 JSON 格式输出各节点最新状态 - 前端用简单 HTML + JS 定时轮询该接口,渲染颜色标识(绿/黄/红)和响应时间
- 优势是无需外部组件,全部在 Nginx 进程内完成;缺点是不持久、无历史趋势,仅作实时概览











