排查 nginx 加权轮询配置错误导致的流量倾斜,核心在于确认 `weight` 参数是否生效以及后端服务器状态是否异常。通常通过检查 nginx 配置文件中的 `upstream` 块,确保每个 server 指令后正确附加了 `weight` 数值,并验证 nginx 进程是否已重载该配置。若配置无误但流量仍不均,需进一步检查后端服务器的健康状态,因为 nginx 默认会将标记为 down 或 health check 失败的节点从轮询列表中剔除,导致剩余节点承担全部流量。

如何正确配置 upstream 的 weight 参数
在 Nginx 中实现加权轮询,必须在 `upstream` 模块下的每个 `server` 指令后显式添加 `weight` 参数。默认情况下,所有后端服务器的权重均为 1,即普通轮询。若要指定权重,例如让 server A 处理 70% 流量,server B 处理 30%,需在配置文件中明确设置 `weight=7` 和 `weight=3`。配置修改后,必须执行 `nginx -s reload` 使配置生效,否则新权重不会应用。

upstream backend {
server 192.168.1.10:8080 weight=7;
server 192.168.1.11:8080 weight=3;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
上述配置定义了名为 `backend` 的上游组。当请求进入时,Nginx 会根据权重比例分配请求。权重值越大,被选中的概率越高。如果未指定 `weight`,则默认为 1。确保权重总和与预期比例一致,且没有语法错误。配置生效后,可以通过观察后端服务器的访问日志来验证流量分布是否符合预期比例。
后端服务器状态异常如何影响加权轮询
即使 `weight` 配置正确,如果部分后端服务器因故障被 Nginx 标记为不可用,流量将重新分配给剩余的健康节点。Nginx 默认使用被动健康检查机制,当某台服务器连续失败次数达到阈值(默认为 1 次)时,会被暂时标记为不可用。此时,加权轮询算法仅在所有健康服务器间进行,导致健康节点的负载显著增加,形成流量倾斜。这种倾斜并非配置错误,而是高可用机制的正常表现。

# 假设以下配置
upstream backend {
server 192.168.1.10:8080 weight=7;
server 192.168.1.11:8080 weight=3;
# 若 192.168.1.11 故障,Nginx 会将其标记为 down
# 此时所有流量将流向 192.168.1.10
}
要排查此类问题,首先检查 Nginx 的错误日志,查找关于后端连接失败或超时的记录。其次,使用 `curl` 命令直接测试后端服务器的响应,确认其是否正常工作。如果后端服务器确实存在故障,修复故障后,Nginx 会自动恢复对该服务器的流量分配。若希望更精细地控制健康检查,可以引入第三方模块如 `ngx_http_upstream_healthcheck_module`,但需注意其兼容性和性能影响。
基于 weight=5 和 weight=1 配置的流量分布验证
为了具体验证加权轮询的效果,可以使用 `weight=5` 和 `weight=1` 的配置进行测试。在这种配置下,每 6 个请求中,应有 5 个被分发到权重为 5 的服务器,1 个被分发到权重为 1 的服务器。通过发送大量请求并统计各后端的接收数量,可以直观地看到流量分布是否符合预期。如果实际分布偏离此比例,需检查是否有其他因素干扰,如客户端 IP 哈希、会话保持或网络延迟等。
upstream backend {
server 192.168.1.10:8080 weight=5;
server 192.168.1.11:8080 weight=1;
}
在实际操作中,可以使用脚本模拟并发请求,并记录每个后端的响应情况。例如,使用 `ab` 或 `wrk` 工具发送数千个请求,然后分析后端日志。如果流量分布严重偏离预期,可能是由于 Nginx 版本差异、配置语法错误或后端服务器处理能力不一致所致。确保所有后端服务器的硬件资源和软件环境一致,有助于获得准确的加权轮询效果。


















