天天看點

apache + tomcat + mod_jk解決session會話共享的問題

一.配置虛拟主機

<VirtualHost *:80>

    DocumentRoot /home/afocus/apush/web

    ServerName apush.afocus.com.cn

    DirectoryIndex index.jsp

    <Directory /home/afocus/apush/web>

            Options FollowSymLinks

            AllowOverride None

            Order deny,allow

            Allow from all

    </Directory>

    ErrorLog logs/apush_error-log

    CustomLog logs/apush_access-log combined

    JkMount /*.* controller

</VirtualHost>

二.配置 jk.conf

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkMountFile conf/uriworkermap.properties

JkLogFile  logs/mod_jk.log

JkLogLevel info

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

第一句說明 将mod_jk.so 加入到httpd 中, 是以需要将 tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x.zip 内的mod_jk.so檔案放入到  E:/work/test/Apache24/modules 目錄下

第二句是說明 apach關聯的tomcat伺服器有哪些。session共享的設定。 要求 在conf目錄下建立 workers.properties 檔案

第三句 是說明 apach要攔截那些請求,那些請求讓tomcat處理。要求 在conf目錄下建立 uriworkermap.properties 檔案

第四句 是日志檔案 

第五句 是日志級别

三.配置 workers.properties

ps=/

worker.list=controller,loadbalancer,jkstatus,apushtomcat,tomcat1,tomcat2

#worker.apushtomcat.port=8069

#worker.apushtomcat.host=localhost

#worker.apushtomcat.type=ajp13

#========apache-tomcat-1========

worker.tomcat1.port=8069

worker.tomcat1.host=localhost

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor=1

#========apache-tomcat-2========

worker.tomcat2.port=8070

worker.tomcat2.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

#========controller========

worker.controller.type=lb

worker.controller.balance_workers=tomcat1,tomcat2

worker.controller.sticky_session=true

worker.controller.sticky_session_force=false

worker.jkstatus.type=status

說明: 

個人了解的 worker.list=controller,status   是有哪些攔截類型,如contorller是tomcat,status是httpd。

1、其中worker.tomcat1.host中,tomcat1代表節點名,host值為節點IP, 如果有更多節點,順序定義更多的node段,并在worker.controller.balance_workers後全部列出。 

2、lbfactor是負載配置設定權重,值越大配置設定的負載越多。 

3、worker.controller.sticky_session,設定為1或true使用粘着session,設定為0或false不使用粘着session。如果sticky_session設為true時,建議sticky_session_force設為false,

此參數表明如果叢集中某台伺服器在多次請求沒有響應後,将轉發目前的請求到其它伺服器上處理;sticky_session=false時,影響比較大,會導緻轉發到其它伺服器上的請求,找不到原來的session,

是以如果此時請求中有讀取session中某些資訊的話,就會導緻應用的null異常。sticky_session、sticky_session_force的預設值分别為true,false。 

sticky_session   sticky_session_force             含義 

     true             false            SESSION會複制,有粘性 

     true             true             SESSION不複制,有粘性 

     false            false            SESSION會複制,無粘性 

     false            true             SESSION會複制,無粘性  

4、worker.status.type=status 用于檢視 叢集資訊

四.配置uriworkermap.properties

/*=controller  

/jkstatus=status  

!/*.gif=controller  

!/*.jpg=controller  

!/*.png=controller  

!/*.css=controller  

!/*.js=controller  

!/*.htm=controller  

!/*.html=controller

說明:

即 tomcat 攔截所有的請求 (controller代表tomcat叢集)  下面的配置是特殊情況 apache隻負責攔截 /jkstatus  的請求和 靜态資源  如果不想用 apach處理,

可以把 下面的去除掉。網上有人寫攔截 /*.jsp 然後也沒有配不攔截的資源,導緻頁面顯示不完整。

還可以在workers.properties 中把 worker.list=controller,status,tomcat1,tomcat2,tomcat3 

然後将攔截的内容 為 /*.jsp /*.do 分别交給不同的伺服器處理。

五.修改tomcat的server.xml

在同一台機器上部署兩個及以上,要修改 server.xml 中的端口,讓他們不一樣

 <Server port="9005" shutdown="SHUTDOWN">  

 <Connector port="9090" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

 <Connector port="11009" protocol="AJP/1.3" redirectPort="8443" />

這三個的端口 port  protocol="AJP/1.3" 的 port 要和 workers.properties  内的配置一緻

修改 

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  />

在 Engine  标簽内添加  jvmRoute="tomcat2"    且 要和 workers.properties  内的配置一緻 

然後啟動httpd,tomcat 在浏覽器内鍵入 http://localhost:80/jkstatus 檢視叢集的資訊。

六.在部署的項目的web.xml 中的<web-app>标簽内添加 <distributable/>标簽

曾經碰到的問題

1. Unable to receive message through TCP channel  

登陸的時候,将使用者資訊放入session  發現能夠登陸單個的tomcat,但是不能通過apache進入,修改 workers.properties 就可以了,這個網上沒找到答案,暫時這樣。

worker.controller.sticky_session_force=false 

2.所有的要放入session的内容必須實作Serializable接口否則會報錯,java.io.NotSerializableException  

3.apache httpd 找不到tomcat  可能原因是 mod_jk 的版本不比對,我剛開始用的是 tomcat-connectors-1.2.39-windows-x86_64-httpd-2.4.x.zip 發現連結不上tomcat 但是換為tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x.zip  後就可以了。

4.将靜态資源放到httpd  的E:\work\test\Apache24\htdocs目錄下, 結構要和 jsp檔案中寫的路徑一緻。

一定要注意的問題:

切記将定時任務單獨部署,否則會執行多次。

     本文轉自陳繼松 51CTO部落格,原文連結http://blog.51cto.com/chenjisong/1753435:,如需轉載請自行聯系原作者