NGINX+TOMCAT集群后SESSION的处理

单节点低负荷的情况下,我们通常把一个WEB应用打成WAR包放WEB应用服务器,如TOMCAT下运行就行了(如图1)。但随着用户量的增加,系统负载日益增长,这时我们通常就会采用多台WEB应用服务器组成集群来分担负荷(tomcat1, tomcat2上同时部署了应用application1; tomcat3上单独部署了应用application3),这时某一用户对同一应用的访问就有可能分配到从不同的TOMCAT访问这个应用(如图2, session1和session2同时访问application1)。假设我们的WEB访问请求都是无状态的,多个后台应用和一个后台应用的处理就没什么区别了,根据每次请求的参数进行相关逻辑处理就行。但通常我们会将用户信息,鉴权的数据等放入session中做用户鉴权, 用户状态数据等基础框架的处理,这时我们每次分配到WEB服务器后台的访问请求就需要记录session状态及数据了,确保每次用户访问,后台从session取出的数据是一致的。

到这里,我们已经可以清楚的看到,集群环境下,某一用户请求访问APPLICATION1,第一次请求被NGINX转发到TOMCAT1,产生了SESSION1,这时,APPLICATION1存了某一数据进SESSION1。随后,该用户进行第二次请求,这时,NGINX将该请求转发到TOMCAT2,这时TOMCAT2产生了一个新的SESSION2来访问APPLICTION1,如果这时APPLICTION1从SESSION中取刚存入的数据,因为SESSION2是TOMCAT2新产生的,并不是刚才存入数据的SESSION1,就会取不到我们想要的数据.

所以,很自然的,我们就想到需要保持session1和session2的一致性。

而保持session1和session2的一致性有两种很明显的方法,一种是保持session1和session2中的数据一致,二是让session1和session2成为一个session,即如果同一用户访问applcation1, tomcat1和tomcat2产生的是一个共享的session。下面就介绍下这两种处理方式.

1. TOMCAT间的 session复制。

顾名思义,就是把一台TOMCAT上session发生变更的时候, 将变更的数据分发给其他TOMCAT。如图3

tomcat间是以IP组播发送变更的数据,将数据发送到集群组的其他成员。这里,同一用户访问APPLICATION1的session数据互相有了同步,他们的数据是相同的,就用app1sesson表示。

配置方法是配置 conf/server.xml 文件中的 Manager ,Channel,以及WEB.XML的distributable 属性。 网上已有很多配置介绍,这里就不啰嗦了。

2. 采用 memcached session manager 共享session。

这里, tomcat1和tomcat2产生的session1和session2 在 session mananger 的管理下,都使用的是缓存中的共享session,访问应用时这样传到application1应用的session就是图中的共享session.

这种共享session方案可采用google的memcached session manager, 注意下载时对应TOMCAT版本。 它以memcached作为缓存,安装时所有tomcat节点需要安装memcached-session-manager。支持sticky session 和 non-sticky session。大概原理是当一个请求结束时,session会被送回Memcached进行备份。当下一次请求开始时,本地Session可用,直接服务,请求结束后,session又被送回Memcached备份。如果下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session的信息。此时它会从Memcached查找该Session,更新该Session并将其保存在本机内容。此次请求结束,session被修改,送回Memcached备份。如下图:

配置方法网上也有很多介绍,主要是修改 tomcat下 conf/server.xml, memcachedNodes可指定多个memcached节点, 逗号隔开。

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="n1:localhost:11211"
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;"
  sessionBackupAsync="false"
  sessionBackupTimeout="1800000"
  copyCollectionsForSerialization="false"
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

如是非粘性,配置 sticky="false":

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="n1:localhost:11211"
   sticky="false"
  requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;"
  sessionBackupAsync="false"
  lockingMode="uriPattern:/path1|/path2"
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

时间: 2024-11-06 22:16:30

NGINX+TOMCAT集群后SESSION的处理的相关文章

100513、nginx+tomcat集群+session共享(linux)

第一步:linux中多个tomcat安装和jdk安装(略) 第二步:nginx安装,linux中安装nginx和windows上有点不同也容易出错,需要编译,这里做介绍 一.安装依赖 gcc openssl-fips-2.0.2.tar.gz zlib-1.2.7.tar.gz pcre-8.21.tar.gz 下载linux版本的安装包,如果不下载安装包,可以在线安装命令: yum install gcc-c++ yum install -y pcre  pcre-devel yum inst

nginx+tomcat集群配置(1)---根目录设定和多后端分发配置

前言: 对于javaer而言, nginx+tomcat集群配置, 已然成了web应用部署的主流. 大公司如此, 小公司亦然. 对于个人开发者而言, 资源有限, 往往多个web应用混部于一台服务器(云主机), 如何隔离访问这些服务资源? 彼此又不影响呢? nginx来为你排忧解难, ^_^. 本文将介绍tomcat的简单配置和部署, 以及nginx作为反向代理, 如何分流. 基础架构: 不成文的约定: 1). 一个tomcat容器部署一个webapp应用实例 2). url根目录访问webapp

Nginx+Tomcat 集群部署

1.Nginx + Tomcat 集群部署 简单配置 1 #user nobody; 2 worker_processes 4;#工作进程的个数 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid; 9 10 11 events { 12 worker_connections 1024; #单个进程连

nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路

前言: nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便. 本文将简单讲述nginx的rewrite规则和原理, 同时讲解下如何借助rewrite实现单tomcat实例/多Web App服务 对应的多域名根目录访问. 案列目标: 首先来谈一下之前对于多Web App服务对应多域名根目录访问的方案. 注: 一个域名对应一个tomcat实例, 一个tomcat实例只包含

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知--一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离 前言 ? 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件.结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群. ? 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容. 一.集群搭建结构及拓扑 1.1集群架构图示 Nginx+Tomcat集群的结构示意图如下: 1.2系统环境与

Web应用优化之nginx+tomcat集群配置+redis管理session

1.nginx的安装 从官网下载一个nginx事务tar.gz版本,centos系统,安装好jdk 第一步解压 第二步:解压完成进入解压目录,执行./configure命令 需要安装gcc编译和pcre库,zlib库 yum -y install gcc yum install pcre-devel yum install zlib-devel ./configure完成后执行make install即可安装成功 2.集群配置流程 一.克隆2台CentOS虚拟机,并安装jdk+tomcat 二.

nginx+tomcat集群负载均衡(实现session复制)

转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat) 优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去 一,配置nginx 1,  下载包 Wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz ftp://ftp.

Nginx+tomcat集群使用redis共享session

一 :nginx负载均衡 当Tomcat当做独立的Servlet容器来运行时,可看做是能运行Java Servlet的独立Web服务器. 此外 Tomcat还可以作为其他Web服务器进程内或者进程外的Servlet容器,从而与其他Web服务器集成(Apache Nginx IIS 等) 集成的意义在于:对于不支持运行java Servlet的其他Web服务器,可以通过集成Tomcat来提供运行Servlet的功能. ----------Tomcat与JavaWeb开发技术详解(孙卫琴的一本书)

基于tomcat集群做session共享

前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomcat,请参考前面的文章) 首先查看下tomcat的webapps目录架构: [[email protected] tomcat-instance]# pwd/usr/local/tomcat-instance[[email protected] tomcat-instance]# ll总用量 24-