一、web server session
server端session:
1、service向用戶瀏覽器發送cookie,此cookie包含獲取服務端session的標識。
2、向用戶通過瀏覽器請求同一站點的頁面時,相應的cookie信息會隨之發送。
3、server從cookie信息中識別出與此瀏覽器相關的session標識,從而判別出當前server上此瀏覽器的session信息。
在用戶瀏覽器不支持cookie的場景中,也可以基於URL重寫實現session功能。簡單來講就是server端通過爲任何一個響應給用戶的URL附加上session id的方式來標識用戶請求。
不過需要注意的是,每個瀏覽器進程都會各自管理各自跟服務端的會話ID,因此,在服務器端看來,同一個客戶端上的多個瀏覽器進程會被識別成不同的客戶端。
二、會話管理器:
標準會話管理器和持久會話管理器
標準會話管理器(StandardManager):
<Manager className="org.apache.catalina.session.StandardManager"
maxInactiveInterval="7200"/>
默認保存於$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。
maxActiveSessions:最多允許的活動會話數量,默認爲-1,表示不限制;
maxInactiveInterval:非活動的會話超時時長,默認爲60s;
pathname:會話文件的保存目錄;
持久會話管理器(PersistentManager):
將會話數據保存至持久存儲中,並且能在服務器意外中止後重新啓動時重新加載這些會話信息。持久會話管理器支持將會話保存至文件存儲(FileStore)或JDBC存儲(JDBCStore)中。
保存至文件中的示例:
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"> <Store className="org.apache.catalina.session.FileStore" directory="/data/tomcat-sessions"/> </Manager>
每個用戶的會話會被保存至directory指定的目錄中的文件中,文件名爲<session id>.session,並通過後臺線程每隔一段時間(checkInterval參數定義,默認爲60秒)檢查一次超時會話。
保存至JDBCStore中的示例:
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"> <Store className="org.apache.catalina.session.JDBCStore" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/> </Manager>
三、配置基於mod_jk的負載均衡
1、爲了避免用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。
2、爲每一個Tomcat 7實例的引擎添加jvmRoute參數,並通過其爲當前引擎設置全局惟一標識符。如下所示。需要注意的是,每一個實例的jvmRoute的值均不能相同。
<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>
3、修改虛擬主機配置
[root@liang-study extra]# vim httpd-jk.conf # Load the mod_jk LoadModule jk_module modules/mod_jk.so JkWorkersFile /usr/local/apache/conf/extra/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* lbcluster1 JkMount /status/ stat1
[root@liang-study extra]# vim workers.properties worker.list = lbcluster1,stat1 worker.TomcatA.type = ajp13 worker.TomcatA.host = 192.168.210.148 worker.TomcatA.port = 8009 worker.TomcatA.lbfactor = 5 worker.TomcatB.type = ajp13 worker.TomcatB.host = 192.168.210.198 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 5 worker.lbcluster1.type = lb worker.lbcluster1.sticky_session = 1 worker.lbcluster1.balance_workers = TomcatA, TomcatB worker.stat1.type = status
4、重啓httpd服務,驗證訪問結果。
四、配置基於mod_proxy的負載均衡
1、爲了避免用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。
2、爲每一個Tomcat 7實例的引擎添加jvmRoute參數,並通過其爲當前引擎設置全局惟一標識符。如下所示。需要注意的是,修改server.xml每一個實例的jvmRoute的值均不能相同。
<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>
3、修改httpd.conf配置
[root@liang-study conf]# vim httpd.conf Include conf/extra/tomcat-http.conf
4、添加虛擬主機配置
[root@liang-study conf]# vim extra/tomcat-http.conf ProxyRequests Off <proxy balancer://liangcluster> BalancerMember ajp://192.168.210.148:8009 loadfactor=1 route=tomcatA BalancerMember ajp://192.168.210.198:8009 loadfactor=1 route=tomcatB </proxy> <VirtualHost *:80> ServerName www.liangstudy.com ProxyPass / balancer://liangcluster/ stickysession=jsessionid nofailover=On ProxyPa***everse / balancer://liangcluster/ ErrorLog "logs/proxyTest-error.log" CustomLog "logs/lbtest-access.log" common </VirtualHost>
5、重新啓動apache,即可
五、用於mod_proxy狀態信息的輸出
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>
如果使用虛擬主機實現反向代理,如何在對應的虛擬主機上完成狀態信息輸出:
ProxyRequests Off
<proxy balancer://lbcluster1>
BalancerMember ajp://192.168.10.8:8009 loadfactor=1
BalancerMember ajp://192.168.10.9:8009 loadfactor=1
ProxySet lbmethod=bytraffic
</proxy>
<VirtualHost *:80>
ServerName localhost
ProxyVia On
ProxyPass / balancer://lbcluster1/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPa***everse / balancer://lbcluster1/
<Location /balancer-manager>
SetHandler balancer-manager
Proxypass !
Require all granted
</Location>
<Proxy *>
Require all granted
</Proxy>
<Location / >
Require all granted
</Location>
</VirtualHost>
五、基於mod_proxy實現共享集羣
根據會話管理器的模式,我們選用org.apache.catalina.ha.session.DeltaManager的方法來實現共享,所有啓用集羣功能的web應用程序,其web.xml中都須添加<distributable/>才能實現集羣功能。如果某web應用程序沒有自己的web.xml,也可以通過複製默認的web.xml至其WEB-INF目錄中實現。
1、修改web.xml
[root@liang-study webapps]# cd /home/websites/webapps/ [root@liang-study webapps]# mkdir WEB-INF [root@liang-study webapps]# cp /usr/local/tomcat/conf/web.xml WEB-INF/ [root@liang-study webapps]# ll total 8 -rw-r--r-- 1 root root 434 Jan 17 17:57 index.jsp drwxr-xr-x 2 root root 4096 Jan 18 20:20 WEB-INF [root@liang-study webapps]# vim WEB-INF/web.xml 在web.xml中添加<distributable/>即可,記得在另外一臺tomcat上也需要做這個操作 [root@liang-study webapps]# scp -r WEB-INF/ [email protected]:/home/websites/webapps/
2、修改server.xml
在<Engine name="Catalina" defaultHost="www.liangstudy.com" jvmRoute="tomcatA">下添加 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.90.90.1" bind="192.168.210.148" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.210.148" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> 注意根據tomcat主機不同修改配置文件中 bind="192.168.210.148"和address="192.168.210.148"
3、重啓tomcat