一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败。要实现tomcat session共享有多种方案,今天介绍下使用tomcat自带的cluster方式,在多个tomcat节点间自动实时复制session信息,配置起来很简单。tomcat自带的这种session共享方案,对于规模较小的tomcat集群来说够用了,但这个方案的效率比较低,在大并发下表现并不好。所以大规模的tomcat集群还是建议使用memcache或者redis来实现session共享。

1)基础环境

  1. ip 主机名 应用 端口
  2. 192.168.10.200 Nginx-node nginx1.12.2 80
  3. 192.168.10.201 Tomcat-node1 java8.131tomcat8.0.53 8080
  4. 192.168.10.202 Tomcat-node2 java8.131tomcat8.0.53 8080
  5.  
  6. 下面操作在三台机器上同样执行:
  7. [root@Nginx-node ~]# cat /etc/redhat-release
  8. CentOS release 6.9 (Final)
  9.  
  10. 为了方便测试,关闭iptables防火墙和selinux。如果是生产环境,开启iptables后,需要开放对应的应用端口。
  11. [root@Nginx-node ~]# setenforce 0
  12. [root@Nginx-node ~]# getenforce
  13. disabled
  14. [root@Nginx-node ~]# cat /etc/sysconfig/selinux |grep "SELINUX=disabled"
  15. SELINUX=disabled
  16. [root@Nginx-node ~]# /etc/init.d/iptables stop
  17.  
  18. 本案例环境部署中所需的软件下载地址:https://pan.baidu.com/s/1732gmtRpVh1zY_i4H85Ecw
  19. 提取密码:ze9d
  20. 下载到服务器上的/usr/local/src目录下.另外:节点服务器的系统时间一定要保持一致!!

2)安装Nginx(在192.168.10.200机器上操作)

  1. [root@Nginx-node ~]# cd /usr/local/src/
  2. [root@Nginx-node src]# ll
  3. total 8920
  4. -rw-rw-r--. 1 root root 981687 Oct 27 2017 nginx-1.12.2.tar.gz
  5. -rw-rw-r--. 1 root root 5453234 Aug 23 2018 openssl-1.1.0i.tar.gz
  6. -rw-rw-r--. 1 root root 2081413 Aug 23 2018 pcre-8.42.tar.gz
  7. -rw-rw-r--. 1 root root 607698 Jan 16 2017 zlib-1.2.11.tar.gz
  8.  
  9. 安装依赖包
  10. [root@Nginx-node src]# yum -y install gcc gcc-c++
  11.  
  12. 安装pcre
  13. [root@Nginx-node src]# tar -zvxf pcre-8.42.tar.gz
  14. [root@Nginx-node src]# cd pcre-8.42
  15. [root@Nginx-node pcre-8.42]# ./configure && make && make install
  16.  
  17. 安装zlib
  18. [root@Nginx-node pcre-8.42]# cd /usr/local/src/
  19. [root@Nginx-node src]# tar -zvxf zlib-1.2.11.tar.gz
  20. [root@Nginx-node src]# cd zlib-1.2.11
  21. [root@Nginx-node zlib-1.2.11]# ./configure && make && make install
  22.  
  23. 安装openssl
  24. [root@Nginx-node zlib-1.2.11]# cd /usr/local/src/
  25. [root@Nginx-node src]# tar -zvxf openssl-1.1.0i.tar.gz
  26. [root@Nginx-node src]# cd openssl-1.1.0i
  27. [root@Nginx-node openssl-1.1.0i]# ./config && make && make install
  28.  
  29. 安装nginx,特别注意要指定prce zlib openssl原码包位置
  30. [root@Nginx-node openssl-1.1.0i]# cd /usr/local/src/
  31. [root@Nginx-node src]# tar -zvxf nginx-1.12.2.tar.gz
  32. [root@Nginx-node src]# cd nginx-1.12.2
  33. [root@Nginx-node nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.42 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0i
  34. [root@Nginx-node nginx-1.12.2]# make && make install
  35.  
  36. 安装成功后配置nginx
  37. [root@Nginx-node nginx-1.12.2]# cd /usr/local/nginx/conf/
  38. [root@Nginx-node conf]# cp nginx.conf nginx.conf.bak
  39. [root@Nginx-node conf]# cat nginx.conf
  40. #user nobody;
  41. worker_processes 8;
  42.  
  43. #error_log logs/error.log;
  44. #error_log logs/error.log notice;
  45. #error_log logs/error.log info;
  46.  
  47. #pid logs/nginx.pid;
  48.  
  49. worker_rlimit_nofile 65535;
  50. events {
  51. use epoll;
  52. worker_connections 65535;
  53. }
  54.  
  55. http {
  56. include mime.types;
  57. default_type application/octet-stream;
  58. charset utf-8;
  59.  
  60. ######
  61. ## set access log format
  62. ######
  63. log_format main '$http_x_forwarded_for $remote_addr $remote_user [$time_local] "$request" '
  64. '$status $body_bytes_sent "$http_referer" '
  65. '"$http_user_agent" "$http_cookie" $host $request_time';
  66.  
  67. #######
  68. ## http setting
  69. #######
  70. sendfile on;
  71. tcp_nopush on;
  72. tcp_nodelay on;
  73. keepalive_timeout 65;
  74. fastcgi_connect_timeout 30000;
  75. fastcgi_send_timeout 30000;
  76. fastcgi_read_timeout 30000;
  77. fastcgi_buffer_size 256k;
  78. fastcgi_buffers 8 256k;
  79. fastcgi_busy_buffers_size 256k;
  80. fastcgi_temp_file_write_size 256k;
  81. fastcgi_intercept_errors on;
  82.  
  83. ##cache##
  84. client_header_timeout 60s;
  85. client_body_timeout 60s;
  86. client_max_body_size 10m;
  87. client_body_buffer_size 1m;
  88. proxy_connect_timeout 5;
  89. proxy_read_timeout 60;
  90. proxy_send_timeout 5;
  91. proxy_buffer_size 64k;
  92. proxy_buffers 4 128k;
  93. proxy_busy_buffers_size 128k;
  94. proxy_temp_file_write_size 1m;
  95. proxy_temp_path /home/temp_dir;
  96. proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
  97. ##end##
  98.  
  99. gzip on;
  100. gzip_min_length 1k;
  101. gzip_buffers 4 16k;
  102. gzip_http_version 1.1;
  103. gzip_comp_level 9;
  104. gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
  105. gzip_vary on;
  106.  
  107. ## includes vhosts
  108. include vhosts/*.conf;
  109. }
  110.  
  111. [root@Nginx-node conf]# mkdir vhosts
  112. [root@Nginx-node conf]# cd vhosts/
  113. [root@Nginx-node vhosts]# vim lb_tomcat.conf
  114. upstream tomcat-lb {
  115. server 192.168.10.201:8080;
  116. server 192.168.10.202:8080;
  117. }
  118.  
  119. server {
  120. listen 80;
  121. server_name www.kevin.com;
  122. location / {
  123. proxy_pass http://tomcat-lb;
  124. proxy_set_header X-Real-IP $remote_addr;
  125. proxy_set_header REMOTE-HOST $remote_addr;
  126. proxy_set_header Host $host;
  127. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  128. }
  129. location ~ .*\.(gif|jpg|png|htm|html|css|ico|flv|swf)(.*) {
  130. proxy_pass http://tomcat-lb;
  131. proxy_redirect off;
  132. proxy_set_header Host $host;
  133. proxy_cache cache_one;
  134. proxy_cache_valid 200 302 1h;
  135. proxy_cache_valid 301 1d;
  136. proxy_cache_valid any 10m;
  137. expires 30d;
  138. proxy_cache_key $host$uri$is_args$args;
  139. }
  140. }
  141.  
  142. [root@Nginx-node vhosts]# /usr/local/nginx/sbin/nginx -t
  143. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  144. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  145. [root@Nginx-node conf]# /usr/local/nginx/sbin/nginx
  146. [root@Nginx-node conf]# lsof -i:80
  147. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  148. nginx 25292 root 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  149. nginx 25293 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  150. nginx 25294 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  151. nginx 25295 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  152. nginx 25296 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  153. nginx 25297 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  154. nginx 25298 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  155. nginx 25299 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  156. nginx 25300 nobody 6u IPv4 19679665 0t0 TCP *:http (LISTEN)
  157.  
  158. 将域名www.kevin.com解析到192.168.10.200上,访问http://www.kevin.com,发现访问请求结果会负载到192.168.10.201和192.168.10.202的tomcat上了。

3)安装tomcat(在192.168.10.201和192.168.10.202两台机器上操作)

  1. 安装java8环境。先卸载掉系统自带的java7,然后安装java8
  2. [root@Tomcat-node1 ~]# java -version
  3. java version "1.7.0_131"
  4. OpenJDK Runtime Environment (rhel-2.6.9.0.el6_8-x86_64 u131-b00)
  5. OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)
  6. [root@Tomcat-node1 ~]# yum -y remove java-1.7.0-openjdk*
  7. [root@Tomcat-node1 ~]# yum -y remove tzdata-java.noarch
  8. [root@Tomcat-node1 ~]# java -version
  9. -bash: /usr/bin/java: No such file or directory
  10.  
  11. [root@Tomcat-node1 ~]# ll /usr/local/src/jdk-8u131-linux-x64_.rpm
  12. -rw-rw-r--. 1 root root 169983496 Nov 19 2017 /usr/local/src/jdk-8u131-linux-x64_.rpm
  13. [root@Tomcat-node1 ~]# rpm -ivh /usr/local/src/jdk-8u131-linux-x64_.rpm --force
  14. [root@Tomcat-node1 ~]# vim /etc/profile
  15. ......
  16. JAVA_HOME=/usr/java/jdk1.8.0_131
  17. JAVA_BIN=/usr/java/jdk1.8.0_131/bin
  18. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/sbin/
  19. CLASSPATH=.:/lib/dt.jar:/lib/tools.jar
  20. export JAVA_HOME JAVA_BIN PATH CLASSPATH
  21.  
  22. [root@Tomcat-node1 ~]# source /etc/profile
  23. [root@Tomcat-node1 ~]# java -version
  24. java version "1.8.0_131"
  25. Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
  26. Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
  27. You have new mail in /var/spool/mail/root
  28.  
  29. 安装配置tomcat8
  30. [root@Tomcat-node1 ~]# cd /usr/local/src/
  31. [root@Tomcat-node1 src]# ll apache-tomcat-8.0.53.tar.gz
  32. -rw-rw-r--. 1 root root 9472492 Nov 9 2017 apache-tomcat-8.0.53.tar.gz
  33. [root@Tomcat-node1 src]# tar -zvxf apache-tomcat-8.0.53.tar.gz
  34. [root@Tomcat-node1 src]# mv apache-tomcat-8.0.53 /usr/local/tomcat8
  35.  
  36. 现在开始进行tomcat自带cluster方式的session共享配置:
  37. [root@Tomcat-node1 ~]# cd /usr/local/tomcat8/conf/
  38. [root@Tomcat-node1 conf]# cp server.xml server.xml.bak
  39. [root@Tomcat-node1 conf]# vim server.xml
  40. .......
  41. <Engine name="Catalina" defaultHost="localhost">
  42.  
  43. 找到上面这一行,在此行的下面直接复制以下内容,不用修改,直接复制就可以
  44. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
  45. channelSendOptions="6">
  46.  
  47. <Manager className="org.apache.catalina.ha.session.BackupManager"
  48. expireSessionsOnShutdown="false"
  49. notifyListenersOnReplication="true"
  50. mapSendOptions="6"/>
  51.  
  52. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  53. <Membership className="org.apache.catalina.tribes.membership.McastService"
  54. address="228.0.0.4"
  55. port="45564"
  56. frequency="500"
  57. dropTime="3000"/>
  58. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  59. address="192.168.10.201"
  60. port="5000"
  61. selectorTimeout="100"
  62. maxThreads="6"/>
  63.  
  64. <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  65. <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
  66. </Sender>
  67. <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
  68. <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  69. <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
  70. </Channel>
  71.  
  72. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
  73. filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
  74.  
  75. <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
  76. tempDir="/tmp/war-temp/"
  77. deployDir="/tmp/war-deploy/"
  78. watchDir="/tmp/war-listen/"
  79. watchEnabled="false"/>
  80.  
  81. <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
  82. </Cluster>
  83.  
  84. 记得多个tomcat都需要配置,同一个集群里面配置信息保持一直就可以了。如果是其他集群,修改一下address就好了。
  85. 另一个tomcat节点直接拷贝这个server.xml文件,然后将address修改为192.168.10.202就可以了
  86.  
  87. ==================================================================================================
  88. 配置好的server.xml可以直接使用,下载地址: https://pan.baidu.com/s/14Lgq97pyB_XLLu9j_CHtuw
  89. 提取密码:mrz4
  90. ==================================================================================================
  91.  
  92. 然后还有一个重要配置不要忘记了!否则session将不能实现共享!!
  93. tomcat项目的WEB-INF/web.xml文件中添加<distributable/>.
  94. [root@Tomcat-node1 ~]# cd /usr/local/tomcat8/webapps/ROOT/WEB-INF/ #两台tomcat节点都要修改
  95. [root@Tomcat-node1 WEB-INF]# ls
  96. web.xml
  97. [root@Tomcat-node1 WEB-INF]# vim web.xml #直接在底部</web-app>的前面添加既可以
  98. .......
  99. <distributable/>
  100.  
  101. 编写一个测试页面(直接修改index.jsp文件):
  102. [root@Tomcat-node1 ~]# cat /usr/local/tomcat8/webapps/ROOT/index.jsp
  103. <html>
  104. <head>
  105. <title> session test</title>
  106. </head>
  107. <body>
  108. SessionID is <%=session.getId()%>
  109. <BR>
  110. SessionIP is <%=request.getServerName()%>
  111. <BR>
  112. SessionPort is <%=request.getServerPort()%>
  113. <%
  114. out.println("Response from tomcat-node1");
  115. %>
  116. %</body>
  117. %</html>
  118.  
  119. 另一个tomcat2节点的测试内容:
  120. [root@Tomcat-node2 ~]# cat /usr/local/tomcat8/webapps/ROOT/index.jsp
  121. <html>
  122. <head>
  123. <title> session test</title>
  124. </head>
  125. <body>
  126. SessionID is <%=session.getId()%>
  127. <BR>
  128. SessionIP is <%=request.getServerName()%>
  129. <BR>
  130. SessionPort is <%=request.getServerPort()%>
  131. <%
  132. out.println("Response from tomcat-node2");
  133. %>
  134. %</body>
  135. %</html>
  136.  
  137. 然后重启两个节点的tomcat服务:
  138.  
  139. 启动tomcat
  140. [root@Tomcat-node1 src]# /usr/local/tomcat8/bin/startup.sh
  141. Using CATALINA_BASE: /usr/local/tomcat8
  142. Using CATALINA_HOME: /usr/local/tomcat8
  143. Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
  144. Using JRE_HOME: /usr/java/jdk1.8.0_131
  145. Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
  146. Tomcat started.
  147. You have new mail in /var/spool/mail/root
  148. [root@Tomcat-node1 src]# ps -ef|grep tomcat
  149. root 8477 1 87 03:11 pts/0 00:00:03 /usr/java/jdk1.8.0_131/bin/java -Djava.util.logging.config.file=/usr/local/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat8 -Dcatalina.home=/usr/local/tomcat8 -Djava.io.tmpdir=/usr/local/tomcat8/temp org.apache.catalina.startup.Bootstrap start
  150. root 8528 6829 0 03:11 pts/0 00:00:00 grep tomcat
  151. [root@Tomcat-node1 src]# lsof -i:8080
  152. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  153. java 8477 root 49u IPv6 12974768 0t0 TCP *:webcache (LISTEN)

4) Session共享测试
访问http://www.kevin.com,不断刷新页面,发现页面信息会改变,但是SessionID一直保持不变!! 
关闭192.168.10.201或192.168.10.202两个中的任意一个tomcat服务,访问页面,不断刷新,SessionID都会一直保持不变!! 

Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录的更多相关文章

  1. Redis Cluster高可用集群在线迁移操作记录【转】

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  2. nginx+keepalived+tomcat+memcache实现双VIP高可用及Session会话保持

    Nginx+Keepalived+Tomcat+Memcached 实现双VIP负载均衡及Session会话保持 IP 信息列表: 名称         IP                      ...

  3. Redis Cluster高可用集群在线迁移操作记录

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  4. Session会话保持机制的原理与Tomcat Session共享的几种实现方式(Session Cluster、memcached+MSM)

    一.Session的定义 在计算机科学中,特别是在网络中,session是两个或更多个通信设备之间或计算机和用户之间的临时和交互式信息交换.session在某个时间点建立,然后在之后的某一时间点拆除. ...

  5. Apache和Tomcat 配置负载均衡(mod-proxy方式)-粘性session

    Tomcat集群配置后端Tomcat Server为支持AJP的独立服务,前端Apache配置为粘性会话(sticky-session),Tomcat不配置Cluster配置和Session复制. 配 ...

  6. 在Tomcat下部属项目三种方式:

    在Tomcat下部属项目三种方式:       1直接复制:       2. 通过配置虚拟路径的方式    直接修改配置文件 写到tomcat/conf/server.xml     找到<H ...

  7. tomcat部署应用的几种方式

    接着上篇 tomcat配置详解,再来学习下如何在tomcat下部署应用 1.部署方式 第一种,最常用,直接把WAR包或者文件夹直接放到webapps目录下面,这时访问路径就是WAR包或者文件夹的名称. ...

  8. 网站开发进阶(一)Tomcat域名或IP地址访问方式配置方法

    Tomcat域名或IP地址访问方式配置方法 1.配置www.***.com域名方式访问 在Tomcat下面配置域名(如:www.***.com)的时候,同时又不希望客户通过我们网站的IP或者域名访问到 ...

  9. apache+tomcat负载均衡3种实现方式

    1.首先安装apache,编译完成后,通过IP:端口就行访问,如果返回“it workers”证明Apache启动成功(注意apache的工程路径要正确) 2.下载JK,下载地址为http://mir ...

随机推荐

  1. 洗礼灵魂,修炼python(61)--爬虫篇—【转载】requests模块

    requests 1.简介 Requests 是用Python语言编写的第三方库,所以你需要pip安装,安装过程就略过了.它基于urllib,采用 Apache2 Licensed 开源协议的 HTT ...

  2. python第三十一天-----类的封装、继承,多态.....

    封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. cla ...

  3. MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化

    MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...

  4. 视频截图Util

    ​​ VideoToPicUtil.java package com.zhwy.util; import java.io.File; import java.util.ArrayList; impor ...

  5. [cb]扩展Hierarchy 添加二级菜单

    目地 这篇博客教大家如何扩展Hierarchy 默认的Hierarchy 在Unity的Edior编辑器中,默认的Hierarchy如下 扩展的Hierarchy 扩展示例 MyInitOnLoad脚 ...

  6. [HDFS_4] HDFS 的 Java 应用开发

    0. 说明 在 IDEA下 进行 HDFS 的 Java 应用开发 通过编写代码实现对 HDFS 的增删改查操作 1. 流程 1.1 在项目下新建 Moudle 略 1.2 为 Moudle 添加 M ...

  7. [SequenceFile_1] Hadoop 序列文件

    1. 关于 SequenceFile 对于日志文件来说,纯文本不适合记录二进制类型数据,通过 SequenceFile 为二进制键值对提供了持久的数据结构,将其作为日志文件的存储格式时,可自定义键(L ...

  8. 05LaTeX学习系列之---TeX的命令行操作

    目录 目录 前言 (一)查看版本号 1.查看TeX的版本号 2.查看LaTeX的版本号 3.查看XeLeTeX的版本号 (二)更行版本 (三)用命令行来编译.tex文件 1.用LaTeX编译 2.用X ...

  9. Alpha冲刺! Day10 - 砍柴

    Alpha冲刺! Day10 - 砍柴 今日已完成 晨瑶:处理一些杂碎: 反思. 昭锡:主页添加时间选择器,实现随机分布的光点与数据绑定. 永盛:定下来了 MVC 的许多东西,完成 Router 的样 ...

  10. golang的一些基础数据类型转换

    int -- string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_ ...