1. 引介
由于单台的Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大的时候,单台的Tomcat是扛不住的,这个时候,就需要搭建tomcat集群,而目前比较流行的做法是通过Nginx来实现Tomcat集群的负载均衡。
2. 环境准备
2.1 准备tomcat
1. 在服务器上,安装两台tomcat
2. 然后分别改tomcat服务器的端口号:
打开tomcat/conf/server.xml
A)修改监听关闭服务器的指令端口号:8005——> 8015 ——> 8025
B)修改HTTP监听端口号:8080 ——> 8888 ——> 9999
C)修改tomcat与其他服务器进行交互的端口号:8009 ——> 8019 ——> 8029
2.2 安装配置Nginx
2.2.1 下载安装Ngnix
2.2.2 配置Nginx
在当前服务器上,安装Nginx,然后配置Nginx,修改nginx-1.8.1\conf\nginx.conf:
新增配置如下:
### serverpool upstream负载均衡模块的名称
### 在serverpool中配置了两个tomcat的访问路径
### 当我们以localhost的99这个端口号来访问的时候,访问的是Nginx,
### 但是最终要访问的是我们配置好的两个tomcat 8888 和 9999
### 通过serverpool来找,所以,在serverpool中应该配置这两个访问路径
upstream serverpool {
server localhost:8888;
server localhost:9999;
}
server {
## 当前虚拟主机监听的端口号
listen 99;
## 访问的域名
server_name localhost;
## 拦截的映射路径 为 / 即根目录
location / {
## proxy_pass 反向代理配置 代理的路径是http://serverpool/
## serverpool指的是一个upstream的模块,所以需要在上面声明一个upstream模块
proxy_pass http://serverpool/;
}
}
如图:
2.3 修改tomcat配置信息
为了验证我们的配置是成功的,Nginx能实现负载均衡,我们需要修改tomcat服务器的欢迎页面
分别修改两台tomcat的ROOT项目的index.jsp的Home为Home-8888与Home-9999,如图:
2.4 启动tomcat
分别启动两台tomcat
2.5 启动Nginx
双击nginx.exe,弹出cmd控制台一闪而过,就启动成功,打开任务管理器,查看进程,可以看到启动成功,如图:
2.6 访问测试
首先分别访问两台tomcat,如图:
访问成功。
现在用Nginx访问,怎么访问了,我们刚才在Nginx中配置了一个虚拟主机,访问域名是localhost,监听端口号是99 ,所以直接用http://localhost:99/来访问,如图:
刷新一下,访问另一台服务器,如图:
由此可知,这里是均匀的将客户端浏览器的压力分摊给两台tomcat,这个是由Nginx负载均衡策略所决定的,这种策略称之为轮询。
3. 负载均衡策略
3.1 轮询
最基本的配置方法,它是upstream模块默认的负载均衡策略,每个请求会按照访问时间顺序,逐一分配到不同的后端服务器。
upstream serverpool {
server localhost:8888;
server localhost:9999;
}
参数说明:
参数 | 描述 |
fail_timeout | 与max_fails结合使用 |
max_fails | 设置在fail_timeout参数设置的时间内的最大失败次数,如果在这个时间内,所针对该服务器 的请求都失败了,那么该服务器会被认为是停机了 |
fail_time | 服务器会被认为停机的时间长度,默认为10s |
backup | 标记该服务器为备用服务器,当主服务器停止时,请求会被发送到备用机。 例如:server localhost:9999 backup; |
down | 标记服务器永久停机了 |
3.2 权重weight
权重方式,在轮询的基础上制定轮询的几率。
upstream serverpool {
server localhost:8888 weight=3;
server localhost:9999 weight=1;
}
weight参数用于指定轮询几率,默认值为1,;weight的数值与访问比率成正比,比如:133服务器上的服务被访问的几率为137服务器的3倍。
此配置比较适用服务器的硬件配置差别比较大的情况。
权重配置好之后,可以使用命令:nginx.exe -s reload 重启Nginx例如:
3.3 ip_hash
指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
upstream serverpool {
ip_hash;
server localhost:8888 weight=3;
server localhost:9999 weight=1;
}
4. Session共享方案
在tomcat集群中,如果应用需要用户进行登录,那么这个时候,用于tomcat做了负载均衡,则用户登录并访问应用系统时,就会出现问题。
要解决以上问题,有以下几种方案
4.1 ip_hash 策略
一个用户发起的请求,只会请求到tomcat1上进行操作,另一个用户发起的请求只在tomcat2上进行操作,那么这个时候,同一个用户发起的请求,都会通过Nginx的ip_hash策略,将请求转发到其中的一台tomcat上。
4.2 Session复制
在工程中,制作session.jsp页面,分别将工程存放在两台tomcat的webapps/目录下:
4.2.1 测试工程准备
session.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>hello</title>
</head>
<body>
Tomcat-9999
<br/>
sessionId:<%= session.getId() %>
<br/>
<%
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null && loginUser.toString().length() > 0 ){
out.println("session有值,loginUser = " + loginUser);
} else {
session.setAttribute("loginUser","zoudm");
out.println("session没有有值");
}
%>
</body>
</html>
tomcat1和tomcat2上分别发布该工程:
4.2.2 访问
在浏览器分别输入http://localhost:8888/webTest/session.jsp与http://localhost:9999/webTest/session.jsp,如图:
可以看到sessionID值并不一致。说明这时候,两个工程的session还没实现共享,所以现在我们需要实现的是,当访问8888的时候,我们需要将8888服务器上的session信息同步到9999,当访问9999服务器的时候,要将session同步到8888,要想实现这个功能,我们需要依赖tomcat的一个配置。
4.2.3 tomcat集群的session共享配置
打开tomcat官网关于集群的描述 http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html ,通过其描述,可以知道我们要实现这个功能需要添加两个配置,一个是在server.xml中添加如下配置
一个是在当前工程web.xml中新增一个标签,如图:
开始配置:
tomcat/conf/server.xml
WEB-INF/web.xml
注意:两台服务器和两个工程都需要这样配置
然后重启两台服务器,重新访问
先访问9999,如图:
再访问8888,如图:
且两次访问的sessionId值是一样的。
注意:session复制这种解决方案只能在小型集群的web应用中使用,大型集群应用很少有这样用的。因为当服务器比较多的时候,做session复制会形成资源耗费,session复制是通过广播的形式来操作的,所以会造成带宽的极度耗费,所以最终会影响我们的性能。
4.3 SSO-单点登录
单点登录(single sign on),简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境session共享的方案之一。