Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

转载自  Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

一、Session共享使用tomcat-cluster-redis-session-manager插件实现

插件地址见:
https://github.com/ran-jit/tomcat-cluster-redis-session-manager

该插件支持Tomcat7、Tomcat8、Tomcat9

或者直接在附件中下载(版本为2.0.2,2017-11-27日前最新版本)

http://dl.iteye.com/topics/download/d9fffd9d-84dd-385b-b10e-6376eaf0c815

这里有是一个只支持Tomcat7的,不支持tomcat8,暂时不见新的维护:

https://github.com/jcoleman/tomcat-redis-session-manager

 

二、tomcat-cluster-redis-session-manager详解

1、解压后的文件如下:

 

conf目录下有一个redis-data-cache.properties :

Redis的配置文件

#-- Redis data-cache configuration  #- redis hosts ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....  
redis.hosts=127.0.0.1:6379  #- redis password (for stand-alone mode)  
#redis.password=  #- set true to enable redis cluster mode  
redis.cluster.enabled=false  #- redis database (default 0)  
#redis.database=0  #- redis connection timeout (default 2000)  
#redis.timeout=2000  

ib目录下有4个jar包,如下:

  1. commons-logging-1.2.jar

  2. commons-pool2-2.4.2.jar

  3. jedis-2.9.0.jar

  4. tomcat-cluster-redis-session-manager-2.0.1.jar

 

三、使用方法:

压缩文件中有使用方法,见readMe.txt 文件:

第一步:

1. Move the downloaded jars to tomcat/lib directory  * tomcat/lib/  

就是把lib目录下的Jar包全复制到tomcat/lib目录下

(一般来说tomcat是集群,至少有2个tomcat,所以先配置好一个tomcat,复制完文件后,再将tomcat文件重新复制一份,这样省事,但需要修改tomcat相应的端口)

第二步:

2. Add tomcat system property "catalina.base"  * catalina.base="TOMCAT_LOCATION"  

就是配置一个环境变量,和Jdk配置的环境变量一样,需要配置一个catalina.base的环境变量,值为TOMCAT_LOCATION

如下:

第三步:

3. Extract downloaded package (tomcat-cluster-redis-session-manager.zip) to configure Redis credentials in redis-data-cache.properties file and move the file to tomcat/conf directory  * tomcat/conf/redis-data-cache.properties  

把conf目录下的配置文件redis-data-cache.properties复制到tomcat/conf/目录下

第四步:

4. Add the below two lines in tomcat/conf/context.xml  <Valve className="tomcat.request.session.redis.SessionHandlerValve" />  <Manager className="tomcat.request.session.redis.SessionManager" />  

在tomcat/conf/目录下的context.xml文件,加上相应的配置,如下:

<?xml version="1.0" encoding="UTF-8"?>  <!--  Licensed to the Apache Software Foundation (ASF) under one or more  contributor license agreements.  See the NOTICE file distributed with  this work for additional information regarding copyright ownership.  The ASF licenses this file to You under the Apache License, Version 2.0  (the "License"); you may not use this file except in compliance with  the License.  You may obtain a copy of the License at  http://www.apache.org/licenses/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License.  
--><!-- The contents of this file will be loaded for each web application --><Context>  <!-- Default set of monitored resources. If one of these changes, the    -->  <!-- web application will be reloaded.                                   -->  <WatchedResource>WEB-INF/web.xml</WatchedResource>  <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>  <!-- Uncomment this to disable session persistence across Tomcat restarts -->  <!-- <Manager pathname="" /> -->  <!-- Uncomment this to enable Comet connection tacking (provides events  on session expiration as well as webapp lifecycle) -->  <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> -->  <Valve className="tomcat.request.session.redis.SessionHandlerValve"/>  <Manager className="tomcat.request.session.redis.SessionManager"/>  </Context>  

第五步:

5. Verify the session expiration time (minutes) in tomcat/conf/web.xml  <session-config>  <session-timeout>60<session-timeout>  <session-config>  

修改session的过期时间,默认是30分钟,可以不需要此步骤。

session集群的配置至此结束。

 

四、Nginx集群

1、下载Nignx:

http://nginx.org/en/download.html

本人练习时使用windows,所以下载的windows版本:

http://nginx.org/download/nginx-1.13.7.zip

2、下载后解压:D:\soft\nginx-1.12.2

(之前使用的是1.12.2的版本,现在最新版是1.13.7,但都一样,附件中有1.12.2版本提供下载)

 

3、修改Nginx配置文件nginx.conf

进入conf目录(D:\soft\nginx-1.12.2\conf),找到nginx.conf配置文件,打开编辑:

3.1在http{……}里加上upstream,如下:

upstream myTomcatCluster{# tomcatCluster和proxy_pass保持一样    #解决session的问题    #ip_hash;#加上这个,解决Session每次访问页面都不一样,加上就一样了。    #这里是tomcat的地址,weight越大,访问机率越大。    server 127.0.0.1:9300 weight=1 fail_timeout=5s max_fails=1;    server 127.0.0.1:9400 weight=1 fail_timeout=5s max_fails=1;    }   

server:配置tomcat服务器请求的地址,2台Tomcat服务就配置2个server,分别对应9300,9400端口

weight 表示权重,权重越大,访问到的机率越大。

3.2、修改location / {……}

默认是这个的:

location / {  root   html;  index  index.html index.htm;  }  

修改成这样:

location / {  #root   html;  proxy_pass http://myTomcatCluster;  #index  index.html index.htm;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_connect_timeout       1;  proxy_read_timeout          1;  proxy_send_timeout          1;   }  

最简单的配置就是:

location / {  proxy_pass http://myTomcatCluster;  
}  

myTomcatCluster 对应upstream后的命名。

下面的配置可以解决2个Tomcat服务器集群,当一台服务器挂掉(宕机)后,请求变得很慢的问题。

(Tomcat集群一台服务器挂掉后请求变慢解决方案)

proxy_connect_timeout       1;  
proxy_read_timeout          1;  
proxy_send_timeout          1;   

3.3、启动Nginx服务器

使用Windows命令行启动

(1)进入D盘:d:

(2)进入D:\soft\nginx-1.12.2目录:

cd D:\soft\nginx-1.12.2  

(3)启动服务: (启动一闪而过,但打开进程管理器能看到是已经启动的)

start nginx  

关闭服务的命令:nginx -s stop

重新加载的命令:nginx -s reload,修改配置文件后,可以使用该命令直接加载,不需要重启。

 

五、测试集群:

1、tomcat准备

将已经配置好的一个tomcat复制一份,修改端口,然后再修改一下tomcat的配置文件(server.xml)

我的一个tomcat在:

D:\soft\apache-tomcat-8.0.45-9300\conf

另一个是:

D:\soft\apache-tomcat-8.0.45-9400\conf

修改:

<Engine defaultHost="localhost" name="Catalina">  

其中tomcat 9300端口的修改如下:

<Engine defaultHost="localhost" jvmRoute="jvm9300" name="Catalina">  

tomcat 9400端口的修改如下:

<Engine defaultHost="localhost" jvmRoute="jvm9400" name="Catalina">  

2、项目准备:

新建立一个web项目,然后新建立一个index.jsp的文件,如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>首页redis-session</title>  
</head>  
<body>  <div>tomcat 集群测试</div>  <div>  <%     //HttpSession session = request.getSession(true);     System.out.println(session.getId());     out.println("<br> SESSION ID:" + session.getId()+"<br>");     %>  </div>  
</body>  
</html>  

主要是在打印页面输出sessionId的信息:

out.println("<br> SESSION ID:" + session.getId()+"<br>");  

然后把这个项目分别部署到9300、9400端口的2个tomcat中,分别启动,记得也启动Nginx和redis哦

然后打开浏览器通过地址访问项目:http://localhost/redis-session/ (使用Nginx集群分发,不需要端口号访问),显示如下:

tomcat 集群测试  SESSION ID:B837ECA85B47081EAA2FEFCD7E579CD2.jvm9400  

无论怎么刷新访问(打开新的标签页也是(非新窗口))的都是jvm9400,也就是端口号为9400的tomcat

后缀.jvm9400就是前面配置的:

<Engine defaultHost="localhost" jvmRoute="jvm9400" name="Catalina">  

打开新的隐身窗口访问:

tomcat 集群测试  SESSION ID:83BBA58F4EB7B2EFF90AE05D4A0629FD.jvm9300  

这时访问的是端口号为9300的tomcat,通过后缀.jvm9300判断知道。

新窗口每次访问的是都是tomcat9300,session也不会变。

在访问后缀为.jvm9400时,把端口9400的tomcat关掉,再次刷新访问,sessionId一样不变,由此可见,2个tomcat的sessionId是共享的。

使用Redis实现session共享的好处就是,把session管理放在redis中,如果服务器重启或挂机,sessionId保存在redis中,下次重启后一样生效,避免sessionId失效,同样redis最好也做集群,避免redis重启或挂机。

结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人博客搭建

先下载node.js 用npm或cnpm安装hexo cnpm install hexo 再创建一个文件夹&#xff0c;在文件夹目录下打开cmd 输入 hexo init 输入 hexo s 这就在本地算是完成了一个博客的创建 新建博客hexo n ‘Hello world’ hexo clean hexo s 就可以再次启动&#xff0c;这样 记得先 cn…

C#使用Xamarin开发可移植移动应用进阶篇(10.综合演练,来一份增删改查CRUD)

说点什么.. 呃 也有半个月没更新了. 本来这篇的Demo早就写完了,文章也构思好了.迟迟没发布..是因为实在太忙.. 项目要上线..各种 你们懂的.. 正赶上自己十一人生大事..结婚..所以..忙的那叫一个脚不沾地啊. 今天的学习内容? 使用我们前面所学的技术,写一个增删改查. 效果如下…

hexo部署在码云出现样式问题

然而本地服务器并没有任何问题 重建一个 重新建一个仓库 还是这种情况&#xff0c;回头再找原因&#xff0c;两次都是这种情况&#xff0c;就是配置错了 借用 https://blog.csdn.net/xiangwanpeng/article/details/53155642 https://blog.csdn.net/qq_29347295/article/deta…

当你输入一个网址的时候,实际会发生什么?

转载自 当你输入一个网址的时候&#xff0c;实际会发生什么? 译文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/ 作为一个软件开发者&#xff0c;你一定会对网络应用如何工作有一个完整的层次化的认知&#xff0c;同样这里也包括这些应用所…

SIMD via C#

简介 TL;DR 我们为C#&#xff08;准确地说是.NET Core&#xff09;引入了一套全新的机制&#xff0c;使得C# 以后可以像C/C 一样直接使用intrinsic functions 来直接操作Intel CPU 的大多数SIMD 指令了&#xff08;从SSE 到AVX2&#xff09;。 &#xff08;注意是以后&#xff…

Ae做一个立体地球

Ae做一个立体地球 拿到一张照片 将它变成标题的地球 在AE里 即可变成一个地球 看上去亮多了&#xff0c;再定个关键帧即可旋转

ASP.NET Core 处理 404 Not Found

问题 在没有修改任何配置的情况下&#xff0c;这是用户使用 Chrome 访问不存在的URL时会看到的内容&#xff1a; 幸运的是&#xff0c;处理错误状态代码非常简单&#xff0c;我们将在下面介绍三种技术。 解决方案 在以前的ASP.NET MVC版本中&#xff0c;主要在 web.config 中处…

搭建一个二次元博客

小叙&#xff1a; 因为前段日子尝试过自己搭建网站&#xff0c;也在b站发了视频&#xff0c;奈何技术太菜&#xff0c;被喷的严重。所以决定重构一下网站&#xff0c;改成一个个人博客。这里非常感谢小游提供的主题&#xff0c;感谢他对这么优秀的主题的推广。 如果你正好也要…

从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD

Github源码地址&#xff1a;https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 这是第一大部分的最后一小部分。要完成CRUD的操作。 Repository Pattern 我们可以直接在Controller访问DbContext&#xff0c;但是可能会有一些问题: …

做这个网站原因之二

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

spring cloud+dotnet core搭建微服务架构:配置中心续(五)

前言 上一章最后讲了&#xff0c;更新配置以后需要重启客户端才能生效&#xff0c;这在实际的场景中是不可取的。由于目前Steeltoe配置的重载只能由客户端发起&#xff0c;没有实现处理程序侦听服务器更改事件&#xff0c;所以还没办法实现彻底实现这一功能。这一章的例子&…

聊聊最近吧

讲讲我最近干了什么事吧以及以后该干啥 其实大部分我学到的东西&#xff0c;都写在博客上了&#xff0c;可以通过博客看到一个人的学习轨迹。除了这些&#xff0c;我也尝试拍些视频去学习一些新的东西。视频剪辑&#xff0c;特效什么的都在尝试。 有个视频我也只是随便尝试尝试…

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

AspectCore.Extension.Reflection : .NET Core反射扩展库

在从零实现AOP的过程中&#xff0c;难免会需要大量反射相关的操作&#xff0c;虽然在.net 4.5/.net core中反射的性能有了大幅的优化&#xff0c;但为了追求极致性能&#xff0c;自己实现了部分反射的替代方案&#xff0c;包括构造器调用、方法调用、字段读写&#xff0c;属性读…

【分享】通过手游赚¥

这本来是个回答&#xff0c;但是在知乎被删了&#xff0c;于是我决定还是在自己网站再发一份&#xff0c;特么知乎店大欺人&#xff0c;我一这么水回答&#xff0c;还被认为是广告营销 首先说明一点&#xff0c;这个完全是自我经历&#xff0c;一种分享吧。觉得假的自然假。 我…

Azure Cosmos DB技术性解读

Azure Cosmos DB是微软公司打造的一项全球分布式、横向分区、多模型数据库服务。该服务允许客户弹性&#xff08;及独立形式&#xff09;跨越任意数量地理服务区对吞吐量与存储进行扩展。Azure Cosmos DB可立足第99百分位比例提升99.99%高可用性水平&#xff0c;提供可预测吞吐…

NOIP2018-普及总结

前言 原本说要去提高的&#xff0c;然后市里瞎搞&#xff0c;就去不了了QVQQVQQVQ。 总结 这次一看感觉题目比较难&#xff0c;所以基本凉凉… 首先这次有很多失误&#xff0c;特别是T2T2T2&#xff0c;其实很容易就分析出要用longlonglong\ \ longlong long的&#xff0c;但…

【博客】csdn搬家到wordpress

在wordpress的插件中搜索cnblogs2wp&#xff0c;安装后&#xff0c;在工具->导入->选博客搬家&#xff0c; 遇到了些问题 总是遇到博客地址不对 https://blog.csdn.net/weixin_43560272 首先修改了后缀 这是我的博客首页地址绝对没错的啊 后缀绝对改了的 总是说地址…

Microsoft加入量子计算的竞争

Microsoft在Ignite大会上宣布了自己的量子计算新平台的预览版&#xff0c;并公开了借助近期粒子物理学方面的进展推出拓扑量子计算机的计划。 Microsoft的量子计算平台预览版将包括一个量子计算模拟器&#xff0c;以及一种集成在Visual Studio中的量子计算编程新语言。据Micros…

Window系统多硬盘设置新引导盘

一、系统启动过程 电脑通电后&#xff0c;首先是启动BIOS程序&#xff0c;BIOS自检完毕后&#xff0c;找到硬盘上的主引导记录MBR&#xff0c;MBR读取DPT&#xff08;分区表&#xff09;&#xff0c;从中找出活动的主分区&#xff0c;然后读取活动主分区的PBR&#xff08;分区引…