nginx、tomcat、redis配置sesion共享

                            nginx、tomcat、redis配置sesion共享html

by:白馬公園/naritechjava

 

本文只涉及方案的可用性,對各組件的性能優化不作討論nginx

1、        系統結構git

全系統包括三臺服務器,均爲虛擬機,安裝Centos6.5操做系統,其中github

hadoop01                   192.168.75.88          安裝tomcat,簡稱tomcat1redis

         hadoop02                   192.168.75.89          安裝tomcat,簡稱tomcat2數據庫

         hadoop03                   192.168.75.90          安裝nginx及redisapache

         客戶機以瀏覽器方式訪問,故不列入系統瀏覽器

2、        nginx的安裝及配置tomcat

安裝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安裝所有完成

3、        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單機版安裝完成

 

4、        tomcat的安裝及啓動

tomcat的安裝

一、  下載tomcat,能夠到http://tomcat.apache.org下載對應的tomcat

二、  解壓到/users/oracle文件夾中

三、  配置CATALINA_HOME環境變量

運行tomcat須要jdk的支持,所以須要先安裝jdk,本文講述tomcat七、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

 

5、        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包拷貝到hadoop0一、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中第71七、718行的getContainer()改成this.getContext(),修改完成以後仍然按照前述步驟進行構建、配置便可

tomcat8.5.X和橋接器配合使用

tomcat8.5.X中,取消了數個API接口,致使橋接器不能支持tomcat8.5.X,所以須要修改,因爲修改之處比較多,本文再也不贅述,讀者能夠直接參考我修改的源碼,修改完成以後仍然按照前述步驟進行構建、配置便可

tomcat9.0.X和橋接器配合使用

         這種狀況下,須要修改的橋接器源碼和tomcat8.5.X是相同的。然而爲了支持tomcat9的運行,須要使用jdk8,在jdk7的狀況下,tomcat9沒法啓動

6、        測試

瀏覽器中輸入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數據庫中

 

特別注意:

一、從tomcat6開始默認開啓了Session持久化設置,測試時能夠關閉本地session持久化,即在tomcat的conf目錄下的context.xml文件中,取消註釋配置便可:

<!-- Uncomment this to disable session persistence across Tomcat restarts -->

          <!--   <Manager pathname="" />   -->

二、將對象放到redis裏時,該對象必須實現java.io.Serializable接口,不然將報錯,若是對象中有其它對象的引用,該引用對象也需實現java.io.Serializable接口

三、應用若是須要存儲自定義對象到session中,當須要修改這些自定義對象,並從新保存到session中的時候,須要在修改session自定義對象屬性的地方,增長session.setAttribute("__changed__","");調用,只有這樣才能夠保證修改後的數據能正確存到redis數據庫中,

四、在應用的代碼中,要顯式地調用RedisSession.setManualDirtyTrackingSupportEnabled(true);

這條語句做用在於開啓手工設置dirty標誌,若是不顯式調用這條語句,則session.setAttribute("__changed__","");調用無效

五、使用本文中的橋接器,能夠支持redis集羣。Redis集羣的使用能夠提升本方案的可用性,是值得進一步研究的,後續筆者將更新橋接器和redis集羣的配置內容

 

 

btw:橋接器的工程項目源碼下載地址  http://download.csdn.net/detail/gump_nicole/9641956

 

轉載本文請標註做者   白馬公園/naritech    ,做者工做之餘碼字不易,謝謝支持

相關文章
相關標籤/搜索