httpd反代 + tomcat cluster + redis會話保持

版本說明:html

httpd版本:2.4.6
java

tomcat版本:7.0.69git

dedis版本:3.2.3github

操做系統版本:CentOS Linux release 7.3.1611web


拓撲結構:redis

                                                           tomcat-A/192.168.1.106        apache

客戶端------>httpd反向代理 ------->                                           ----- > redis會話保持服務器
vim

                      192.168.1.101               tomcat-B/192.168.1.107                  192.168.1.100後端

 

httpd反向代理:瀏覽器

安裝httpd服務

yum -y install  httpd

httpd實現反向代理須要三個modules的支持:

mod_proxy.so 
mod_proxy_http.so 
mod_proxy_balancer.so

編輯proxy配置

cat  /etc/httpd/conf.d/tomcat-proxy.conf
<proxy balancer://tcsrvs>
        balancermember http://192.168.1.106:8080
        balancermember http://192.168.1.107:8080
        proxyset lbmethod=byrequests   #調度方式,根據請求調度,相似於輪詢
</proxy>

<virtualhost *:80>
        servername lb.tomcat.com
        proxyvia on
        proxyrequests off
        proxypreservehost on
        <proxy *>
                require all granted
        </proxy>
        proxypass / balancer://tcsrvs/
        proxypa***everse / balancer://tcsrvs/
        <location />
                require all granted
        </location>
</virtualhost>


tomcat服務器配置:

安裝對應的軟件包

java-1.8.0-openjdk 
tomcat  
tomcat-lib 
tomcat-admin-webapps 
tomcat-webapps
tomcat-docs-webapp

準備測試文件

mkdir /usr/share/tomcat/webapps/test/

tomcat-A:
cat /usr/share/tomcat/webapps/test/index.jsp                                                       <%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="blue">TomcatA.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcatA.com","tomcatA.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

tomcat-B:
cat /usr/share/tomcat/webapps/test/index.jsp      
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="red">TomcatB.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tomcatB.com","tomcatB.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

而後啓動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=1
        balancermember http://192.168.1.107:8080 route=tomcatB loadfactor=1
        proxyset lbmethod=byrequests
        proxyset stickysession=ROUTEID   #基於會話粘性來設置cookie
</proxy>
#route與後端tomcat的jvmRoute對應
<virtualhost *:80>
        servername lb.tomcat.com
        proxyvia on
        proxyrequests off
        proxypreservehost on
        <proxy *>
                require all granted
        </proxy>
        proxypass / balancer://tcsrvs/
        proxypa***everse / balancer://tcsrvs/
        <location />
                require all granted
        </location>
</virtualhost>

tomcat主機配置:

vim server.xml 
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">
#修改tomcat主機,jvmRoute是支持負載均衡的

在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_CHANGED
 proxyset 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

cat web.cml
<distributable/> 
#此處指明tomcat的分佈式集羣

安裝redis,並設置

yum -y install redis 
vim /etc/redis.conf
bind 0.0.0.0
#指定監聽全部地址,默認監聽端口是tcp6379

而後啓動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包


結束

相關文章
相關標籤/搜索