Nginx实现轮询负载均衡与实时监控需配置upstream轮询+第三方健康检查模块(如nginx-upstream-check-module)+状态页暴露;默认轮询可配max_fails、fail_timeout等参数增强容错,check模块支持主动探测/health接口并提供HTML/JSON状态页,配合日志分析与告警提升可观测性。

在 Nginx 中实现轮询负载均衡并实时监控后端状态,核心是启用 upstream 模块的轮询机制 + ngx_http_upstream_module 内置的健康检查(需配合商业版或第三方模块)或使用开源替代方案(如 nginx-upstream-check-module)+ 可视化状态页(如 stub_status 扩展或自定义状态接口)。
配置基础轮询 upstream
先定义一组后端服务器,Nginx 默认即为加权轮询(weight=1 时等价于普通轮询):
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
该配置会按顺序轮流分发请求。如需更均匀或带容错能力,可添加以下参数:
- max_fails=2 fail_timeout=30s:连续失败 2 次后,30 秒内不将请求转发至此节点
- slow_start=60s(Nginx 1.11.5+):恢复上线后逐步增加流量,避免冷启动冲击
- 不建议仅靠
backup或down做动态下线,它们是静态标记,无法自动恢复
启用主动健康检查(推荐开源 check 模块)
官方开源版 Nginx 不支持主动健康检查(如定时 GET /health),需编译安装第三方模块 nginx-upstream-check-module:
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
<pre class='brush:php;toolbar:false;'>check interval=3 rise=2 fall=5 timeout=1 default_down=false;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;}
说明:
- 每 3 秒发一次 HEAD 请求到
/health - 连续 2 次成功标记为“活”,连续 5 次失败标记为“宕”
-
default_down=false表示初始状态为可用(避免启动时全红) - 确保后端服务提供轻量
/health接口,返回 2xx/3xx 即可
暴露实时状态页供观测
安装 check 模块后,可通过 location 暴露 HTML 状态页:
location /status {
check_status;
# 可选:限制访问权限
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
}
访问 http://your-nginx-ip/status 即可看到表格形式的实时状态,含 IP、端口、状态(up/down)、失败次数、检测间隔等。支持 JSON 格式(加参数 ?format=json)便于脚本采集。
若未使用 check 模块,也可用 stub_status 查看 Nginx 自身连接状态(非后端健康),但无法反映 upstream 节点真实可用性:
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
配合日志与告警提升可观测性
仅靠页面刷新不够自动化,建议补充:
- 在
upstream块中添加log_format记录 upstream_addr 和 upstream_status,便于识别转发目标与结果 - 用 logrotate 定期归档 access/error 日志,结合 ELK 或 Grafana Loki 做失败率趋势分析
- 写简单脚本定期请求
/status?format=json,解析 down 节点并触发企业微信/钉钉告警 - 避免把监控路径暴露在公网,务必加 IP 白名单或 Basic Auth(用
auth_basic)


















