前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享。
建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,
不只是缓存 session ,还可以做其他用途,一举几得啊。

test url: http://sms.reyo.cn/session.jsp

1、使用 filter 方法存储
这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于 tomcat ,而且实现的原理比较简单容易控制。
可以使用 memcached-session-filter
官方网址:http://code.google.com/p/memcached-session-filter/
官方介绍:解决集群环境下java web容器session共享,使用filter拦截器和memcached实现。在tomcat 6和websphere 8测试通过,现网并发2000,日PV量1100万。
暂不支持session event包括create destory 和 attribute change
东西很不错,体积很小,不过这个东东要和 spring 一起使用,而且要求存储到 memcached 的对象要实现 java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
我将其简单扩展了一下,不再依赖 spring ,并且利用 javolution 实现序列化,缓存的对象不再有限制。
暂时没有发现 redis 的实现,后面将自己实现使用 redis 存储并且序列化使用 kyro ,详细情况有时间再单独写出来。

2、使用 tomcat session manager 方法存储
这种方法服务器只能使用 tomcat ,但网上有针对 memcached 和 redis 实现,直接配置就行了。
memcached 实现:
网址:http://code.google.com/p/memcached-session-manager/
修改 tomcat 的 conf 目录下的 context.xml 文件:
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"   
  memcachedNodes="n1:localhost:11211 n2:localhost:11212"   
  failoverNodes="n2"   
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"   
  sessionBackupAsync="false"   
  sessionBackupTimeout="100"   
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"   
  copyCollectionsForSerialization="false"    />

以上是以 1.3 版为例子,需要用的 jar 包:
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
javolution-5.4.3.1.jar
memcached-2.4.2.jar

redis 实现:
网址:https://github.com/jcoleman/tomcat-redis-session-manager
同样修改 tomcat 的 conf 目录下的 context.xml 文件:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost"
         port="6379"
         database="0"
         maxInactiveInterval="60"/>
以上是以 1.2 版为例子,需要用的 jar 包:
tomcat-redis-session-manager-1.2-tomcat-6.jar
jedis-2.1.0.jar
commons-pool-1.6.jar

3、使用 terracotta 服务器共享
这种方式配置有点复杂,大家到网上搜索一下吧。

以上配置成功后,前端使用 nginx 进行负载均衡就行了,同时使用 Gzip 压缩 和 静态文件缓存。

以下是实例:

一、nginx+tomcat+memcached  (依赖包下载)

1.memcached配置:(v1.4.13)

节点1(192.168.159.131:11444)

节点2(192.168.159.131:11333)

2.tomcat配置

tomcat1(192.168.159.128:8081)

tomcat2(192.168.159.128:8082)

3.nginx安装在192.168.159.131。

首先,是配置tomcat,使其将session保存到memcached上。有两种方法:

方法一:在server.xml中配置。

找到host节点,加入

<Context docBase="/var/www/html" path=""> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444 n2:192.168.159.131:11333" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" />
</Context>

方法二:在context.xml中配置。

找到Context节点,加入

 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" />

其次,配置nginx,用于测试session保持共享。

upstream  xxy.com  {server   192.168.159.128:8081 ;server   192.168.159.128:8082 ;
}log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request ''"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';server
{listen  80;server_name  xxy.com;location / {proxy_pass        http://xxy.com;proxy_set_header   Host             $host;proxy_set_header   X-Real-IP        $remote_addr;proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;}access_log  /data/base_files/logs/www.xy.log  www_xy_com;
}

最后,将你的应用放到两个tomcat中,并依次启动memcached、tomcat、nginx。访问你的nginx,可以发现两个tomcat中的session可以保持共享了。

二、nginx+tomcat+redis   (依赖包下载)

1.redis配置(192.168.159.131:16300)(v2.8.3)

2.tomcat配置

tomcat1(192.168.159.130:8081)

tomcat2(192.168.159.130:8082)

3.nginx安装在192.168.159.131。

首先,是配置tomcat,使其将session保存到redis上。有两种方法,也是在server.xml或context.xml中配置,不同的是memcached只需要添加一个manager标签,而redis需要增加的内容如下:(注意:valve标签一定要在manager前面。)

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"host="192.168.159.131"port="16300" database="0" maxInactiveInterval="60"/>

其次,配置nginx,用于测试session保持共享。

upstream  redis.xxy.com  {server   192.168.159.130:8081;server   192.168.159.130:8082;
}log_format  www_xy_com  '$remote_addr - $remote_user [$time_local] $request ''"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';server
{listen  80;server_name redis.xxy.com; location / {proxy_pass        http://redis.xxy.com;proxy_set_header   Host             $host;proxy_set_header   X-Real-IP        $remote_addr;proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;}access_log  /data/base_files/logs/redis.xxy.log  www_xy_com;
}

最后,将你的应用放到两个tomcat中,并依次启动redis、tomcat、nginx。访问你的nginx,可以发现两个tomcat中的session可以保持共享了。

上面文章中,有一点需要说明的是:

如果tomcat配置中,将manager放在server.xml中,那么使用maven做热部署时,会发生失败。所以,推荐放在context.xml中。

关于 tomcat 集群中 session 共享的三种方法相关推荐

  1. Nginx+Tomcat+Memcached实现tomcat集群和session共享

    Nginx+Tomcat+Memcached实现tomcat集群和session共享 [http://blog.csdn.net/shimiso/article/details/8979044] 为什 ...

  2. web集群时session同步的3种方法

    web集群时session同步的3种方法 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话 ...

  3. 通过memcached来实现对tomcat集群中Session的共享策略 .

    近期在做一套集群的实现,实现的方案是在Linux下完成对Apache + Tomcat 负载均衡的功能. 但是实现了该集群后,发现登陆系统后,每次都会被拦截回登录页面,造成该现象的原因是Session ...

  4. Tomcat集群及Session共享

    Tomcat集群 由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流行的做法就是通 ...

  5. Nginx+tomcat集群的session共享问题

    请求负载过程中会话信息不能丢失.那么需要在多个tomcat中session需要共享.所以需要进行相关问题的解决 配置Tomcat的session共享可以有三种解决方案: 第一种:是以负载均衡服务器本身 ...

  6. Tomcat集群和Session共享的配置方法

    Tomcat集群配置其实很简单,在Tomcat自带的文档中有详细的说明( /docs/cluster-howto.html ),只不过是英语的,对我这样的人来说很难懂 . 下面根据说下怎么配置吧: 第 ...

  7. MSM实现tomcat集群的session共享

    本文首发于我的个人网站: https://hewanyue.com/ 本文作者: Hechao 本文链接: https://hewanyue.com/blog/6254cc16.html 会话保持起源 ...

  8. 基于tomcat集群做session共享

    前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...

  9. PHP集群中SESSION共享方案之Redis

      我记得我之前有写过在PHP集群中使用memcached来共享SESSION的解决方法,其实redis还是一样!出差在外,咱就别太讲究了,码篇博客做为睡前甜点吧 搭建PHP集群的第一步就是设置负载均 ...

最新文章

  1. applet打包的MANIFEST.MF配置
  2. mysql什么时候用in,什么时候用exists
  3. ObjectArx开发对txt文本文件的操作一例
  4. 构造器是什么?(Java篇)
  5. Mysql带返回值与不带返回值的2种存储过程
  6. linux系统中变量,Linux系统中的环境变量知识详解
  7. R语言爬虫系列(1)XML抓取表格数据
  8. 有了它,你还想用postman吗
  9. 基础篇:6.4)形位公差-符号 Symbol
  10. 英文视频字幕自动生成
  11. 微信小程序开发者账号注册以及开发者工具的使用
  12. 使用电信光猫加路由器实现内网穿透,外网访问内网
  13. Apple MFi认证是什么意思?
  14. 基于风险平价的资产配置策略
  15. python函数由什么组成_python的函数
  16. neutron创建network执行的那些命令
  17. 近日我方收到大量用户QQ发送涉黄图低俗等文字,腾讯QQ回应疑似被盗号!
  18. ​《Python知识手册》更新到V4.1版
  19. linux使用命令重命名_如何在Linux上使用重命名命令
  20. 1、【WebGIS实战】系列介绍

热门文章

  1. phpcms调用栏目描述_phpcms标签整理_当前栏目调用
  2. cjson使用_LiteOS云端对接教程01-cJSON组件使用教程
  3. 讲解虚拟服务器的书_程序员不得不看的书
  4. 数据结构----数组与广义表专题
  5. php lararel,laravel整合tinymce和ckeditor编辑器,并用elfinder上传图片
  6. 自然语言处理期末复习(7)平行文本与机器翻译
  7. Vue中使用moment将时间戳数据格式化显示(el-table中)
  8. 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出
  9. WebService入门教程_HTTP协议学习
  10. 使用Cordova打包Vue项目为IOS并使用XCode提交到AppStore