Nginx负载均衡
一、概述
1.1 基本定义
负载均衡通过引入调度机制,将单个服务器的负载分散到多台服务器节点,确保每台后端服务器的性能充分发挥,避免单点过载,最终实现集群整体性能最优。对于Web应用而言,它能有效解决高并发场景下的服务瓶颈,同时提升系统的容灾能力。
1.2 负载均衡核心优势
- 高并发支持:可轻松处理数万并发连接,性能损耗极低。
- 资源消耗少:内存占用小,运行效率高,部署成本低廉。
- 配置灵活:通过简单的配置文件即可实现多种负载策略,支持
Rewrite重写规则。 - 内置健康检查:自动识别故障服务器并临时剔除,故障恢复后自动重新纳入集群。
- 稳定性强:运行可靠,能有效保障服务持续可用,减少
downtime。
二、核心机制与策略
Nginx的负载均衡策略分为内置策略和扩展策略两类,内置策略无需额外安装,扩展策略需依赖第三方模块。
2.1 内置核心策略
- 轮询(默认):按请求顺序均匀分配到每台后端服务器,配置最简单,适用于各服务器性能一致的场景。
- 加权轮询(weight):为后端服务器分配权重值,权重越高被分配到请求的概率越大,适用于服务器性能差异较大的场景。
- 最少连接(least_conn):将请求分配给当前连接数最少的服务器,适用于请求处理时间差异较大的场景,可避免部分服务器过载。
- IP哈希(ip_hash):基于客户端IP地址计算哈希值,绑定处理请求的服务器。同一客户端的所有请求始终定向到同一台服务器,适用于需要会话保持的场景(如用户登录状态维持)。
2.2 扩展策略
- fair:基于后端服务器的响应时间分配请求,响应时间越短优先级越高,适用于后端服务器性能不均的场景。
- url_hash:基于访问
URL的哈希结果分配请求,同一URL始终定向到同一台服务器,适用于后端为缓存服务器的场景(如静态资源缓存)。
2.3 健康检查关键参数
Nginx通过以下参数实现后端服务器健康检测,确保请求仅分发到正常节点:
- max_fails:允许请求失败的最大次数,默认值为
1。 - fail_timeout:失败次数达到
max_fails后,服务器被标记为故障的时长,超时后会重新探测服务器状态。 - max_conns:限制单个后端服务器的最大并发连接数,避免过载。
- backup:标记为备份服务器,仅当所有主服务器故障时才生效。
- down:标记服务器临时下线,不参与负载均衡。
2.4 常用内置变量
Nginx提供负载均衡相关内置变量,用于日志记录和状态监控:
- $upstream_addr:记录处理请求的后端服务器
IP和端口。 - $upstream_response_time:记录后端服务器的响应时间(毫秒)。
- $upstream_status:记录后端服务器的响应状态码。(upstream_http_xxx:记录后端服务器的响应头字段(如)upstream_http_server)。
三、实战配置
以下实战配置基于CentOS系统,预设4台服务器节点,其中1台作为Nginx负载均衡器,3台作为后端应用服务器(RS)。
3.1 环境预设
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| nginx01 | 172.24.10.21 | Nginx负载均衡器 |
| nginx02 | 172.24.10.22 | 后端应用服务器(RS01) |
| nginx03 | 172.24.10.23 | 后端应用服务器(RS02) |
| nginx04 | 172.24.10.24 | 后端应用服务器(RS03) |
所有节点需安装Nginx,后端服务器需配置测试页面(如显示各自IP地址),确保独立访问正常。
3.2 轮询
适用于各后端服务器性能一致的场景,配置如下:
# 编辑Nginx配置文件
vi /etc/nginx/conf.d/balance.conf
# 配置 upstream 模块
upstream mybalance01 {
server 172.24.10.22:9090;
server 172.24.10.23:9090;
server 172.24.10.24:9090;
}
# 配置虚拟主机
server {
listen 80;
server_name balance.linuxds.com;
access_log /var/log/nginx/mybalance.access.log main;
error_log /var/log/nginx/mybalance.error.log warn;
location / {
proxy_pass http://mybalance01;
index index.html;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 检查配置并重载
nginx -t -c /etc/nginx/nginx.conf
nginx -s reload
测试:浏览器访问http://balance.linuxds.com,刷新多次可看到请求按顺序分配到3台后端服务器。
3.3 加权轮询
适用于后端服务器性能差异较大的场景,配置如下:
upstream mybalance01 {
server 172.24.10.22:9090 weight=1 max_fails=1 fail_timeout=2;
server 172.24.10.23:9090 weight=8 max_fails=2 fail_timeout=2;
server 172.24.10.24:9090 backup; # 备份服务器
}
# 其余配置同默认轮询,检查并重载Nginx
测试:访问后可发现权重为8的服务器被分配到请求的概率显著更高,备份服务器仅在主服务器故障时生效。
3.4 最少连接
适用于请求处理时间差异较大的场景,配置如下:
upstream mybalance01 {
least_conn; # 启用最少连接策略
server 172.24.10.22:9090;
server 172.24.10.23:9090;
server 172.24.10.24:9090;
}
# 其余配置同默认轮询,检查并重载Nginx
测试:Nginx会自动将新请求分配给当前连接数最少的服务器,避免部分节点过载。
3.5 IP哈希
适用于需要会话保持的场景(如用户登录),配置如下:
upstream mybalance01 {
ip_hash; # 启用IP哈希策略
server 172.24.10.22:9090;
server 172.24.10.23:9090;
server 172.24.10.24:9090;
}
# 其余配置同默认轮询,检查并重载Nginx
测试:同一客户端多次访问会始终定向到同一台服务器,确保会话状态不丢失。
3.6 fair
需安装第三方模块,配置如下:
upstream mybalance01 {
fair; # 启用fair策略
server 172.24.10.22:9090;
server 172.24.10.23:9090;
server 172.24.10.24:9090;
}
# 其余配置同默认轮询,检查并重载Nginx
测试:响应速度更快的服务器会被优先分配请求,优化用户体验。
3.7 url_hash
适用于后端为缓存服务器的场景,配置如下:
upstream mybalance01 {
hash $request_uri; # 基于URL哈希
hash_method crc32; # 哈希算法
server 172.24.10.22:9090;
server 172.24.10.23:9090;
server 172.24.10.24:9090;
}
# 其余配置同默认轮询,检查并重载Nginx
测试:同一URL的请求始终定向到同一台服务器,提升缓存命中率。
四、注意事项与优化建议
- 会话保持:默认轮询和加权轮询会导致会话丢失,需通过
ip_hash或后端共享存储(如Redis)解决。 - 健康检查:合理配置
max_fails和fail_timeout参数,避免误判正常服务器为故障节点。 - 性能优化:根据后端服务器性能调整权重、连接数限制等参数,避免资源浪费。
- 扩展性:负载均衡器可部署多台(如结合
Keepalived实现高可用),避免负载均衡器成为单点瓶颈。 - 监控:利用
Nginx内置变量和日志,结合监控工具(如Prometheus)实时监控后端服务器状态和响应情况。
Nginx负载均衡凭借灵活的配置和优异的性能,能满足不同场景下的分布式部署需求。选择合适的负载策略并结合实际业务优化配置,可大幅提升系统的稳定性和用户体验。

浙公网安备 33010602011771号