对于 Nginx 来说,请求到达 Nginx,Nginx 作为反向代理服务器,有绝对的决策权,可以按照规则将请求分配给它知道的节点中的一个,通过这种分配,使得所有节点需要处理的请求量处于相对平均的状态,从而实现负载均衡。
Nginx 支持的负载均衡策略很多,比较重点的如下:
-
round robin(轮询)
-
random(随机)
-
weight(权重)
-
fair(按响应时长,三方插件)
-
url_hash(url 的 hash 值)
-
ip_hash(ip 的 hash 值)
-
least_conn(最少连接数)
最佳实现
最佳实践,其实就是最常见、最普通的默认配置,当然也是在一定程度上最好用的配置。不知道用什么方式的时候,就可以选择用这一类型。轮询不用多说。这里的随机,其实在大量请求的情况下,按照概率的理论等同于轮询的方式
最基本的配置方法,它是upstream模块默认的负载均衡,每个请求按时间顺序分配到不同的后端服务器上面
- fail_timeout:与max_fails结合使用
- max_fails:设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
- fail_time:服务器被认为停机的时间长度,默认为10s
- backup:标记该服务器为备用服务器,当主服务停止时,请求会被发送到这台服务器
- down:标记服务器不参与负载均衡
在轮询策略的基础上指定轮询的几率,weight的默认值为1,weight的数值与访问比率成正比
- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况
轮询配置参考
1 2 3 4 5 6 7 8 9 10 11 12 13 | #默认配置就是轮询策略 upstream server_group { server test1.example.com; server test2.example.com; } server { listen 80; server_name localhost; # 浏览器访问域名 location / { proxy_pass http: //server_group/ ; } } |
随机配置参考
1 2 3 4 5 6 7 | upstream server_group { random; server test1.example.com; server test2.example.com; server test3.example.com; server test4.example.com; } |
性能优先
让业务节点中性能更强的机器得到更多请求,这也是一个比较好的分配策略。
什么是性能更好的机器?这个问题也有很多的维度去考量。
- 从经验或硬件上分为高权重、低权重的机器。
- 按照节点请求的响应时长来决定是多分配请求,还是少分配请求。
- 按照保持的连接数。一般来说保持的连接数越多说明处理的任务越多,也是最繁忙的,可以将请求分配给其他机器处理。
权重的配置参考
1 2 3 4 5 | upstream server_group { server 192.168.226.147:8080 weight=5; #默认为不配置权重为1 server 192.168.226.148:8080; } |
响应的时长(fair)配置参考:需要在 Nginx 编译时加入 nginx-upstream-fair 模块
1 2 3 4 5 6 7 | upstream server_group{ fair; server test1.example.com; server test2.example.com; server test3.example.com; server test4.example.com; } |
最少连接数(least_conn)配置参考
1 2 3 4 5 | upstream server_group { least_conn; server test1.example.com; server test2.example.com; } |
保持稳定
ip_hash:是将每个请求按照访问ip的hash结果进行分配,这种方式可以保证同一个用户会固定访问一个后端服务器。优点:可以保证session会话,解决服务器之间session不能共享的问题;
url_hash:是根据url的hash结果进行分配请求,每一个url会固定到同一个服务器上,配合缓存使用,可以减少不必要的下载和资源时间的浪费。每次同一个url请求到达同一个服务器上,第一次加载后放入缓存,后面再次请求,
least_conn:直接取缓存资源。如果不采用url_hash,可能会导致请求到达不同的服务器,资源出现重新加载的情况。第三方的负载均衡策略需要安装第三方的插件。
将请求转发给连接数较少的后端服务器。每个后端服务器配置可能不同,处理的请求也有可能不同,对于处理的请求有快有慢,least_conn是根据后端服务器的连接情况,动态的选择连接数量较少的一台服务器来处理当前的请求
ip_hash 配置参考
1 2 3 4 5 | upstream server_group { ip_hash; server 192.168.226.147:8080; server 192.168.226.148:8080; } |
url_hash 配置参考(第三方)
1 2 3 4 5 6 | upstream server_group{ hash $request_uri consistent; server test1.example.com; server test2.example.com; server test3.example.com; } |
least_conn
1 2 3 4 5 6 | upstream server_group { least_conn; server 192.168.0.100:8080; server 192.168.0.101:8080; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?