权重应配置在 upstream 模块中作用于后端真实服务节点,而非双机热备的 nginx 节点;两台 nginx 配置须完全一致,通过 weight 参数实现加权轮询,配合健康检查确保流量按比例分发。

在 Nginx 双机热备架构中,负载均衡权重配置和热备本身是两个层级的事:权重属于 后端应用服务器(real servers)的流量分发策略,而双机热备(如 keepalived + Nginx)解决的是 Nginx 自身的高可用问题。两者需协同但不能混淆——权重不配在热备节点之间,而是配在 upstream 块里指向真实业务服务器。
明确角色分工:谁该配权重?
双机热备中的两台 Nginx 服务器(比如 nginx-master 和 nginx-backup)功能完全一致,它们共享一个虚拟 IP(VIP),只有一台对外提供服务。它们本身不互为“负载”,而是互为备份。真正需要按性能差异分配请求比例的,是它们共同代理的后端集群(例如多台 Tomcat、PHP-FPM 或 Node.js 实例)。
- ✅ 权重应配置在
upstream模块中,作用于后端真实服务节点(如server 192.168.5.10 weight=3) - ❌ 不应在 keepalived 配置中给两台 Nginx 节点设权重(它们不是负载池成员,而是入口网关)
- ❌ 不应在 Nginx 的 server 块或 location 中对自身做“权重转发”(无意义且不可行)
正确配置加权轮询(Weighted Round Robin)
假设你有 3 台后端应用服务器,性能不均(一台新机器 CPU 更强,另两台较旧),可在 Nginx 主配置中这样定义 upstream:
upstream app_backend {
server 192.168.5.10:8080 weight=5; # 高性能节点,承担约 50% 流量
server 192.168.5.11:8080 weight=3; # 中等性能,约 30%
server 192.168.5.12:8080 weight=2; # 较弱节点,约 20%
# 可选:加入健康检查参数
max_fails=3 fail_timeout=30s;
}
- 权重总和无需归一化(如 5+3+2=10,即按 5:3:2 比例分发)
- 建议搭配
max_fails和fail_timeout,让 Nginx 自动屏蔽故障节点 - 所有双机热备节点上的 Nginx 配置必须完全一致(包括此 upstream),确保切换时行为无缝
确保双机热备不影响权重逻辑
keepalived 管理 VIP 漂移,但不干预 Nginx 内部调度。要保障权重生效,注意以下实操细节:
- 两台 Nginx 服务器使用相同的
nginx.conf和upstream定义,避免配置偏差导致流量倾斜 - 若使用外部配置中心或自动化部署(如 Ansible),确保 upstream 配置原子更新、同步生效
- 测试时,用
curl -I http://VIP/多次请求,配合后端日志或响应标识(如返回 IP),验证实际分发比例是否符合权重预期 - 禁用
ip_hash或least_conn等与权重冲突的算法;加权轮询是唯一支持 weight 参数的默认基础算法
常见误区提醒
有人试图在 keepalived 的 vrrp_instance 中设置 priority 来“模拟权重”,这是错误的:
-
priority 100和priority 90只决定谁当 master,不改变流量分配比例 - 即使 backup 节点临时接管,它仍会严格按 upstream 中定义的权重转发请求
- 若希望某台后端承担更少流量,只能调低其 weight 值,或临时注释掉该 server 行











