一、session工作原理

由于http是无状态的协议,当我们访问了页面A,然后访问页面B,http无法确定这2个页面的访问是来自同一个人。因此,我们要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。例如:用户a和b同时进行了把商品加入购物车,这时我们不能区分a和b,所以需要一个session ID来维持这个过程。Cookie是服务器发送给客户端的,并且把信息保存在客户端的一个文件中,里面包含用户访问信息,便于下一此访问直接对到对应的后端服务器。Cookie可以被禁用,而session id相当于自己的一个属性,代表自己的身份。
我们使用session共享,是为了防止tomcat服务器重启或掉了之后的数据丢失情况;维持多个节点之间数据的一致性。

以下为基于memcache缓存的session共享: tomcat1和tomcat2将session分别存储在memcached2和memcached1中(实现交叉存储),当memcached2不可用时,才将tomcat1的数据存储在memcache1中,这样好处是,当tomcat1和memcached1同时崩溃时也不会丢失session会话,避免单点故障。

nginx  --->  tomcat  --->  memcached

二、实验步骤

Server6: 172.25.2.6   nginx  tomcat  memcached

Server1: 172.25.2.1   tomcat memcached

真机中进行测试。

1) 在server6和server1中安装jdk。

--->  tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/

--->  cd /usr/local

--->  ln  -s  jdk-7u79/  java        # 做一个软链接,方便使用

--->  vim /etc/profile               # 配置java的环境变量

---> source  /etc/profile            # 重新加载配置文件

2)对安装好的jdk进行检测

--->  Vim  test.java       # 在java中,类名要和文件名相同;且文件名后缀为.java

--->  javac test.java     # 生成.class文件

--->  java test           # 执行后的运行结果为hello xniu~

3)在server6和server1中安装tomcat

--->  tar  zxf  apache-tomcat-7.0.37.tar.gz  -C /usr/local

--->  cd /usr/local

--->  ln -s  apache-tomcat-7.0.37/  tomcat     # 软连接

4)在tomcat的默认发布目录编写.jsp文件测试,查看apache是否安装成功(在此以server6作为实例演示,server1步骤与6相同)

--->  cd /usr/local/tomcat/webapps/ROOT        # tomcat的默认发布目录 

--->  vim test.jsp

The  time is <%=new  java.util.Date() %>

--->  /usr/local/tomcat/bin/startup.sh         # 启动tomcat服务

#在浏览器中,使用172.25.2.6:8080/test.html来进行查看

5)对server6的nginx服务进行配置。

--->  vim  /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  localhost;        # 通过apache服务访问tomcat 
        location ~ \.jsp$ {
            proxy_pass   http://127.25.2.6:8080;     
        }

6)在server6和server1中下载memcached服务,并启动服务。

--->  yum  install  -y  memcached       # 在yum仓库中有,可直接下载

--->  /etc/init.d/memcached  start

--->  netstat -antlp| grep 11211        # memcached服务默认端口为11211

7)在server6和server1中编辑tomcat的配置文件,添加如下信息

--->  vim /usr/local/tomcat/conf/content.xml     # 添加在最后

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n6:172.25.2.6:11211,n1:172.25.2.1:11211"

failoverNodes="n6"   #在 node2 上此项设置为“n1”

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

8) 修改server1和server6下的test.jsp页面。内容如下

--->  vim /usr/local/tomcat/webapps/ROOT/test.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>

10) 将jar包放在server6和server1的/usr/local/tomcat/lib下。

11) 打开server6的tomcat,nginx;server1的tomcat(由于之前启动了memcache,在这就不启动了)

--->  /usr/local/tomcat/bin/startup.sh

--->  nginx

# 此时,我们可以在日志中查看memcache的节点信息

--->  cat /usr/local/tomcat/logs/cataline.out

12) 此时,我们的配置大致完成了,可以在浏览器中输入172.25.2.6/test.jsp

# 安装telnet,查看memcache的存储记录

--->  yum install -y telnet

--->  telnet localhost 11211    # localhost为主机ip;11211为端口号(使用get id号来查看)

若出现server1的memcache坏掉,则session会跑到server6上。 ##注意:不同主机访问时,会调用到不同的tomcat主机上,来自同一主机会交给同一个tomcat实例进行处理;若此时down掉正在响应的tomcat,nginx会自动把用户的请求交给另一个tomcat服务实例。实现serssion的共享

memcache+tomcat7.0.37+nginx实现session共享的更多相关文章

  1. .Net Core Web Api实践(二).net core+Redis+IIS+nginx实现Session共享

    前言:虽说公司app后端使用的是.net core+Redis+docker+k8s部署的,但是微信公众号后端使用的是IIS部署的,虽说公众号并发量不大,但领导还是使用了负载均衡,所以在介绍docke ...

  2. net core+Redis+IIS+nginx实现Session共享

    .Net Core Web Api实践(二).net core+Redis+IIS+nginx实现Session共享   前言:虽说公司app后端使用的是.net core+Redis+docker+ ...

  3. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  4. memcache相同主域名下的session共享

    本配置适合具有相同主域名的多台服务器进行session共享. 例如:www.lee.com , bbs.lee.com(多个子域名). 配置session保存在memcache: ini_set(&q ...

  5. 用Nginx实现Session共享的均衡负载

    前言 大学三年多,也做个几个网站和APP后端,老是被人问到,如果用户多了服务器会不会挂,总是很尴尬的回答:“哈哈,我们的用户还少,到了服务器撑不住的时候,估计都上市了吧”.说是这么说,但是对于有强迫症 ...

  6. springboot+spring session+redis+nginx实现session共享和负载均衡

    环境 centos7. jdk1.8.nginx.redis.springboot 1.5.8.RELEASE session共享 添加spring session和redis依赖 <depen ...

  7. SpringBoot2.x+Redis+nginx实现session共享和负载均衡

    1.创建SpringBoot项目添加依赖 <dependency> <groupId>org.springframework.session</groupId> & ...

  8. Nginx 分布式session共享问题

    在集群的时候每次访问,都会被代理转到不同的服务器,那么在这些服务器之间如何共享session? 解决方式1:session复制 只能在window下好使,web服务器解决(广播机制,将一台机器上的se ...

  9. nginx+tomcat+session共享(转)

    1 起因   最近对新开发的web系统进行了压力测试,发现tomcat默认配置下压到600人的并发登录首页响应速度就有比较严重的影响,一轮出现2000多个的 500和502错误.我把登录的时间统计做了 ...

随机推荐

  1. 使用distcp并行拷贝大数据文件

    以前我们介绍的访问HDFS的方法都是单线程的,Hadoop中有一个工具可以让我们并行的拷贝大量数据文件,这个工具就是distcp. distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群 ...

  2. 29张截图-全新安装CentOS7.5-超详细!

    目录 全新安装CentOS7.5 配置虚拟机 调整网卡名称 配置时区,分区,关闭安全工具 配置网络参数 配置root账户密码 参考链接 全新安装CentOS7.5 可以到这里下载镜像https://m ...

  3. 5.6 Components -- Handling User Interaction with Actions

    1. 组件允许你定义可以在整个应用程序中重用的控件.如果它们够通用,它们也可以在被共享给其他人并且在许多应用程序中被使用. 2. 为了使一个可重用的控件有用,然而,你首先需要你的应用程序的用户和它交互 ...

  4. Java用数据结构解决实现问题之数学问题

    有趣的整数: 完数:如果一个数字恰好等于他的因子之和,就叫做完数,需求是求出10000以内的所有的完数. 解法:1.用n去除以1-n之间的所有的整数,将能整除的被除数保存到一个数组中,作为n的一个因子 ...

  5. Spring整合Mybatis 之分页插件使用

    [分页插件项目中的正式代码一共有个5个Java文件,这5个文件的说明如下] Page<E>[必须]:分页参数类,该类继承ArrayList,虽然分页查询返回的结果实际类型是Page< ...

  6. HDU4112

    对于n*m*k的方块,用手掰成1**1的那么搜需要的步骤是固定的,为n*m*k-,如果用刀切,因为可以把多块叠在一起切,所以对于长度为n的,将他切成0,所需要的步骤数位k 对于n*m*k的方块,用手掰 ...

  7. java第四天

    p32~p36: 学习javadoc 1.第一步,打开一个一定规模的java项目 2.第二步,搭建测试环境 IntelliJ IDEA ——> Tools ——> Generate Jav ...

  8. FromBottomToTop第十一周项目博客

    FromBottomToTop第十一周项目博客 项目内容 塔防游戏 大体就是在地图上以合理阵型建设防御炮塔来阻止小怪进入我方阵地.玩家需用现有的金币进行炮台建设或升级,金币数可根据打怪个数增加.入侵的 ...

  9. ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory 【学习笔记】【原创】

    作者:庄泽彬(欢迎转载,请注明作者) 说明:千辛万苦终于在ubuntu18.04上安装好cuda9.1与cudnn7.0.5,但是导入import tensorflow as tf却报了这个错误. 上 ...

  10. Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property

    参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...