nginx、tomcat、redis配置sesion共享
by:白马公园/naritech
本文只涉及方案的可用性,对各组件的性能优化不做讨论
一、 系统结构
全系统包括三台服务器,均为虚拟机,安装Centos6.5操作系统,其中
hadoop01 192.168.75.88 安装tomcat,简称tomcat1
hadoop02 192.168.75.89 安装tomcat,简称tomcat2
hadoop03 192.168.75.90 安装nginx及redis
客户机以浏览器方式访问,故不列入系统
二、 nginx的安装及配置
安装nginx需要首先编译源码,编译源码的前提是操作系统已经安装了gcc编译器,如
果操作系统已经安装gcc编译器,则可跳过下面的gcc安装步骤,否则需要安装gcc
gcc的安装
Centos6.5系统光盘中已经带有gcc4.4.7的安装程序,可以直接安装,但是安装gcc4.4.7需要首先安装一些依赖包,需要按照下面步骤逐一安装
[root@hadoop03 ~]# cd /media/CentOS_6.5_Final/Packages/ //进入操作系统自带光盘镜像
[root@hadoop03 Packages]# rpm -ivh kernel-headers-2.6.32-431.el6.x86_64.rpm //安装gcc依赖的软件包
warning: kernel-headers-2.6.32-431.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package kernel-headers-2.6.32-431.el6.x86_64 is already installed
[root@hadoop03 Packages]# rpm -ivh glibc-headers-2.12-1.132.el6.x86_64.rpm //安装gcc依赖的软件包
warning: glibc-headers-2.12-1.132.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package glibc-headers-2.12-1.132.el6.x86_64 is already installed
[root@hadoop03 Packages]# rpm -ivh glibc-devel-2.12-1.132.el6.x86_64.rpm //安装gcc依赖的软件包
warning: glibc-devel-2.12-1.132.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package glibc-devel-2.12-1.132.el6.x86_64 is already installed
[root@hadoop03 Packages]# rpm -ivh libgomp-4.4.7-4.el6.x86_64.rpm //安装gcc依赖的软件包
warning: libgomp-4.4.7-4.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package libgomp-4.4.7-4.el6.x86_64 is already installed
[root@hadoop03 Packages]# rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm //安装gcc依赖的软件包
warning: ppl-0.10.2-11.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:ppl ########################################### [100%]
[root@hadoop03 Packages]# rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm //安装gcc依赖的软件包
warning: cloog-ppl-0.15.7-1.2.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:cloog-ppl ########################################### [100%]
[root@hadoop03 Packages]# rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm //安装gcc依赖的软件包
warning: mpfr-2.4.1-6.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:mpfr ########################################### [100%]
[root@hadoop03 Packages]# rpm -ivh cpp-4.4.7-4.el6.x86_64.rpm //安装gcc依赖的软件包
warning: cpp-4.4.7-4.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:cpp ########################################### [100%]
[root@hadoop03 Packages]# rpm -ivh gcc-4.4.7-4.el6.x86_64.rpm //安装gcc依赖的软件包
warning: gcc-4.4.7-4.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
1:gcc ########################################### [100%]
至此,gcc安装完成,可以在终端输入gcc命令确认安装成功,如安装正确,终端将显示:没有输入文件
PCRE库的安装
[root@hadoop03 ~]# cd /media/CentOS_6.5_Final/Packages/ //进入操作系统自带光盘镜像
[root@hadoop03 Packages]# rpm -ivh pcre-devel-7.8-6.el6.x86_64.rpm //安装pcre库
ZLIB库的安装
[root@hadoop03 ~]# cd /media/CentOS_6.5_Final/Packages/ //进入操作系统自带光盘镜像
[root@hadoop03 Packages]# rpm -ivh zlib-devel-1.2.3-29.el6.x86_64.rpm //安装zlib库
nginx的下载
在http://nginx.org/en/download.html,可以选择合适的版本下载nginx,这里选择1.8.1
下载后文件为nginx-1.8.1.tar.gz,将其上传到hadoop03,使用tar xvfz nginx-1.8.1.tar.gz –C /users/oracle/将其解压到/users/oracle目录下
nginx的编译(普通用户)
在/users/oracle/nginx-1.8.1路径下输入命令./configure –prefix=/users/oracle/nginx进行配置,指定了安装路径为/users/oracle/nginx,接下来输入make,进行编译,编译完成之后输入make install,进行安装
nginx的配置
进入/users/oracle/nginx/conf目录,对nginx.conf进行编辑,在server条目中增加
upstream tomcat_server {
server hadoop01:8080 weight=2
server hadoop02:8080 weight=2
} //向nginx指定了转发目的的tomcat服务器的地址、端口及转发权重
将listen 80 改成8080 以方便在普通用户下可以启动nginx
在location中增加proxy_pass http://tomcat_server;该行配置指定nginx将所有请求转发以http方式转发给tomcat_server服务群
nginx的启动
在/users/oracle/nginx/sbin下键入nginx即可启动nginx,可以使用ps –ef|grep nginx命令确认进程已经启动
自此,nginx安装全部完成
三、 redis的安装及配置
在http://redis.io/download可以下载redis3.2.1,下载后文件redis-3.2.1.tar.gz。将其上
传到hadoop03服务器上的/users/oracle/下,然后解压得到redis3.2.1目录。安装redis需要首先编译源码,编译源码的前提是操作系统已经安装了gcc编译器,安装gcc编译器的方法前已述及。此外,还需要安装tcl库,下面介绍安装方法
tcl8.5库的安装
[root@hadoop03 ~]# cd /media/CentOS_6.5_Final/Packages/ //进入操作系统自带光盘镜像
[root@hadoop03 Packages]# rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm //安装tcl8.5库
redis的编译(普通用户)
/users/oracle/redis3.2.1/src下,键入make test,测试需要的依赖库,测试通过
/users/oracle/redis3.2.1/src下,键入make PREFIX=/users/oracle/redis3.2.1 install
redis的配置
cp /users/oracle/redis3.2.1/redis.conf /users/oracle/redis3.2.1/bin/
修改/users/oracle/redis3.2.1/bin/redis.conf文件
bind 127.0.0.1 修改为bind 0.0.0.0
protected-mode yes 修改为 no
redis的启动
/users/oracle/redis3.2.1/bin目录下,执行redis-server ./redis.conf &
自此,redis单机版安装完成
四、 tomcat的安装及启动
tomcat的安装
1、 下载tomcat,可以到http://tomcat.apache.org下载对应的tomcat
2、 解压到/users/oracle文件夹中
3、 配置CATALINA_HOME环境变量
运行tomcat需要jdk的支持,因此需要先安装jdk,本文讲述tomcat7、tomcat8.0、tomcat8.5及tomcat9的配置,此处列出对应的版本
tomcat7 7.0.27
tomcat8.0 8.0.37
tomcat8.5 8.5.5
tomcat9 9.0.0.M10
除tomcat9需要JDK8支持外,其他的版本只需JDK7支持
tomcat的启动
/users/oracle/tomcat安装路径下/bin/catalina.sh start
五、 Tomcat-redis桥接器的编写、构建、配置
桥接器的获取
访问https://github.com/jcoleman/tomcat-redis-session-manager可以获得桥接器,该桥接器提供了源码下载,需要经过构建后才可以使用,构建方式有两种:开发者使用的gradle和eclips,本文将逐一讲述。开箱的源码只支持tomcat7,如果需要支持tomcat8或者tomcat9,则需要先修改源码再进行构建,本文也将涉及如何修改源码支持tomcat8和9
使用gradle构建项目
下载gradle
从https://gradle.org/gradle-download/下载gradle,解压到本地文件夹如D:\gradle-3.1,将bin路径加入到path中
下载桥接器源代码
下载桥接器源代码到本地,解压
修改桥接器项目的gradle构建文件
打开桥接器项目文件夹,找到build.gradle文件,修改使其保持最简模式,如下
apply plugin: 'eclipse' //支持生成eclipse工程文件
apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'
version = '2.0.0'
repositories {
mavenCentral()
}
compileJava {
sourceCompatibility = 1.7 //源码兼容java7
targetCompatibility = 1.7 //目标代码兼容java7
}
dependencies {
compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'
//此处的版本根据对应的tomcat具体版本进行调整,要修正为桥接器部署的tomcat版本
compile group: 'redis.clients', name: 'jedis', version: '2.7.3'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.3'
}
artifacts {
archives jar
}
构建项目
进入桥接器项目的目录中,在dos终端键入gradle build即开始构建项目,注意此时构建的机器必须连入互联网,因为gradle需要从maven全球仓库下载项目构建需要的类库
构建完成后在build/libs文件夹中生成对应的tomcat-redis-session-manager-master-2.0.0.jar包,还需要在C:\Users\用户名\.gradle\caches\modules-2\files-2.1下找到jedis-2.7.3.jar(redis的java版客户端包)和commons-pool2-2.3.jar包
使用eclipse构建项目
使用eclips构建项目同样需要下载、安装gradle、修改项目构建文件build.gradle,修改完成后,使用gradle eclipse命令生成eclipse工程项目文件,然后就可以把该项目导入eclipse中,接下来就可以在eclipse中修改、编译源码,生成对应的jar文件
tomcat的配置
jar包的支持
将构建得到的三个jar包拷贝到hadoop01、hadoop02这两台服务器的tomcat安装路径下的lib目录中
配置文件的修改
修改两台tomcat服务器的配置文件 ~/tomcat安装目录/conf/context.xml,在最后增加如下配置:
<Valve className=”com.naritech.nicole.gump.RedisSessionHandlerValve” />
<Manager className=”com.naritech.nicole.gump.RedisSessionManager” host=”192.168.75.90” port=”6379” database=”0” maxInactiveInterval=”60” />
两个类即为桥接器项目提供的类,host配置为redis服务器的访问地址,port为redis的访问端口,可以使用catalina.sh run模式观察tomcat启动是否正常
tomcat7和桥接器配合使用
桥接器开箱即支持tomcat7,无需修改源码,因此只需要按照上述构建步骤进行构建、配置即可
tomcat8.0.X和桥接器配合使用
由于tomcat8.0.X中,取消了一个API接口,导致桥接器不能支持tomcat8.0.X,因此需要稍作修改,即将RedisSessionManager.java中第717、718行的getContainer()改为this.getContext(),修改完成之后仍然按照前述步骤进行构建、配置即可
tomcat8.5.X和桥接器配合使用
tomcat8.5.X中,取消了数个API接口,导致桥接器不能支持tomcat8.5.X,因此需要修改,由于修改之处比较多,本文不再赘述,读者可以直接参考我修改的源码,修改完成之后仍然按照前述步骤进行构建、配置即可
tomcat9.0.X和桥接器配合使用
这种情况下,需要修改的桥接器源码和tomcat8.5.X是相同的。然而为了支持tomcat9的运行,需要使用jdk8,在jdk7的情况下,tomcat9无法启动
六、 测试
浏览器中输入http://192.168.75.90:8080/examples/servlets/servlet/SessionExample,可以
看到Session ID,将hadoop01上的tomcat停掉,仍然可以正常访问上述地址,Session ID保持不变,这表示现在nginx将请求转发给hadoop02上的tomcat。
接着将hadoop01上的tomcat停掉,仍然访问上述地址,此时浏览器显示访问异常,因为此时两台tomcat服务器均停止服务,nginx服务器找不到可以转发的服务器,所以访问异常
接着将hadoop01上的tomcat启动,仍然可以正常访问上述地址,Session ID保持不变,这表示现在nginx将请求转发给hadoop01上的tomcat
接下来将hadoop02上的tomcat启动,仍然可以正常访问上述地址,Session ID保持不表,现在两台tomcat服务器都在正常提供服务
接下来使用redis-cli连接redis服务器,使用get SessionID可以查到对应的键值存在,这表示session确实已经存入redis数据库中
特别注意:
1、从tomcat6开始默认开启了Session持久化设置,测试时可以关闭本地session持久化,即在tomcat的conf目录下的context.xml文件中,取消注释配置即可:
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!-- <Manager pathname="" /> -->
2、将对象放到redis里时,该对象必须实现java.io.Serializable接口,否则将报错,如果对象中有其它对象的引用,该引用对象也需实现java.io.Serializable接口
3、应用如果需要存储自定义对象到session中,当需要修改这些自定义对象,并重新保存到session中的时候,需要在修改session自定义对象属性的地方,增加session.setAttribute("__changed__","");调用,只有这样才可以保证修改后的数据能正确存到redis数据库中,
4、在应用的代码中,要显式地调用RedisSession.setManualDirtyTrackingSupportEnabled(true);
这条语句作用在于开启手工设置dirty标志,如果不显式调用这条语句,则session.setAttribute("__changed__","");调用无效
5、使用本文中的桥接器,可以支持redis集群。Redis集群的使用可以提高本方案的可用性,是值得进一步研究的,后续笔者将更新桥接器和redis集群的配置内容
btw:桥接器的工程项目源码下载地址 http://download.csdn.net/detail/gump_nicole/9641956
转载本文请标注作者 白马公园/naritech ,作者工作之余码字不易,谢谢支持
来源:oschina
链接:https://my.oschina.net/u/2487485/blog/752579