nginx、tomcat、redis配置sesion共享

拈花ヽ惹草 提交于 2019-12-01 10:46:58

                            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    ,作者工作之余码字不易,谢谢支持

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!