nginx+tomcat+memcache实现负载均衡和session交叉存放

实验环境:同前一章LNMP架构(3)实验环境相同
一,在server1上安装jdk
因为我们的tomcat是java的实现,所以我们需要安装jdk,并制作软连接
nginx+tomcat+memcache实现负载均衡和session交叉存放
2.编辑全局变量

vim /etc/profile

nginx+tomcat+memcache实现负载均衡和session交叉存放
测试生成的环境变量
nginx+tomcat+memcache实现负载均衡和session交叉存放
3.编写一个java文件检测jdk环境是否正确
nginx+tomcat+memcache实现负载均衡和session交叉存放
4.同样将tomcat压缩包解压到/usr/local下,并且制作软连接,开启tomcat
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
5.编辑nginx的配置文件,使其可以访问.jsp文件

vim /usr/local/lnmp/nginx/conf/nginx.conf

nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
6.用浏览器访问本机的8080段口
nginx+tomcat+memcache实现负载均衡和session交叉存放
7.在tomcat的默认发布目录/usr/local/tomcat/webapps/ROOT下新建一个jsp文件
nginx+tomcat+memcache实现负载均衡和session交叉存放
浏览器测试
nginx+tomcat+memcache实现负载均衡和session交叉存放
8.在server2主机上搭建同样的tomcat和java环境,并且同样在默认发布目录写如test.jsp
nginx+tomcat+memcache实现负载均衡和session交叉存放

nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放

nginx+tomcat+memcache实现负载均衡和session交叉存放
9.在server1修改nginx的配置文件实现负载均衡
vim /usr/local/lnmp/nginx/conf/nginx.conf

nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
10.修改server2的测试文件
nginx+tomcat+memcache实现负载均衡和session交叉存放
11.浏览器测试负载均衡
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放

12.我们需要注意一个情况,就是我们在访问本机的8080端口时会跳转至tomcat的默认发布界面,但是访问发布目录index.jsp时显示值有文字,没有图片,这是因为nginx和tomcat我默认访问不统一
只需要修改nginx的主配置文件的访问/本机时将路径改变即可

在tomcat重实现session共享

什么是session?
session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

利用nginx+tomcat+memcache实现session共享
为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了对立的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中…
nginx+tomcat+memcache实现负载均衡和session交叉存放
Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将 session 存
储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩
溃时也不会丢失 session 会话,避免单点故障。
实验步骤:
1.在server1和server2的tomcat的默认发布目录重修改我们的测试页

<%@ 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>

这是一个可以提交信息的界面
vim /usr/local/womcat/webapps/ROOT/test.jsp
nginx+tomcat+memcache实现负载均衡和session交叉存放
注意server1和server2都要修改
2.在server2关闭tomcat,在浏览器中访问172.25.77.1/test.jsp,会发现所有输入的数据会保存并且可见
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
3.开启server2的tomcat再词测试
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
我们发现我们再次输入时之前的信息就没有了,这是为什么呢?
这是因为当我们只开启一个tomcat时,产生的数据会保存到本地,但是当开启两个tomcat时,我们时再负载均衡状态,受到nginx的调度,server1端提交数据后直接跳到了server2,与之前的建立的session断开了,再次回来数据就不存在了。那么为了解决这个问题,我们需要重新编译,添加sticky模块。sticky粘值能让同一个服务器的请求放到同一个后端上。

4.server1重新编译安装,添加sticky模块
nginx+tomcat+memcache实现负载均衡和session交叉存放
关闭nginx,清除之前的编译文件
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放

nginx+tomcat+memcache实现负载均衡和session交叉存放
5.编译完成后编辑nginx的配置文加加入sticky,开启nginx服务
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
6.浏览器重新测试,两个的tomcat都开启
nginx+tomcat+memcache实现负载均衡和session交叉存放
但是我们还需要考虑一个问题,就是如果server1的tomcat挂掉呢,那么server1上的数据就会丢失,因此我们需要memcache的加入
7.加入memcache
首先server1和server2都安装memcached,并且开启
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
再server1和server2的/usr/local/tomcat/conf目录下编辑contest.xml文件(server1的failoverNodes为n1)

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.77.1:11211,n2:172.25.77.2:11211"
failoverNodes="n1"
#在 node2 上此项设置为“n2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
将两端的tomcat服务关闭,将一喜爱的jar包放在两台服务器的/usr/local/tomcat/lib目录下,然后重启服务
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
8.浏览器重新运行测试界面,继续测试
nginx+tomcat+memcache实现负载均衡和session交叉存放
9.挂掉server1的tomcat,继续测试
nginx+tomcat+memcache实现负载均衡和session交叉存放
nginx+tomcat+memcache实现负载均衡和session交叉存放
我们发现仍然时可以存储数据的
10.我们再server安装telnet,然后get server1的ID
nginx+tomcat+memcache实现负载均衡和session交叉存放
得到了server1挂掉后数据在server2上的备份