httpd反代 + tomcat cluster + redis会话保持
版本說明:
httpd版本:2.4.6
tomcat版本:7.0.69
dedis版本:3.2.3
操作系統版本:CentOS Linux release 7.3.1611
拓撲結構:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tomcat-A/192.168.1.106 ? ? ? ?
客戶端------>httpd反向代理 -------> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ----- > redis會話保持服務器
? ? ? ? ? ? ? ? ? ? ? 192.168.1.101 ? ? ? ? ? ? ? tomcat-B/192.168.1.107 ? ? ? ? ? ? ? ? ?192.168.1.100
?
httpd反向代理:
安裝httpd服務
httpd實現反向代理需要三個modules的支持:
編輯proxy配置
cat??/etc/httpd/conf.d/tomcat-proxy.conf <proxy?balancer://tcsrvs>balancermember?http://192.168.1.106:8080balancermember?http://192.168.1.107:8080proxyset?lbmethod=byrequests???#調度方式,根據請求調度,類似于輪詢 </proxy><virtualhost?*:80>servername?lb.tomcat.comproxyvia?onproxyrequests?offproxypreservehost?on<proxy?*>require?all?granted</proxy>proxypass?/?balancer://tcsrvs/proxypa***everse?/?balancer://tcsrvs/<location?/>require?all?granted</location> </virtualhost>tomcat服務器配置:
安裝對應的軟件包
準備測試文件
然后啟動tomcat服務
systemctl??start?tomcat.service此時在瀏覽器測試http://192.168.1.101/test/
以上只是完成了httpd調度后端tomcat主機的需求
當客戶端訪問時,不希望會話信息改變,試想一下,你在電商網站下了單了,然后刷新頁面調度器把你的請求調度到另一臺機器上,下的單沒了,你作何感受?所以,為了避免這種現象的發生,我們通過設置cookie信息,來綁定會話
httpd服務器配置:
cat?tomcat-proxy.conf??header?add?set-cookie?"ROUTEID=.%{BALANCER_WORKER_ROUTE}e;?path=/"?env=BALANCER_ROUTE_CHANGED?#設置cookie信息 <proxy?balancer://tcsrvs>balancermember?http://192.168.1.106:8080?route=tomcatA?loadfactor=1balancermember?http://192.168.1.107:8080?route=tomcatB?loadfactor=1proxyset?lbmethod=byrequestsproxyset?stickysession=ROUTEID???#基于會話粘性來設置cookie </proxy> #route與后端tomcat的jvmRoute對應 <virtualhost?*:80>servername?lb.tomcat.comproxyvia?onproxyrequests?offproxypreservehost?on<proxy?*>require?all?granted</proxy>proxypass?/?balancer://tcsrvs/proxypa***everse?/?balancer://tcsrvs/<location?/>require?all?granted</location> </virtualhost>tomcat主機配置:
在tomcatB主機也要做類似的修改
完成上述內容就能夠實現基于cookie的會話粘性了,在瀏覽器測試http://192.168.1.101/test/就只會調到同一臺主機,當此主機故障會調度到另一臺主機
上述基于cookie的會話粘性存在一個問題,即客戶端基于cookie訪問后端服務器A,如果A主機故障,httpd會重新調度到B主機上,但是B上沒有之前的會話信息,所以客戶端瀏覽記錄、下單情況等信息就消失了。
可以使用tomcat集群加單獨的緩存服務器redis解決上述問題,tomcat集群解決主機單點故障問題,將會話信息單獨存放在緩存服務器上而不是tomcat主機
,不過redis為了避免單點問題也要做高可用,這里我們只要能實現會話緩存功能即可。只有高可用大家有興趣可以自己研究
配置session server的話就不用cookie信息,把httpd配置中的cookie配置刪除
?vim?tomcat-proxy.conf?header?add?set-cookie?"ROUTEID=.%{BALANCER_WORKER_ROUTE}e;?path=/"?env=BALANCER_ROUTE_CHANGEDproxyset?stickysession=ROUTEID#將上述兩行刪掉或者注釋,然后重啟服務tomcat主機配置集群:
cat?server.xml?? #在Engine字段下配置下述內容 <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.0.0.4"?port="45564"?frequency="500"?dropTime="3000"/><Receiver?className="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto"?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=""/><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>以上內容很多,可以直接復制,不用做任何修改,兩臺主機都要配置
參考連接http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html?
注意官網模板配置中有兩處錯誤:
?<ClusterListener?className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"?/><ClusterListener?className="org.apache.catalina.ha.session.ClusterSessionListener"?/>#官網中此處末尾都沒有加結束符?/然后修改web.xml
安裝redis,并設置
然后啟動redis服務
接著配置tomcat主機,本處以其中一臺為例,另一臺也要按此方式配置
cat?context.xml???#編輯如下內容<Valve?className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"?/><Manager?className="com.orangefunction.tomcat.redissessions.RedisSessionManager"host="192.168.1.100"port="6379"database="0"maxInactiveInterval="60"?/> #192.168.1.100是redis的地址準備jar包,三個jar包,其下載地址如下
https://github.com/izerui/tomcat-redis-session-manager.git
然后將這三個jar包,放到tomcat的庫目錄中,即/usr/share/tomcat/lib/?
重啟tomcat服務
此時打開瀏覽器測試http://192.168.1.101/test/,會發現sessionID不變,但調度的后端主機改變了
總結:
redis只修改監聽地址即可,其他不用修改任何配置;
httpd只是啟動反代的作用,關鍵是配置對后端主機的調度;
tomcat集群需修改server.xml和web.xml文件,配合redis緩存還需配置context.xml和準備jar包
結束
轉載于:https://blog.51cto.com/panpangao/2046129
總結
以上是生活随笔為你收集整理的httpd反代 + tomcat cluster + redis会话保持的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux查看swap使用情况小脚本
- 下一篇: Java8-5-Function函数式接
