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 ,做者工做之餘碼字不易,謝謝支持