利用Nginx 做负载均衡,提升服务器的的可靠性、容灾性。教程+示例,一学就会。
负载均衡介绍
简单来说就是提升吞吐量、避免服务器过载。分为硬(如 F5),软(如 apache、nginx 的反向代理,还有其他模式)
Nginx 负载均衡网络图
Nginx 负载均衡策略
nginx 负载均衡使用 upstream
配置. 包括内置策略,还有通过第三方插件方式的策略。有兴趣的可以深入学习。
轮循(默认)[Round Robin]
每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器shutdown 了,将不在分发请求到该服务器。
- servername 自定义名称
- server 配置支持 ip/域名 + 有端口/无端口(80) 。内容根据实际配置
- 可配置 n 个 server
1 | upstream servername { |
指定权重 [Least Connections]
通过权重,指定轮循的几率。weight和访问比率成正比,多用于服务器性能有差异的情况。
- servername 自定义名称
- server 配置支持 ip/域名 + 有端口/无端口(80) 。内容根据实际配置
- weight 与访问量成正比,数字越大轮循几率越大
- 可配置 n 个 server
1 | upstream servername { |
IP 绑定[IP Hash]
每个请求按根据客户端ip的hash结果分配服务器。这样可以客户端在一定时间内可以固定访问一台服务器,可以保持 Session 。
默认执行 20(忘记了)hash 算法查找服务器,如果没有则进行轮循(算是一种高级的轮循)。
- servername 自定义名称
- server 配置支持 ip/域名 + 有端口/无端口(80) 。内容根据实际配置
- 可配置 n 个 server
1 | upstream servername { |
Server 参数
- down 表示当前server 不参与负载
- weight 默认为1 数字越大 负载权重越大
- max_fails 允许请求失败的次数 当超过最大次数 返回proxy_next_upstream模块定义的错误
- fail_timeout:max_fails次失败后,服务端暂停的时间
- backup: 其他所有的非backup机器down或者忙的时候 请求这台机器,这台机器的压力最小
1 | upstream servername { |
Nginx+Springboot 实现负载均衡
Demo 说明
提供完整 Demo 下载学习使用。
环境
- JDK1.8 以以上
- Springboot 2.3.3
- Nginx 1.15 以上
安装
- 下载(https://github.com/liuqi0725/springboot-useful/tree/master/springboot-soft-balance-nginx) 建议使用
GitZip for github
插件下载独立目录 - 执行
clean
、package
操作,将打包的 jar 和application.yaml
放在一起 - 修改
application.yaml
端口地址. - 启动多个服务
- 启动后在不同的客户端机器上访问 http://localhost/hello/username username 自定义 。测试负载均衡
nginx Session 共享
使用反向代理负载均衡,不可避免会面对 Session 共享。一般的方式是 cookie、memcache、redis 来管理共享数据. 后面的 Springboot-security
专题,会专门讲解。
nginx 配置
配置采用的 ip_hash 。可以替换成其他的策略测试。
1 |
|