加权轮询适用于无状态服务,不保证会话连续性;若业务依赖服务端session,应改用ip_hash或外置session至redis。

加权轮询本身不保证会话连续性,节点切换时出现会话中断是设计使然,不是配置错误。排查重点不是“修复轮询”,而是确认是否误用了轮询、是否遗漏了会话保持机制、或后端服务自身状态不稳定。
确认是否真需要加权轮询
加权轮询适用于无状态服务(如REST API)。如果业务依赖服务端 Session(如登录态存于内存)、本地缓存或临时文件,轮询必然导致中断。此时应:
- 改用 ip_hash:同一客户端IP始终打到同一节点(注意NAT环境失效)
- 改用 hash $cookie_JSESSIONID 或类似方式,基于会话标识做一致性哈希
- 将 Session 外置到 Redis 或数据库,后端节点无状态,再回归轮询
检查加权配置是否被实际生效
常见误操作会让权重形同虚设:
- 未在
upstream中显式写weight=,例如server 192.168.1.10:8080 weight=3;,只写server ...;就是默认 weight=1 - 启用了
ip_hash或hash指令,它们会覆盖轮询逻辑,权重无效 - 配置了健康检查(如
max_fails=3),某节点因失败被临时摘除,剩余节点按比例重分配,看起来像“权重突变”
验证请求分发是否符合预期权重
不要凭感觉判断,用日志或工具实测:
- 在每个后端节点的访问日志中加入
$upstream_addr或自定义 header(如X-Node-ID),统计各节点请求数占比 - 用
ab或hey发起数百次请求,观察分布:比如两节点weight=2和weight=1,理论比应为 66% : 33% - 注意:每个 worker 进程独立维护轮询计数器,短时间小样本可能不均,看长期趋势
排除后端主动断连干扰
很多“会话中断”其实是后端响应后立即关闭连接,和 Nginx 轮询无关:
- 检查后端是否设置了短
keep-alive timeout,导致连接复用失败 - Nginx 配置中是否漏了
proxy_http_version 1.1;和proxy_set_header Connection '';,影响长连接复用 - 后端应用是否有异常日志(如 OOM、线程池满、数据库连接超时),导致处理完请求就崩溃,看起来像“刚切过去就断”











