Tomcat集群使用redis实现session共享

准备

本文对Redis做session共享的方案进行验证。使用一个Apache服务器与两个tomcat服务器搭建负载均衡。

打包Tomcat-Redis-Session

  1. 下载源码 https://github.com/jcoleman/tomcat-redis-session-manager

  2. 新建maven工程。

  3. 修改pom.xml文件。

    添加依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.3</version>
    </dependency>
    <dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-catalina</artifactId>
    <version>7.0.27</version>
    </dependency>

    使用JDK1.7

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <build>
    <plugins>
    <!-- compiler插件, 设定JDK版本 -->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.7</source>
    <target>1.7</target>
    <encoding>UTF-8</encoding>
    <showWarnings>true</showWarnings>
    </configuration>
    </plugin>
    </plugins>
    </build>
  4. 导入源码, 打包得到tomcat-redis-session.jar

    将上面下载下来的源码包中的src,拷贝到工程中的相应位置。

    1
    mvn clean package -Dmaven.test.skip=true

获取其它依赖包

下载jedis-2.7.3.jar 和commons-pool2-2.4.1.jar

配置Tomcat

准备n台tomcat。

添加jar包

将上面得到的tomcat-redis-session.jarjedis-2.7.3.jarcommons-pool2-2.4.1.jar放入到tomcat目录下的lib/目录下。

配置端口

如果n台tomcat部署在同一台机器上,为避免端口占用,就要修改conf/server.xml中的端口:SHUTDOWN端口,HTTP端口,AJP端口。

这里的两台tomcat的端口如下:

  • HTTP: 8081 – AJP: 8009
  • HTTP: 8080 – AJP: 8019

配置context.xml文件

修改每台tomcat的conf/context.xml文件,在Context节点中按实际情况添加如下配置。

1
2
3
4
5
6
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="app.coracle.com"
port="6379"
database="0"
maxInactiveInterval="60" />

配置Apache

这里使用的Apache2.4.x。

配置httpd.conf

修改Apache目录下的conf/httpd.conf,

  1. 打开proxy, banlancer相关的模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so
    LoadModule proxy_express_module modules/mod_proxy_express.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    LoadModule proxy_html_module modules/mod_proxy_html.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_http2_module modules/mod_proxy_http2.so
    LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

    LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

    LoadModule speling_module modules/mod_speling.so
    LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
    LoadModule xml2enc_module modules/mod_xml2enc.so
  2. 配置VirtualHost

    httpd.conf文件中取消下行的注释

    1
    Include conf/extra/httpd-vhosts.conf

    修改conf/extra/httpd-vhosts.conf

    根据实际情况添加下面的VirtualHost

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #虚拟机配置,负载均衡配置  注意空格
    <VirtualHost *:80>
    DocumentRoot "d:/Apache24/htdocs"
    ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
    ProxyPassReverse / balancer://cluster/
    ErrorLog "logs/error-tung.log"
    CustomLog "logs/access-tung.log" common
    </VirtualHost>

    #The ProxyRequests directive should usually be set off when using ProxyPass.
    ProxyRequests Off
    <proxy balancer://cluster>
    BalancerMember ajp://localhost:8009 loadfactor=1 smax=5 max=20 ttl=120 retry=300 timeout=15
    BalancerMember ajp://localhost:8019 loadfactor=1 smax=5 max=20 ttl=120 retry=300 timeout=15
    ProxySet lbmethod=byrequests
    </proxy>
  3. 重启apache

导入项目

为了验证sessionid是否相同,只需新建一个最简单的web工程,然后在某个jsp中输出如下内容即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8"/>
<title>xxx</title>
</head>
<body>
This is 8081 : <br>
<%
HttpSession ss = request.getSession();
out.print(ss.getId());
%>
</body>
</html>

Tomcat集群使用redis实现session共享
http://www.tung7.com/茶话闲谈/tomcat_redis_session_share.html
Author
Tung
Posted on
September 3, 2016
Licensed under