lnmp架构(八)——nginx +tomcat+memcache实现在tomcat中的session共享

一、什么是session

Session是指会话控制,是保存在服务器上一种机制,当客户端访问服务器的时候,服务器会把信息以某种形式记录在服务器上,恰恰和Cookie相反。

Session经常用于会话过程中保证一定状态的信息,比如,用户在登录的时候,需要浏览web应用程序,并且存储是在页面重新被加载的时候,Session始终保持着任何时间都可以在设备上进行访问,但是随着用户的增多,Session的服务器内存也要不断加大,Session也会使用持久方法的限制。

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。

1.1 session的工作原理

http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你
在这里插入图片描述
当客户端向服务器发出请求的时候,服务器会保存一个session,当session第一次被启用时,同时也是在客户端上形成一个cookie文件,首次使用session_start()函数,并且PHP去加载已经储存的session变量,并且通过函数去注册变量,当脚本执行完毕后,会自动保存到session库中,已方便下次使用。

1.2 cookie和session结合使用

web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:

1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。

2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式

1.3 Nginx+tomcat+memcached

使用nginx作为前端服务器来实现tomcat负载均衡及高可用,同时基于jsp的动态特征,我们将引入memcache来保持网页在连接过程中的session保持,利用memcached把多个tomcat的session集中管理

图解:
在这里插入图片描述
客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;tomcat 把会话通过组播的方式复制到集群各节点;所有节点共享会话;

当memcached有两个时可以采用交叉存储,可以更好的避免单点故障

在这里插入图片描述

二、session共享具体实现

在上一篇博客中,我们已经实现了会话保持,但是仍旧出现问题,当一台tomcat服务器宕机,另一台服务器无法获取数据,造成数据丢失,现在我们就来解决这个问题。上篇博客只是介绍了一下cookie。

实验环境
该实验环境与上上篇博客一样,都是真机测试,server1lnmp主机,server2、server3为tomcat服务器,所以可以接着博客来做。

主机(版本:ip) 功用
虚拟机server1(rhel7.3:172.25.2.1) lnmp环境主机
虚拟机server2(rhel7.3:172.25.2.2) tomcat1服务器
虚拟机server2(rhel7.3:172.25.2.2) tomcat2服务器
真机(rhel7.3:172.25.2.250) 测试机

1、实现负载均衡和不轮询

(ip_hash,上篇博客中不轮询的实现是在nginx中加入了nginx-sticky-module模块实现的cookie绑定)

step1 编写测试页内容:

在server2中:

cd /usr/local/tomcat/webapps/ROOT/	#tomcat默认发布目录
vim test.jsp
写入:
<%@ page contentType="text/html; charset=GBcdK" %>
<%@ 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> session " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
%>

在这里插入图片描述

在这里插入图片描述
发给server3:

scp test.jsp root@172.25.254.3:/usr/local/tomcat/webapps/ROOT/test.jsp

step2 测试:

访问172.25.254.2:8080/test.jsp和172.25.254.3:8080/test.jsp
访问172.25.254.1/test.jsp	#依旧轮询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本质轮询页面一样,这是为了看负载均衡效果这样设置,可以就看出session信息变了,并没有保持,下边通过ip_hash

step3 不轮询的设置:
在server1中:

cd /usr/local/lnmp/nginx/conf/
vim nginx.conf
写入21行内容:
 17 http {
 18     include       mime.types;
 19     default_type  application/octet-stream;
 20         upstream tomcat {
 21                 ip_hash;
 22                 server 172.25.254.2:8080;
 23                 server 172.25.254.3:8080;
 24 }

nginx -t
nginx -s reload

在这里插入图片描述
step4 测试:

访问172.25.254.1/test.jsp	#不再轮询

cd /usr/local/tomcat
bin/shutdown.sh	#宕掉server2的服务器,才会访问到server3

2.实现交叉存储

在server2和server3中:

step1 把需要的安装包放在指定目录下:

cp * /usr/local/tomcat/lib/

在这里插入图片描述
step2 修改测试页内容:

vim /usr/local/tomcat/conf/context.xml 
写入:	#server3的文件内容只需要修改38行的n2为n3即可
 36 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
 37 memcachedNodes="n2:172.25.254.2:11211,n3:172.25.254.3:11211"
 38 failoverNodes="n2"
 39 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
 40 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
 41 />
 42 </Context>

在这里插入图片描述

  • xml常用于数据存储和传输,文件后缀为 .xml

它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言 。

标记,指计算机所能理解的信息符号;
通过此种标记,计算机之间可以处理包含各种信息的文章等
1 、标记,指计算机所能理解的信息符号;
2、 通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据

step3 安装并开启memcached:

yum install memcached -y
systemctl start memcached
netstat -anlp| grep memcached

在这里插入图片描述
step4 重启tomcat:

cd /usr/local/tomcat/
bin/shutdown.sh 
bin/startup.sh 

step5 测试:

刷新页面:

  • 访问server2时出现n3表示:已经把数据存放到了server3中
  • 访问server3时出现n2表示:已经把数据存放到了server2中
  • 访问http://172.25.254.1/test.jsp时:server3的数据写在server2上,而当使用bin/shutdown.sh命令将server3的tomcat服务宕掉时,再刷新页面,server2来提供服务,而刚刚的数据已经保存在了server2的服务器上,所以我们之前的数据并不会丢失,而server2的数据也被写在server3中,即使server2的tomcat服务挂掉,我们也能从server3中获取到我们的数据。这样就实现了交叉存储。

注意:这里是挂掉服务而不是整个服务器宕掉。因为如果服务器宕掉的话,memcache也就挂掉了,就无法实现交叉存储。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了184 篇原创文章 · 获赞 7 · 访问量 3619

猜你喜欢

转载自blog.csdn.net/weixin_43936969/article/details/104719014