Nginx 负载均衡配置详解:策略与实战
负载均衡是分布式系统应对高并发的核心手段,Nginx 通过upstream模块实现请求的分发,将流量均衡到多台后端服务器,提升系统吞吐量与可用性。本文详细讲解 Nginx 负载均衡的配置方法、核心策略及参数优化,帮助构建高可靠的服务集群。
负载均衡基础配置
Nginx 负载均衡的核心是通过upstream块定义后端服务器集群,再通过proxy_pass将请求转发到该集群。
基本架构
- 前端:Nginx 作为负载均衡器(Director),接收客户端请求;
- 后端:多台 Real Server(如
127.0.0.1:8080、127.0.0.1:8082),处理实际业务; - 配置逻辑:
upstream定义集群 →server块中通过proxy_pass关联集群。
基础配置示例
1 | # 1. 定义后端服务器集群(http块内) |
- 效果:客户端访问
http://localhost:9000时,Nginx 会将请求分发到8080和8082端口的服务器。
后端服务器状态参数
upstream中可通过参数控制服务器的可用性、权重等,常用参数如下:
| 参数 | 说明 | 示例 |
|---|---|---|
down |
标记服务器为不可用(不参与负载均衡) | server 127.0.0.1:8080 down; |
weight=数值 |
权重(默认 1),数值越高,分配的请求越多 | server 127.0.0.1:8080 weight=3; |
backup |
备份服务器(仅当主服务器全故障时启用) | server 127.0.0.1:8083 backup; |
max_fails=次数 |
允许请求失败的最大次数(默认 1) | server 127.0.0.1:8080 max_fails=2; |
fail_timeout=时间 |
失败max_fails次后,暂停分发的时间(默认 10s) |
server 127.0.0.1:8080 fail_timeout=30s; |
负载均衡策略(调度算法)
Nginx 提供多种调度算法,可根据业务场景选择,决定请求如何分配到后端服务器。
1. 轮询(默认)
原理:按时间顺序依次将请求分发到后端服务器,自动剔除故障节点。
配置:无需额外参数(默认策略)。
1 | upstream myserver { |
适用场景:后端服务器性能相近,无明显差异(如集群中配置相同的服务器)。
2. 权重(weight)
原理:按权重比例分配请求,权重越高,接收的请求越多。
配置:通过weight参数指定。
1 | upstream myserver { |
适用场景:后端服务器性能不均(如高配服务器权重高,低配服务器权重低)。
3. 最少连接(least_conn)
原理:优先将请求分配给当前连接数最少的服务器,避免某台服务器过载。
配置:添加least_conn指令。
1 | upstream myserver { |
适用场景:请求处理时间差异大(如部分请求耗时较长,避免连接堆积)。
4. IP 哈希(ip_hash)
原理:根据客户端 IP 的哈希值分配请求,使同一 IP 始终访问同一服务器,解决会话(Session)共享问题。
配置:添加ip_hash指令。
1 | upstream myserver { |
注意:
- 若后端服务器故障,需手动标记为
down,否则哈希计算会跳过故障节点,导致会话丢失; - 不适合动态增减服务器(会改变哈希映射关系)。
适用场景:需要会话保持的服务(如登录状态、购物车等)。
5. URL 哈希(url_hash)
原理:根据请求 URL 的哈希值分配请求,同一 URL 始终定向到同一服务器,适合静态资源缓存。
配置:添加hash $request_uri指令。
1 | upstream myserver { |
适用场景:静态资源服务器(如图片、CSS、JS),利用服务器本地缓存提升效率。
6. 响应时间(fair,第三方)
原理:根据后端服务器的响应时间分配请求,响应越快的服务器优先接收请求。
配置:需安装ngx_http_upstream_fair_module模块,添加fair指令。
1 | upstream myserver { |
适用场景:对响应速度敏感的服务(如 API 接口、实时数据查询)。
高级优化:故障转移与健康检查
Nginx 通过max_fails和fail_timeout实现后端服务器的健康检查,自动剔除故障节点:
1 | upstream myserver { |
- 逻辑:30 秒内,若某服务器失败 2 次(如连接超时、5xx 错误),则标记为 “失效”,30 秒内不再分配请求;30 秒后重新检测,若恢复则重新加入集群。
实战建议
- 集群规模:后端服务器数量建议为
2n(偶数),便于故障时负载均衡; - 会话共享:若使用
ip_hash仍无法满足需求,建议采用分布式会话(如 Redis 存储 Session); - 监控:结合
nginx-status模块监控各服务器的连接数、请求量,及时调整权重; - 动静分离:静态资源(图片、JS)通过
url_hash分配,动态请求(API)通过least_conn分配,优化资源利用。