原理介绍
什么是Session/Cookie
用户使用网站的服务,基本上需要浏览器与Web服务器的多次交互。HTTP协议本身是无状态的,当用户的第一次访问请求结束后,后端服务器就无法知道下一次来访问的还是不是上次访问的用户。我们需要基于HTTP协议支持会话状态的机制,这样的机制可以使Web服务器从多次单独的HTTP请求中知道哪些请求是来自哪个会话的。
这种架构的主要目的是 如果我们在一个网站上登录了账号和密码,登录成功的信息存放在后端服务器A上,那么如果我们刷新后,将会登录到服务器B上 这个时候,我们需要重新登录,如果做了session共享后,登录信息会缓存到redis中,我们就不需要重新登录了。登录的信息状态会进行缓存。
Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。
环境准备
以下环境均为centos7
以下实验仅用于tomcat7、jdk7 (tomcat8见末尾)
nginx: 10.3.145.14
tomcat1: 10.3.145.58 多实例
redis: 10.3.145.55
nginx配置
nginx 反向代理,7层负载均衡配置upstream代理
配置文件中添加下列部分
vim /etc/nginx/nginx.conf
http {
upstream webapp {
server 10.3.145.58:8080 weight=1 max_fails=1 fail_timeout=2s;
server 10.3.145.58:8081 weight=1 max_fails=1 fail_timeout=2s;
}
server {
location / {
proxy_pass http://webapp;
}
}
配置两台tomcat轮循
tomcat配置
2-1.将jar包拷至lib目录(两台tomcat一样)
2-2.修改配置文件(两台tomcat一样)
# vim conf/context.xml (写在<Context>标签中)
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
password="redis-password"
maxInactiveInterval="1200"/>
Redis集群配置方式
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
maxInactiveInterval="60"
password="redis-password"
sentinelMaster="mymaster"
sentinels="127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381,127.0.0.1:26382"
/>
制作测试网页
cat webapps/ROOT/index.jsp
<html>
<body bgcolor="green"> <center> #这一部分两台tomcat可设计成不同的颜色以区分
<%= request.getSession().getId() %>
<h1>Tomcat 1</h1> #这一部分两台tomcat可以是不同的内容以区分
</body>
</html>
cat webapps/ROOT/index.jsp
<html>
<body bgcolor=""> <center> #这一部分两台tomcat可设计成不同的颜色以区分
<%= request.getSession().getId() %>
<h1>Tomcat 2</h1> #这一部分两台tomcat可以是不同的内容以区分
</body>
</html>
启动服务
redis配置
安装
# tar xf redis-4.0.8.tar.gz -C /usr/local/
# cd /usr/local/redis-4.0.8/
# make
配置
# vim redis.conf #将监听地址改为0.0.0.0
启动服务
# ./src/redis-server redis.conf &
关于TOMCAT8
[老方式](jcoleman/tomcat-redis-session-manager)
[新方式](mrhop/tomcat-redis-session-manager-8.5)
ps. 原作者已经停止更新,我们找到了新的方法重新编译新的包,其他的两个jar文件不需要改动。
gradle编译tomcat-redis-session-manager
[root@tomcat ~]# wget -N https://services.gradle.org/distributions/gradle-2.9-all.zip
[root@tomcat ~]# mkdir /opt/gradle
[root@tomcat ~]# unzip gradle-2.9-all.zip
[root@tomcat ~]# mv gradle-2.9 /opt/gradle/
[root@tomcat ~]# ln -sfn /opt/gradle/gradle-2.9 /opt/gradle/latest
[root@tomcat ~]# echo "export GRADLE_HOME=/opt/gradle/latest" > /etc/profile.d/gradle.sh
[root@tomcat ~]# echo "export PATH=\$PATH:\$GRADLE_HOME/bin" >> /etc/profile.d/gradle.sh
[root@tomcat ~]# . /etc/profile.d/gradle.sh
# 查看gradle版本
[root@tomcat ~]# gradle -v
------------------------------------------------------------
Gradle 2.9
------------------------------------------------------------
Build time: 2015-11-17 07:02:17 UTC
Build number: none
Revision: b463d7980c40d44c4657dc80025275b84a29e31f
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.8.0_144 (Oracle Corporation 25.144-b01)
OS: Linux 3.10.0-693.5.2.el7.x86_64 amd64
```
编译并打包tomcat-redis-session-manager
```shell
1. 克隆fork作者的源码
[root@tomcat ~]# git clone mrhop/tomcat-redis-session-manager-8.5
[root@tomcat ~]# cd tomcat-redis-session-manager-8.5-master
2. 修改配置
[root@tomcat ~]# vim build.gradle
**************************************
修改以下内容
"""
version = '2.0.0-8.5.32'
dependencies {
compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '8.5.32'
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.4.2'
"""
# 执行$CATALINA_BASE/bin/version.sh查看tomcat版本,我这里是8.5.50
# jedis,我这边下载的版本是2.7.3
# commons-pool2,我这边使用的版本是2.4.2
**************************************
3. 编译并打包
[root@tomcat ~]# gradle jar
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
BUILD SUCCESSFUL
Total time: 5.55 secs
This build could be faster, please consider using the Gradle Daemon: Chapter 18. The Gradle Daemon
```
编译完成
[root@tomcat ~]# ls build/libs/
tomcat-redis-session-manager-8.5-2.0.0-8.5.5.jar
讲上面的包和其他的两个jar包放在tomcat的lib目录下