这一篇我们继续Ngnix系列的第三篇,说一下Nginx的负载均衡,还是先通过简单示例配置体验一下Ngnix的负载均衡,然后我们再从概念上对负载均衡进行说明,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
目录
环境准备
下载Tomcat并配置
启动Tomcat验证
实现负载均衡
测试负载均衡
负载均衡策略
轮询(默认)
加权轮询
根据ip分配方式
最少连接方式
其它方式
环境准备
我们准备两个Tomcat模拟两个服务,正常情况下访问 http://localhost:8080/ 或者 http://localhost:8081/来获取我们我们需要的数据,通过Ngnix实现负载均衡后,我们访问 http://localhost:8090/ 来从8080和8081来获取数据。
下载Tomcat并配置
点此下载
下载后解压并复制一份,第一个Tomcat不用该,修改第二个Tomcat下的server.xml配置文件,只修改以下两处即可:
启动Tomcat验证
为了演示方便我们修改下Tomcat的首页,webappsROOT目录下的index.jsp文件,增加一个端口号展示:
双击运行bin目录下的startup.bat启动两个Tomcat,启动后我们访问 http://localhost:8080/ 和 http://localhost:8081/ 出现如下页面说明Tomcat正常启动。
实现负载均衡
Nginx 服务器是介于客户端和服务器之间的中介,通过上一篇博客讲解的反向代理的功能,客户端发送的请求先经过 Nginx ,然后通过 Nginx 将请求根据相应的规则分发到相应的服务器。
我们在Ngnix的配置文件的http块中新增一个server块:
upstream mysvr {
server localhost:8080;
server localhost:8081;
}
server {
listen 8090;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://mysvr;
}
}
测试负载均衡
重启Ngnix后,我们多次访问 http://localhost:8090/ 发现8090和8091轮流出现,说明请求分发到了两个Tomcat服务。
负载均衡策略
上面我们多次访问 http://localhost:8090/ 发现8080和8081交替出现,说明我们的请求被交替分发到了两个服务中,这是Ngnix默认的负载均衡策略--轮询,下面看下Nginx的负载均衡策略。
| 轮询 | 默认方式 |
| weight | 权重方式 |
| ip_hash | 依据ip分配方式 |
| least_conn | 最少连接方式 |
| fair(第三方) | 响应时间方式 |
| url_hash(第三方) | 依据URL分配方式 |
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
有如下参数:
| fail_timeout | 与max_fails结合使用。 |
| max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了, |
| fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
| backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。 |
| down | 标记服务器永久停机了。 |
加权轮询
通过weight指定权重,weight和访问比率成正比,用于后端服务器性能不均的情况。如下,我们修改upstream中每个服务的权重,再次测试时会发现明显 8080 端口号出现的次数更多,试验的次数越多越接近我们配置的比例。
upstream mysvr {
server localhost:8080 max_fails=3 fail_timeout=20s weight=5;
server localhost:8081 weight=1;
}
根据ip分配方式
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
配置也很简单,只要在upstream 指令块中增加了 ip_hash 指令即可。该指令就是告诉 nginx 服务器,同一个 IP 地址客户端发送的请求都将分发到同一个 Tomcat 服务器进行处理。
最少连接方式
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
其它方式
另外还有其它第三方的负载均衡策略,第三方的负载均衡策略的实现需要安装第三方插件,感兴趣的自己看下。



