Nginx负载均衡配置异常:流量未按1:10权重分配求助
首先得点明你遇到的核心问题:你使用的least_conn负载均衡算法,并不是单纯按照权重比例来分配流量的——它的逻辑是优先将请求分配给活跃连接数与权重比值最小的服务器,这和你预期的“10:1固定比例”是两回事。
为什么几乎所有流量都流向主服务器?
如果你的主服务器(192.168.x.xx)处理请求的速度足够快,请求完成后连接会迅速释放,那么它的活跃连接数会一直远低于从服务器。哪怕权重是10,计算活跃连接数/权重后的值仍然比从服务器小,Nginx就会持续把请求分配给主服务器,完全体现不出权重的比例。
一步步排查与解决
1. 先验证权重配置本身是否正常
先把负载均衡算法换成默认的round_robin(这是严格按照权重比例分配请求的算法),测试流量是否符合10:1的预期:
upstream backend { # 移除least_conn,使用默认的round_robin算法 server 192.168.x.xx weight=10 max_fails=3 fail_timeout=5s; server 192.168.x.xy weight=1 max_fails=3 fail_timeout=10s; }
重启Nginx后观察两台服务器的access log,如果流量比例接近10:1,说明你的权重配置本身没问题,问题出在least_conn算法的特性上。
2. 若必须使用least_conn,调整策略或排查从服务器状态
如果你业务确实需要基于连接数的负载均衡,那得理解它的计算逻辑:
- 检查从服务器的响应速度:如果从服务器处理请求慢,导致连接长时间处于活跃状态,那
活跃连接数/权重的值会很高,Nginx自然不会优先分配请求过去。可以对比两台服务器的响应时间,优化从服务器的性能。 - 调整权重比例:如果主服务器性能远高于从服务器,可以适当降低主服务器的权重,或者提高从服务器的权重,让
活跃连接数/权重的比值更均衡。
3. 排查从服务器是否被标记为不可用
看你的配置里,从服务器的fail_timeout是10s,主服务器是5s。如果从服务器之前出现过连续3次请求失败(max_fails=3),Nginx会在10s内将它标记为不可用,这期间所有流量都会流向主服务器。
- 查看Nginx的error log,搜索从服务器的IP,看有没有
connect() failed或upstream timed out之类的错误。 - 在Nginx所在机器上,手动curl从服务器的80/443端口,确认从服务器是否正常可达,防火墙是否开放对应端口。
4. 启用Nginx状态模块辅助排查
如果还没启用,可以配置stub_status模块,直观查看upstream中每台服务器的连接数、请求数等状态:
server { listen 80; server_name status.somesite.somesub.org; location /nginx_status { stub_status on; allow 127.0.0.1; allow 192.168.x.xx; # 允许你的管理IP访问 deny all; } }
访问http://status.somesite.somesub.org/nginx_status,可以看到类似以下的信息,能帮你判断从服务器是否在正常接收请求:
Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106
额外注意点
你的443端口的server配置没写完,记得补充完整SSL证书相关配置(ssl_certificate、ssl_certificate_key),否则HTTPS请求可能无法正常转发到后端。
内容的提问来源于stack exchange,提问作者Lynx Tech

