轮询是nginx默认且最轻量的负载分发方式,但需结合服务器cpu核数、内存/i/o能力设定合理权重(如16核设weight=2、8核设weight=1),避免弱机过载;必须配置max_fails=3 fail_timeout=30s和proxy_next_upstream error timeout等健康检查与重试机制,并启用keepalive连接复用以降低延迟。

轮询是 Nginx 默认且最轻量的负载分发方式,但它不是“配完就完事”的静态策略——真正让集群稳、快、可扩的关键,在于结合业务实际做针对性优化。
按服务器能力设权重,避免弱机过载
纯轮询假设所有后端性能一致,现实中往往不成立。比如一台 16 核服务器和一台 8 核混用,若都用默认 weight=1,强机只承担一半流量,弱机反而容易打满。
- 按 CPU 核数比例设 weight:16 核设 weight=2,8 核设 weight=1
- 内存或 I/O 差异大时,可综合评估后微调,例如 SSD 机器比 HDD 机器 weight 提高 1.5 倍
- 避免权重设得过于极端(如 10:1),否则小权重节点长期空闲,资源利用率失衡
加基础容错,不让单点故障拖垮整组
轮询本身不感知后端是否健康,必须靠配套机制兜底:
- 每台 server 后加上 max_fails=3 fail_timeout=30s:连续失败 3 次后,30 秒内跳过该节点
- 在 upstream 块里加 proxy_next_upstream error timeout http_500 http_502:遇到这些响应时自动重试下一节点
- 启用主动健康检查(需 stream 或 commercial 版)或配合外部探活脚本,比被动失败更早发现异常
减少连接开销,提升吞吐效率
高频短连接场景下,反复建连会显著增加后端压力和延迟:
- 在 upstream 块中加 keepalive 32(保持 32 个空闲连接),复用 TCP 连接
- 对应在 location 中加 proxy_http_version 1.1 和 proxy_set_header Connection '',确保 HTTP/1.1 keep-alive 生效
- 后端应用也要支持连接池,否则 Nginx 端复用无效
验证是否真生效,别信配置不信日志
配置写完不等于跑对,得用数据确认:
- 用 curl -s http://nginx-ip/health 多次请求,观察返回的后端标识是否循环出现(如 server-a → server-b → server-c)
- 开启 Nginx access_log 的 $upstream_addr 变量,直接看每条请求落到哪台后端
- 压测时关注各后端的 request_time 和错误率,若某台 consistently 高延时或报错,说明健康检查没起作用或权重不合理











