文章目录
实验环境:
主机名 | IP | 职能 | 说明 |
---|---|---|---|
servera | 192.168.1.136 | 客户端 | 配置openresty |
serverb | 192.168.1.116 | 服务端 | 配置jdk+tomcat |
server3 | 192.168.1.103 | 服务端 | 配置jdk+tomcat |
openresty配置参考博客:openresty的配置
这里不再赘述 默认servera已经成功配置并且可以访问
一、实现负载均衡访问jsp动态页面
1.安装并配置JDK
JDK全称Java SE Development kit(JDK),即java标准版开发包,是Oracle提供的一套用于开发java应用程序的开发包,它提供编译,运行java程序所需要的各种工具和资源,包括java编译器,java运行时环境,以及常用的java类库等。
JDK下载官网地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
我这里使用的是rpm包
[root@serverb ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@serverb ~]# rpm -qa | grep jdk
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
jdk1.8-1.8.0_181-fcs.x86_64 //jdk包
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
# 默认安装在/usr目录下 路径为/usr/java
2. 安装并配置tomcat
Tomcat是由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器(服务器),也是当前应用最广的JavaWeb服务器(免费)。
简单可以这样理解,当在一台机器上配置好Apache 服务器,可利用它响应HTML页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
Tomcat官网:http://tomcat.apache.org/
我这里下载的版本是7.0.37
服务端上,解压并启动tomcat:
[root@serverb ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/ //解压到指定路径
[root@serverb ~]# ln -s /usr/local/apache-tomcat-7.0.37 /usr/local/tomcat //添加软链接
[root@serverb ~]# cd /usr/local/
[root@serverb local]# ls
apache-tomcat-7.0.37 etc include lib64 mysql php share tomcat
bin games lib libexec nginx sbin src
[root@serverb tomcat]# bin/startup.sh //启动tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
为了方便测试,在tomcat发布页面添加jsp测试页
[root@serverb ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp //在tomcat1发布页面目录下编辑.jsp文件
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
重复以上步骤,在另一台服务器端上配置jdk和tomcat,同时添加jsp测试页面
3. 配置nginx
我这里的openresty存储路径为:/usr/local/openresty
在客户端主机上,编辑nginx的配置文件
[root@servera ~]# vim /usr/local/openresty/nginx/conf/nginx.conf //编辑配置文件
http {
upstream tomcat { //添加两台服务器
server 192.168.1.116:8080; //tomcat默认监听端口为8080
server 192.168.1.103:8080;
}
server {
location ~ \.jsp$ {
proxy_pass http://tomcat; //地址重定向
}
}
}
[root@servera ~]# /usr/local/openresty/nginx/sbin/nginx -t
[root@servera ~]# /usr/local/openresty/nginx/sbin/nginx -s reload //刷新配置
4. 访问测试
在浏览器中,通过客户端浏览器访问.jsp动态页面,可以看出每次访问到不同的tomcat服务器,实现了均衡负载。
二、session交叉存放
1. session简单说明
- 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。 常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
- 对Tomcat而言,当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session。
- Session的主要目的就是为了弥补Http的无状态特性。简单的说,就是服务器可以利用session存储客户端在同一个会话期间的一些操作记录。
2. 实现session交叉存储
在上面的实验中,当我们只开启一个tomcat时,产生的数据会保存到本地,但是当开启两个tomcat时,由于在负载均衡状态,受到nginx的调度,serverb端提交数据后直接跳到了server3,与之前的建立的session断开了,再次回来数据就不存在了。
那么为了解决这个问题,我们需要重新编译,添加sticky模块。
2.1 增加sticky粘滞模块
nginx-sticky-module 为 nginx 的第三方模块,使 nginx 支持 sticky 模式。所谓 sticky 模式就是指同一个用户的访问请求都被发送到同一个 tomcat 实例上处理。
下载nginx-sticky-module-ng模块的网站 :https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/
[root@servera ~]# unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip //解压软件包
[root@servera ~]# cd /usr/local/openresty/ //openresty的安装路径
[root@servera openresty]# ./configure --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
//添加stick模块 重新编译
[root@servera openresty]# gmake
[root@servera ~]# vim /usr/local/openresty/nginx/conf/nginx.conf
http {
upstream tomcat {
sticky; //添加模块,避免请求来回跳,信息丢失
server 192.168.1.116:8080;
server 192.168.1.103:8080;
}
server {
location ~ \.jsp$ {
proxy_pass http://tomcat; //地址重定向
}
}
}
[root@servera ~]# /usr/local/openresty/nginx/sbin/nginx -s reload //刷新配置
但如果serverb的tomcat挂掉,那么serverb上的数据依然会丢失,因此我们需要memcache的加入实现session交叉存放。
2.2 配置session交叉存放
session交叉存放数据的原理:
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存储在 memcached-1 上(M1 是T1failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。
session 的序列化方案官方推荐的有 4 种:
(1)java serialization
(2) msm-kryo-serializer
(3) msm-javolution-serializer
(4)msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,此实验我们采用 kryo 方式。
session交叉存放数据的步骤:
/////////////在两台服务端serverb,server3上在均配置session管理器////////
首先把如下软件包放置到/usr/local/tomcat/lib 目录中
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jar
memcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar
[root@serverb ~]# vim /usr/local/tomcat/conf/context.xml //配置管理器
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.1.116:11211,n2:192.168.1.103:11211" //替换为两台服务端IP,保证两台服务器11211端口启动(开启memcached服务)
failoverNodes="n1" //当出现故障时的备用服务器,也就是本机。serverb(116)中为n1,server3(103)中设定为n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@serverb ~]# /usr/local/tomcat/bin/shutdown.sh //关闭 tomcat
[root@serverb ~]# /usr/local/tomcat/bin/startup.sh //启动 tomcat
两台服务器完成上述相同的操作配置。
此时 就可以说完成了交叉存放。
当访问 192.168.1.136/test.jsp。不同的主机访问时会调度到不同的 tomcat 实例上处理,来自同一主机的请求会交给同一个 tomcat 实例处理,此时你 down 掉当前正在响应的 tomcat 实例,nginx 会自动把用户的请求调度到另一个 tomcat 实例上,同时 session 也没有丢掉。