0%

Nginx配置负载均衡

Nginx 负载均衡配置详解:策略与实战

负载均衡是分布式系统应对高并发的核心手段,Nginx 通过upstream模块实现请求的分发,将流量均衡到多台后端服务器,提升系统吞吐量与可用性。本文详细讲解 Nginx 负载均衡的配置方法、核心策略及参数优化,帮助构建高可靠的服务集群。

负载均衡基础配置

Nginx 负载均衡的核心是通过upstream块定义后端服务器集群,再通过proxy_pass将请求转发到该集群。

基本架构

  • 前端:Nginx 作为负载均衡器(Director),接收客户端请求;
  • 后端:多台 Real Server(如127.0.0.1:8080127.0.0.1:8082),处理实际业务;
  • 配置逻辑upstream定义集群 → server块中通过proxy_pass关联集群。

基础配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 定义后端服务器集群(http块内)
upstream myserver {
# 后端服务器列表(IP:端口)
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

# 2. 配置负载均衡入口(server块内)
server {
listen 9000; # Nginx监听端口(客户端访问端口)
server_name localhost;

location / {
proxy_pass http://myserver; # 转发到upstream定义的集群
# 传递客户端信息(可选但推荐)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
  • 效果:客户端访问http://localhost:9000时,Nginx 会将请求分发到80808082端口的服务器。

后端服务器状态参数

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
2
3
4
upstream myserver {
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

适用场景:后端服务器性能相近,无明显差异(如集群中配置相同的服务器)。

2. 权重(weight)

原理:按权重比例分配请求,权重越高,接收的请求越多。
配置:通过weight参数指定。

1
2
3
4
upstream myserver {
server 127.0.0.1:8080 weight=1; # 权重1,接收1/3请求
server 127.0.0.1:8082 weight=2; # 权重2,接收2/3请求
}

适用场景:后端服务器性能不均(如高配服务器权重高,低配服务器权重低)。

3. 最少连接(least_conn)

原理:优先将请求分配给当前连接数最少的服务器,避免某台服务器过载。
配置:添加least_conn指令。

1
2
3
4
5
upstream myserver {
least_conn; # 启用最少连接策略
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

适用场景:请求处理时间差异大(如部分请求耗时较长,避免连接堆积)。

4. IP 哈希(ip_hash)

原理:根据客户端 IP 的哈希值分配请求,使同一 IP 始终访问同一服务器,解决会话(Session)共享问题。
配置:添加ip_hash指令。

1
2
3
4
5
upstream myserver {
ip_hash; # 启用IP哈希策略
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

注意

  • 若后端服务器故障,需手动标记为down,否则哈希计算会跳过故障节点,导致会话丢失;
  • 不适合动态增减服务器(会改变哈希映射关系)。
    适用场景:需要会话保持的服务(如登录状态、购物车等)。

5. URL 哈希(url_hash)

原理:根据请求 URL 的哈希值分配请求,同一 URL 始终定向到同一服务器,适合静态资源缓存。
配置:添加hash $request_uri指令。

1
2
3
4
5
6
upstream myserver {
hash $request_uri; # 按URL哈希
hash_method crc32; # 指定哈希算法(可选)
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

适用场景:静态资源服务器(如图片、CSS、JS),利用服务器本地缓存提升效率。

6. 响应时间(fair,第三方)

原理:根据后端服务器的响应时间分配请求,响应越快的服务器优先接收请求。
配置:需安装ngx_http_upstream_fair_module模块,添加fair指令。

1
2
3
4
5
upstream myserver {
fair; # 启用响应时间策略
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}

适用场景:对响应速度敏感的服务(如 API 接口、实时数据查询)。

高级优化:故障转移与健康检查

Nginx 通过max_failsfail_timeout实现后端服务器的健康检查,自动剔除故障节点:

1
2
3
4
upstream myserver {
server 127.0.0.1:8080 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8082 max_fails=2 fail_timeout=30s;
}
  • 逻辑:30 秒内,若某服务器失败 2 次(如连接超时、5xx 错误),则标记为 “失效”,30 秒内不再分配请求;30 秒后重新检测,若恢复则重新加入集群。

实战建议

  1. 集群规模:后端服务器数量建议为2n(偶数),便于故障时负载均衡;
  2. 会话共享:若使用ip_hash仍无法满足需求,建议采用分布式会话(如 Redis 存储 Session);
  3. 监控:结合nginx-status模块监控各服务器的连接数、请求量,及时调整权重;
  4. 动静分离:静态资源(图片、JS)通过url_hash分配,动态请求(API)通过least_conn分配,优化资源利用。

欢迎关注我的其它发布渠道