负载均衡是应对高并发、提升服务可用性和资源利用率的核心技术,通过将用户请求分发到多个后端服务器,实现负载分散与故障隔离,本文以Nginx为例,详细说明负载均衡配置实例,涵盖环境准备、核心配置、参数优化及故障处理等关键环节。

环境准备与架构设计
假设场景:某Web应用需支持日均10万访问量,后端部署3台应用服务器(Tomcat),通过Nginx实现负载均衡,具体环境如下:
- 负载均衡器:Nginx(192.168.1.100,CentOS 7)
- 后端服务器:
- Server1:192.168.1.101(2核4G,Tomcat 9)
- Server2:192.168.1.102(4核8G,Tomcat 9)
- Server3:192.168.1.103(2核4G,Tomcat 9)
所有后端服务器已部署相同应用,并通过健康检查(如HTTP状态码200)确认服务正常。
Nginx负载均衡核心配置
Nginx通过upstream模块定义后端服务器组,结合proxy_pass实现请求转发,以下是nginx.conf关键配置片段:
定义后端服务器组(upstream)
在http块中添加upstream配置,定义服务器组及负载均衡策略:
http {
# 定义后端服务器组,命名为backend_servers
upstream backend_servers {
# 加权轮询策略(默认),根据权重分配请求
server 192.168.1.101 weight=1; # 低性能服务器,权重1
server 192.168.1.102 weight=3; # 高性能服务器,权重3(处理更多请求)
server 192.168.1.103 weight=1; # 低性能服务器,权重1
# 健康检查参数:连续2次请求失败(超时或错误),则标记为不可用,30秒后重试
max_fails=2;
fail_timeout=30s;
# 备用服务器:当前所有服务器不可用时,启用此服务器
# server 192.168.1.104 backup;
}
# 虚拟主机配置
server {
listen 80;
server_name example.com;
location / {
# 将请求代理到backend_servers服务器组
proxy_pass http://backend_servers;
# 设置代理头信息,后端服务器可获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 代理超时设置(连接超时、发送超时、读取超时)
proxy_connect_timeout 3s;
proxy_send_timeout 5s;
proxy_read_timeout 8s;
}
}
} 负载均衡策略说明
Nginx支持多种负载均衡策略,需根据业务场景选择:
| 策略类型 | 配置方式 | 适用场景 | 特点 |
|—————-|————————|———————————–|————————————–|
| 轮询(默认) | 无特殊配置 | 所有服务器性能均等 | 依次分配请求,简单易用 |
| 加权轮询 | weight=N | 服务器性能差异大 | 按权重比例分配请求,性能高的服务器处理更多请求 |
| IP哈希 | ip_hash | 需要会话保持的场景(如购物车) | 同一客户端IP请求固定分配到同一服务器,避免会话丢失 |
| 最少连接 | least_conn | 长连接场景(如WebSocket) | 将请求分配给当前连接数最少的服务器,负载更均衡 |
| URL哈希 | hash $request_uri | 需基于URL路由的场景(如缓存服务) | 根据URL哈希值分配请求,相同URL固定到同一服务器 |

配置参数详解
weight:服务器权重,值越大分配的请求越多,适用于服务器性能差异场景。max_fails:允许请求失败的次数,超过则标记服务器为down,默认为1。fail_timeout:服务器被标记为down后的等待时间,超时后重新加入服务器组。backup:标记服务器为备用机,仅当所有非备用服务器不可用时启用。- 代理超时参数:避免后端服务器响应慢导致Nginx请求堆积,需根据业务超时时间合理设置。
测试与验证
启动Nginx并检查配置
# 检查Nginx配置语法 nginx -t # 重启Nginx加载新配置 nginx -s reload
验证负载均衡效果
在客户端循环访问http://example.com,观察后端服务器访问日志(如Tomcat的catalina.out),确认请求是否按权重分配到各服务器:
- Server1(192.168.1.101)日志中请求占比约25%(权重1/总权重5)
- Server2(192.168.1.102)日志中请求占比约50%(权重3/总权重5)
- Server3(192.168.1.103)日志中请求占比约25%(权重1/总权重5)
模拟故障转移
停止Server2(systemctl stop tomcat),再次访问请求,观察是否自动转发到Server1或Server3;30秒后恢复Server2,确认其重新加入服务器组。
常见问题处理
- 会话丢失问题:若应用依赖Session,需使用
ip_hash或第三方模块(如nginx-sticky-module)实现会话保持。 - 服务器过载:通过监控(如
top命令)发现服务器负载过高时,可动态调整weight值或增加后端服务器。 - 代理超时:若后端处理耗时较长,适当增大
proxy_read_timeout,避免请求被Nginx提前中断。
相关问答FAQs
问题1:如何配置负载均衡算法为“最少连接”?
解答:在upstream块中添加least_conn指令即可启用最少连接策略。
upstream backend_servers {
least_conn; # 最少连接策略
server 192.168.1.101;
server 192.168.1.102;
} 该策略会实时计算各服务器的当前连接数,将新请求分配给连接数最少的服务器,适合长连接或连接数不均的场景。

问题2:后端服务器宕机后,负载均衡器如何自动剔除故障节点?
解答:通过max_fails和fail_timeout参数实现自动故障转移,例如配置max_fails=2和fail_timeout=30s,若某服务器30秒内连续2次请求失败(如超时或返回5xx错误),Nginx会临时将其标记为down,不再转发请求;30秒后,Nginx会尝试重新连接该服务器,若恢复则重新加入服务器组,可通过nginx -s reload动态更新配置,无需重启Nginx。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复