此文档来源于http://www.cnblogs.com/lengfo/p/4260363.html,在其指导下做出,我只是在后续做出了部分补充。
一、前言
nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存、web server负载均衡等功能,由于其轻量级、高性能、高可靠等特点在互联网项目中有着非常普遍的应用,相关概念网上有丰富的介绍。分布式web server集群部署后需要实现session共享,针对 tomcat 服务器的实现方案多种多样,比如tomcat cluster session 广播、nginx IP hash策略、nginx sticky module等方案,本文主要介绍了使用redis 服务器进行 session 统一存储管理的共享方案。
二、构建 tomcat-redis-session-manager-master
? 由于源码构建基于 gradle,请先配置 gradle 环境。
? 从 github 获取 tomcat-redis-session-manager-master 源码,地址如下:https://github.com/jcoleman/tomcat-redis-session-manager
? 找到源码中的 build.gradle 文件,由于作者使用了第三方仓库(sonatype),需要注册帐号,太麻烦,注释后直接使用maven中央仓库,同时注释签名相关脚本并增加依赖包的输出脚本 copyJars(dist目录),修改后的 build.gradle 文件如下:
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'
group = 'com.orangefunction'
version = '2.0.0'
repositories {
mavenCentral()
}
compileJava {
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
dependencies {
compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'
compile group: 'redis.clients', name: 'jedis', version: '2.5.2'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2'
//compile group: 'commons-codec', name: 'commons-codec', version: '1.9'
testCompile group: 'junit', name: 'junit', version: '4.+'
testCompile 'org.hamcrest:hamcrest-core:1.3'
testCompile 'org.hamcrest:hamcrest-library:1.3'
testCompile 'org.mockito:mockito-all:1.9.5'
testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from 'build/docs/javadoc'
}
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
}
artifacts {
archives jar
archives javadocJar
archives sourcesJar
}
//signing {
// sign configurations.archives
//}
task copyJars(type: Copy) {
from configurations.runtime
into 'dist'
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
//repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
// authentication(userName: sonatypeUsername, password: sonatypePassword)
//}
//repository(url: "https://oss.sonatype.org/content/repositories/snapshots") {
// authentication(userName: sonatypeUsername, password: sonatypePassword)
//}
pom.project {
name 'tomcat-redis-session-manager'
packaging 'jar'
description 'Tomcat Redis Session Manager is a Tomcat extension to store sessions in Redis'
url 'https://github.com/jcoleman/tomcat-redis-session-manager'
issueManagement {
url 'https://github.com:jcoleman/tomcat-redis-session-manager/issues'
system 'GitHub Issues'
}
scm {
url 'https://github.com:jcoleman/tomcat-redis-session-manager'
connection 'scm:git:git://github.com/jcoleman/tomcat-redis-session-manager.git'
developerConnection 'scm:git:git@github.com:jcoleman/tomcat-redis-session-manager.git'
}
licenses {
license {
name 'MIT'
url 'http://opensource.org/licenses/MIT'
distribution 'repo'
}
}
developers {
developer {
id 'jcoleman'
name 'James Coleman'
email 'jtc331@gmail.com'
url 'https://github.com/jcoleman'
}
}
}
}
}
}
? 执行gradle命令构建源码,编译输出tomcat-redis-session-manager-master 及依赖jar包。
http://gradle.org/gradle-download/ 下载Binary on
[root@netron tomcat-redis-session-manager-master]# /root/gradle-2.11/bin/gradle build -x test copyJars
[root@netron tomcat-redis-session-manager-master]# ls dist/ -l
commons-pool2-2.2.jar ##需要拷贝到tomcat lib目录。
jedis-2.5.2.jar ##需要拷贝到tomcat lib目录。
tomcat-annotations-api-7.0.27.jar
tomcat-api-7.0.27.jar
tomcat-catalina-7.0.27.jar
tomcat-juli-7.0.27.jar
tomcat-servlet-api-7.0.27.jar
tomcat-util-7.0.27.jar
[root@netron tomcat-redis-session-manager-master]# ls build/libs/ -l
tomcat-redis-session-manager-master-2.0.0.jar ##需要拷贝到tomcat lib目录。
tomcat-redis-session-manager-master-2.0.0-javadoc.jar
tomcat-redis-session-manager-master-2.0.0-sources.jar
三、tomcat session manager 配置
修改配置使用 tomcat-redis-session-manager-master 作为 tomcat session 管理器
1、 分别将第三步生成的:tomcat-redis-session-manager-master-2.0.0.jar 及dist中的相应jar包覆盖到 tomcat 安装目录的 lib 文件夹。注意:全部放进去tomcat启动报错!!
2、分别修改2台 tomcat 的 context.xml 文件,使 tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。
context.xml 增加以下配置:
<Context>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost" ##redis服务器的地址
port="6379"
database="0"
maxInactiveInterval="60" />
</Context>
四、测试页面
在webapp中建立一个test文件夹,在文件夹中建立index.jsp页面,并且建立来模拟一个应用。
index.jsp页面内容如下:
1 #哪台服务器标示,随意写。
<%@page language="java"%>
<html>
<body>
<h1><font color="red">Session serviced by tomcat</font></h1>
<table aligh="center" border="1">
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
<% session.setAttribute("abc","abc");%>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
<html>
测试时将两台tomcat都启动,访问以下index.jsp页面出现一个session ID,关闭其中一台tomcat,如果session保持一致就说明成功了。
五、nginx代理配置
upstream tomcat { # 负载均衡站点的名称为tomcat,可以自己取
ip_hash;# 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
server 192.168.0.101:8080; # web服务器的IP地址及tomcat发布端口
server 192.168.0.101:8080;
}
server {
listen 80; # 站点侦听端口80
server_name localhost; # 站点名称
location / {
index index.jsp index.htm;
proxy_pass http://tomcat/test; # 负载均衡指向的发布服务tomcat
}
六、启动tomcat测试
启动所有的tomcat,访问测试页;首先关闭访问到的tomcat服务,然后刷新页面查看session ID是否改变,不变说明会话保持成功了。