openresty(nginx)+tomcat+JDK+memcache实现负载均衡访问jsp动态页面、session交叉存放

实验环境:

主机名IP职能说明
servera192.168.1.136客户端配置openresty
serverb192.168.1.116服务端配置jdk+tomcat
server3192.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简单说明

  1. 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。 常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
  2. 对Tomcat而言,当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session。
  3. 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 也没有丢掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值