Nginx 通过 least_conn 策略动态调度至连接数最少的后端节点,并结合 max_fails/fail_timeout 被动健康检查与 health_check 主动探测机制,及时剔除异常节点,实现对高频访问节点的识别与优化。

要让 Nginx 负载均衡器识别并优化高频访问节点,核心不是“识别节点本身”,而是通过策略选择、连接状态感知和健康反馈机制,动态避开过载节点、倾斜流量到更健康的实例。Nginx 本身不主动监控 CPU 或内存,但能基于连接数、响应延迟(需模块)、失败率等可观察指标做间接判断和调度优化。
用 least_conn 策略自动避开高连接节点
这是最直接有效的方式——Nginx 原生支持,无需额外模块。它不依赖外部监控,而是实时统计每个后端服务器当前活跃连接数,把新请求优先分发给连接最少的节点。
- 适合长连接、WebSocket、API 网关等连接生命周期长的场景,避免某台服务器因堆积大量未关闭连接而响应变慢
- 配置示例:
upstream backend { least_conn; server 10.0.1.10:8080; server 10.0.1.11:8080; server 10.0.1.12:8080; } - 注意:配合 keepalive 参数使用效果更佳(如
keepalive 32;),确保连接池复用合理,避免频繁建连干扰连接数统计
结合健康检查剔除异常节点
高频访问节点若已出现响应缓慢或超时,仅靠 least_conn 不够——它仍可能被分配请求,直到连接数真正溢出。必须叠加主动探测机制,及时下线问题节点。
- 使用 health_check 指令(需在 location 块中启用)或 upstream 内置参数(如
max_fails/fail_timeout)实现被动健康检查 - 推荐组合配置:
upstream backend { least_conn; server 10.0.1.10:8080 max_fails=3 fail_timeout=30s; server 10.0.1.11:8080 max_fails=3 fail_timeout=30s; server 10.0.1.12:8080 max_fails=3 fail_timeout=30s; } <p>server { location / { proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;</p><h1>启用主动健康检查(Nginx Plus 或开源版 1.19+ with http_upstream_module)</h1><pre class="brush:php;toolbar:false;"> health_check interval=5s fails=2 passes=2; }}
- 当某节点连续失败 2 次,30 秒内不再转发请求;恢复后自动重入队列
按响应时间调度(需 fair 模块或商业版)
如果业务对延迟极度敏感,且已有能力采集后端真实响应时间,可启用更精细的调度逻辑。
- 开源 Nginx 默认不带
fair模块,需手动编译加入;Nginx Plus 则原生支持least_time指令(基于 header 时间或响应时间) - 典型配置(Nginx Plus):
upstream backend { least_time header; # 或 least_time last_byte; server 10.0.1.10:8080; server 10.0.1.11:8080; } - 该方式能真实反映节点处理效率,比连接数更能提前发现“假活”节点(如线程阻塞但 TCP 连接仍通)
日志 + 外部工具辅助识别高频/异常节点
Nginx 自身不提供“热点节点画像”,但可通过 access 日志反向分析:
- 在
log_format中加入$upstream_addr和$upstream_response_time,记录每次请求打到哪台后端、耗时多少 - 用脚本或 ELK 分析日志:统计各节点每分钟请求数、P95 响应时间、5xx 比例,识别持续高负载或高延迟节点
- 将分析结果用于人工调优(如临时调低权重)或对接自动化运维系统(如自动扩容或重启)











