一、 LAMT搭建以及部署應用
1、LAMT部署
(1)、安裝Apache
(2)、安裝Tomcat
(3)、安裝Mysql5.1
(4)、部署jspxcms應用
2、LNMT部署
二、Tomcat簡單會話保持集群
1、后端tomcat環境搭建
2、nginx + tomcat cluser
基于IP哈希綁定會話
3、httpd + tomcat集群基于balancer實現
(1)、基于http模塊實現會話粘性
(2)、基于ajp模塊實現會話粘性
(3)、啟用管理接口
三、Tomcat 會話復制集群
1、負載均衡配置
2、啟用tomcat會話復制
3、添加<distributable/>元素
四、session會話保持之session服務器
1、集群架構
2、配置tomcat
3、創建測試頁面
4、配置前端調度器
5、測試會話保存功能
一、LAMT搭建以及部署應用:
1、LAMT部署
LAMT=Linux Apache(httpd) MySQL Tomcat ,即通過httpd反向代理tomcat向外提供服務;
httpd的代理模塊有三種:
proxy_http_module:適配http協議客戶端;
proxy_ajp_module:適配ajp協議客戶端;
proxy mod_jk :Apache與Tomcat的連接器,需編譯,少數舊服務器使用;
根據代理模塊不同,主體結構可分為下面三種
Client (http) –> httpd (proxy_http_module)(http) –> tomcat (http connector) –>mysql
Client (http) –> httpd (proxy_ajp_module)(ajp) –> tomcat (ajp connector) –>mysql
Client (http) –> httpd (mod_jk)(ajp) –> tomcat (ajp connector) –>mysql
各種的代理配置如下(proxy mod_jk過于陳舊,本文不做討論)如為httpd2.2,需去掉Require all granted顯示授權配置;
proxy_http_module代理配置示例:
<VirtualHost *:80> ServerName www.jev6.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / http://172.16.250.169:8080/ ProxyPassReverse / http:// 172.16.250.169:8080/ <Location /> Require all granted </Location> </VirtualHost>
proxy_ajp_module代理配置示例:
<VirtualHost *:80> ServerName www.jev6.com ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / ajp:// 172.16.250.169:8009/ ProxyPassReverse / ajp:// 172.16.250.169:8009/ <Location /> Require all granted </Location> </VirtualHost>
本為于httpd通過ajp模塊反向代理tomcat為例:
(1)、安裝Apache
[root@jev6 ~]#yum install httpd -y
安裝Tomcat:
[root@jev6 ~]# yum install java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y [root@jev6 ~]#vim /etc/httpd/conf.d/LAMT-ajp.conf
[root@jev6 ~]#service httpd restart
(2)、安裝Tomcat
[root@jev6 ~]#tomcat version
[root@jev6 ~]#tomcat start
從瀏覽器訪問http://172.16.250.169,注意:selinux以及iptables策略
到此LAT部署完成;
(3)、安裝Mysql5.1
[root@jev6 ~]#yum install mysql-server -y [root@jev6 ~]#service mysqld start
授權jspxcms用戶使用權限:
[root@jev6 ~]#mysql mysql> grant all privileges on jspxcms.* to 'jspxcms'@'%' identified by 'jspxcmspass';
(4)、部署jspxcms應用
創建應用安裝目錄/var/lib/tomcat/webapps/jspxcms/(也可以直接使用webapps下的ROOT/,此時注意清空自帶的ROOT/下的文件)
下載jspxcms(http://www.jspxcms.com)
解壓后將解壓后的ROOT目錄里面的文件拷貝到/var/lib/tomcat/webapps/jspxcms/下
[root@jev6 ~]#wget http://www.jspxcms.com/info_download.jspx?id=239 [root@jev6 ~]#mv info_download.jspx\?id\=239 jspxcms-7.0.1-release.zip [root@jev6 ~]#unzip jspxcms-7.0.1-release.zip [root@jev6 ~]#mv ROOT/* /var/lib/tomcat/webapps/jspxcms/
在server.xml的host組件里面加入虛擬主機配置<Context path="/jspxcms" docBase="jspxcms" reloadable="true" />;
[root@jev6 ~]#vim /etc/tomcat/server.xml
重啟tomcat:
[root@jev6 ~]#service tomcat restart
在瀏覽器打開http://172.16.250.169/jspxcms/(如果應用部署在默認的ROOT下,直接輸入IP即可如:http://172.16.250.169)
重啟tomcat:
[root@jev6 ~]#service tomcat restart
從瀏覽器打開http://172.16.250.169/jspxcms/測試
到此LAMT部署jspxcms到此成功;
【如果出現404報錯】:
[root@jev6 ~]#vim /etc/tomcat/web.xml
將/etc/tomcat/web.xml 112行左右<init-param> 中<param-value>ture</param-value>的fslse改為ture;
[root@jev6 ~]#service tomcat restart
2、LNMT部署
LNMT即Linux Nginx MySQL Tomcat,只需要將LAMT的httpd關閉替換為Nginx即可,其他配置依然保存不變,具體如下;
[root@jev6 ~]#httpd -k stop [root@jev6 ~]#yum install nginx -y
在default.conf的server里面加入代理配置:
location / { proxy_pass http://172.16.250.169:8080; }
[root@jev6 ~]#vim /etc/nginx/conf.d/default.conf
在瀏覽器打開http://172.16.250.169/jspxcms/
注:
如果需要動靜分離,只需要修改location配置:
location ~* \.(jsp|do)$ { proxy_pass http://172.16.250.169:8080; }
需要后端程序設計時將動靜態內容分開存儲;
二、Tomcat簡單會話保持集群
本文主要通過httpd(或nginx)負載均衡到后端tomcat服務器,并實現會話粘性;
兩個tomcat節點:172.16.250.121(tomcatA.jev1.com),172.16.250.122(tomcatB.jev2.com)
一個負載均衡節點:172.16.250.169
主體架構:Clients–>172.16.250.169–>(tomcatA, tomcatB)
1、后端tomcat環境搭建
注意:centos6只對java1.7的兼容性較好
【安裝java虛擬機以及tomcat】:
[root@jev-1 ~]# yum install java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y [root@jev-1 ~]# mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,lib,classes} [root@jev-1 ~]# vim /var/lib/tomcat/webapps/test/index.jsp [root@jev-1 ~]# tomcat start
TomcatB的軟件布置操作同上;
【創建測試頁】:
在TomcatA上某context中(如/test),提供如下頁面
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
【瀏覽器訪問測試】
在瀏覽器打開172.16.250.121:8080/test/index.jsp測試【注意Chrome瀏覽器的本地緩存機制,建議使用其他瀏覽器】
在TomcatB上某context中(如/test),提供如下頁面
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
2、nginx + tomcat cluser
前端通過nginx負載均衡到后端tomcat集群,并通過IP綁定的方式實現會話粘性;
【安裝nginx】
[root@jev6 ~]#yum install nginx
【nginx負載均衡配置】
[root@jev6 ~]#vim /etc/nginx/nginx.conf
在http上下文加入upstream負載均衡配置
upstream tcsrvs { server 172.16.250.121:8080 server 172.16.250.122:8080 }
[root@jev6 ~]#vim /etc/nginx/conf.d/default.conf
在localtion中加入proxy_pass http://tcsrvs/;
[root@jev6 ~]#nginx -t
[root@jev6 ~]#nginx -s reload
【瀏覽器訪問測試】
在瀏覽器打開172.16.250.169/test/index.jsp不斷刷新測試,可以看到已經負載均衡,但無法綁定會話;
【基于IP哈希綁定會話】
[root@jev6 ~]#vim /etc/nginx/nginx.conf
在upstream tcsrvs加入ip_hash;
[root@jev6 ~]#service nginx restart
在瀏覽器打開172.16.250.169/test/index.jsp不斷刷新測試,可以看到已經實現會話綁定;
[root@jev6 ~]#service nginx stop
3、httpd + tomcat集群基于balancer實現
【安裝httpd】
[root@jev6 ~]#yum install httpd
【確認balancer模塊正常加載】
[root@jev6 ~]#httpd -M | grep proxy_balancer_module proxy_balancer_module (shared) [root@jev6 ~]#httpd -v Server version: Apache/2.2.15 (Unix)
(1)、基于http模塊實現會話粘性
【負載均衡配置】
基于http模塊反向代理的負載均衡配置如下
<proxy balancer://tcsrvs> BalancerMember http://172.16.250.121:8080 BalancerMember http://172.16.250.122:8080 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName lb.jev.com ProxyVia On ProxyRequests Off ProxyPreserveHost On # <Proxy *> # Require all granted # </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ # <Location /> # Require all granted # </Location> </VirtualHost> ###如果httpd版本為2.4,需將上面的6行注釋行全部掉,啟用授權###
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_http.conf
[root@jev6 ~]#service httpd start
通過瀏覽器訪問http://172.16.250.169/test/index.jsp,不斷刷新,測試是否正常調度;
【基于route標簽實現會話粘性】:
TomcatA:在Engine標簽里面(在105行附近)加入jvmRoute="TomcatA"
[root@jev-1 ~]#vim /etc/tomcat/server.xml
[root@jev-1 ~]#service tomcat restart
TomcatB:在Engine標簽里面(在105行附近)加入jvmRoute="TomcatB"
[root@jev-2 ~]#vim /etc/tomcat/server.xml
[root@jev-2 ~]#service tomcat restart
在前端httpd配置加入基于route標簽粘性配置(下圖紅色框內部分):
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <proxy balancer://tcsrvs> BalancerMember http://172.18.100.67:8080 route=TomcatA BalancerMember http://172.18.100.68:8080 route=TomcatB ProxySet lbmethod=byrequests ProxySet stickysession=ROUTEID </Proxy>
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_http.conf
重啟httpd
[root@jev6 ~]#service httpd restart
【打開瀏覽器測試】
(2)、基于ajp模塊實現會話粘性:
【負載均衡配置】
基于jap模塊反向代理的負載均衡配置如下:
<proxy balancer://tcsrvs> BalancerMember ajp://172.18.100.67:8009 BalancerMember ajp://172.18.100.68:8009 ProxySet lbmethod=byrequests </Proxy> <VirtualHost *:80> ServerName lb.jev.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ <Location /> Require all granted </Location> <Location /balancer-manager> SetHandler balancer-manager ProxyPass ! Require all granted </Location> </VirtualHost>
將上部分試驗的配置文件tomcat_http.conf備份,將http協議改為ajp,端口改為8009,刪除route標簽,暫時注釋掉通過Cookie保存會話的配置:
[root@jev6 ~]#cp /etc/httpd/conf.d/tomcat_http.conf{,.bak} [root@jev6 ~]#mv /etc/httpd/conf.d/tomcat_http.conf /etc/httpd/conf.d/tomcat_ajp.conf
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_ajp.conf
通過瀏覽器訪問http://172.16.250.169/test/index.jsp,不斷刷新,測試是否正常調度;
注意:如果http版本為2.4,需將注釋掉的<Proxy>和<Location>組件啟用;
【基于route標簽實現會話粘性】:
恢復剛剛刪除以及注釋掉的配置,修改后如下圖:
到此httpd + tomcat cluster 基于ajp實現完成。
在瀏覽器打開172.16.250.169/test/index.jsp不斷刷新測試,可以看到已經實現會話綁定;
(3)、啟用管理接口:
httpd自帶有balancer-managerGUI管理接口,可以通過圖形界面對后端主機進行監控;
接口啟用配置如下:
<Location /balancer-manager> SetHandler balancer-manager ProxyPass ! # Require all granted </Location> ###如果httpd版本為2.4,需將去掉"Require all granted"前面的注釋(顯式授權)###
[root@jev6 ~]#vim /etc/httpd/conf.d/balancer-manager.conf
在瀏覽器輸入http://172.16.250.169/balancer-manager打開管理界面
[root@jev-1 ~]#service tomcat stop
暫停tomcatA服務,可以看到家tomcatA狀態從Ok轉為Err:
選中"Worker URL"欄的URL,可以對后端主機進行負載均衡配置及控制;
三、Tomcat 會話復制集群
1、負載均衡配置
前端負載均衡可以參考(二、2)或(二、3)中的負載均衡配置;
2、啟用tomcat會話復制
確保server.xml配置文件Engine的jvmRoute屬性配置正確,將下列配置放置于<engine>或<host>中,注意各節點配置不同(截圖中黃色邊框內部分)。
<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.250.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>
【配置tomcatA節點】
[root@jev-1 ~]#vim /etc/tomcat/server.xml
【配置tomcatA節點】
[root@jev-2 ~]#vim /etc/tomcat/server.xml
3、添加<distributable/>元素
拷貝tomcat自帶模板到Webapp的WEB-INF/下面:
[root@jev-1 ~]#cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml
編輯WEB-INF/web.xml,添加<distributable/>元素;
[root@jev-1 ~]#vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml
tomcatB配置同tomcatA;
[root@jev-1 ~]#scp /var/lib/tomcat/webapps/test/WEB-INF/web.xml 172.16.250.122://var/lib/tomcat/webapps/test/WEB-INF/web.xml
在局域網內任意的主機上抓包(本處我選擇在centos7上),可以看到兩臺主機在互相通告:
~]#tcpdump -i eno16777736 -nn port 45564
【測試】
打開瀏覽器測試,不斷刷新,可以發現已經實現會話粘性:
四、session會話保持之session服務器
【Memcached】是一款分布式的內存對象緩存系統,用于減少數據庫的負載,加快web應用程序的訪問. Memcached簡單并且強大,其簡單的設計加快了部署,易于開發,緩存解決了面臨的大量數據時很多的問題;
【MSM(memcached session manager)】是一款實現Tomcat話保持的管理組件,支持粘性和無粘性的配置, 目前可以在Tomcat6,7,8中使用,并且支持Memcached會話故障轉移;
注:本想在centos6.8上實現session會話保持之session服務器,但由于調試了幾次,還是實現不了會話粘性,故轉移到centos7上做,一次成功,下文調試系統為centos7。centos6.8等日后實現后再補充;
1、集群架構
兩個tomcat節點:172.16.250.131(tomcatA.jev.com),172.16.250.132(tomcatB.jev.com)
兩個memcache節點(tomcat節點兼):172.16.250.131(n1),172.16.250.132(n2)
一個負載均衡節點:172.16.250.169 (centos6.8)
主體架構:Clients–>172.16.250.169(httpd)–>(tomcatA, tomcatB)–> (n1<–> n2)
各軟件版本:
Memcached version "1.4.15", Java(Oracle) version "1.7.0_91",Tomcat version "7.0.54",Httpd version " 2.2.15"
軟件環境布置(以節點1為例,節點2于1系統):
[root@jev71 ~]#yum install memcache java-1.7.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps -y
[root@jev71 ~]#systemctl start memcached
[root@jev71 ~]#systemctl start tomcat
2、配置tomcat
memcached-session-manager
項目地址:https://github.com/magro/memcached-session-manager
下載地址:http://repo1.maven.org/maven2/de/javakaffee/msm/
將memcached-session-manager jar添加到tomcat
下載如下jar文件至各tomcat節點的tomcat安裝目錄下的lib(/usr/share/tomcat/lib)目錄中,其中的${version}要換成你所需要的版本號,tc${6,7,8}要換成與tomcat版本相同的版本號。
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
注意:memcached-session-manager-tc7- $ {version} .jar要求tomcat 7.0.23+
本文以msm-1.8.1為例,各jar版本信息如下:
memcached-session-manager-1.8.1.jar
memcached-session-manager-tc7-1.8.1.jar
spymemcached-2.10.2.jar
msm-javolution-serializer-1.8.1.jar
javolution-5.4.3.1.jar
分別在兩個tomcat上的host上定義一個用于測試的context容器(兩節點配置一樣),并在其中創建一個會話管理器,如下所示:
<Context path="/test" docBase="test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.16.250.131:11211,n2:172.16.250.132:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context>
[root@jev71 ~]#vim /etc/tomcat/server.xml
[root@jev71 ~]#systemctl restart tomcat
TomcatB配置同上;
3、創建測試頁面
【tomcatA】的context提供測試頁面:
[root@jev71 ~]#mkdir -pv /var/lib/tomcat/webapps/test/WEB-INF/{classes,lib} [root@jev71 ~]#vim /usr/local/tomcat/webapps/test/index.jsp
添加如下內容:
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
從瀏覽器打開http://172.16.250.131:8080/test/index.jsp效果如下:
【tomcatB】的context提供測試頁面:
[root@jev72 ~]#mkdir -pv /var/lib/tomcat/webapps/test/WEB-INF/{classes,lib} [root@jev72 ~]#vim /usr/local/tomcat/webapps/test/index.jsp
添加如下內容:
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.jev.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("jev.com","jev.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
從瀏覽器打開http://172.16.250.131:8080/test/index.jsp效果如下:
4、配置前端調度器:
注:本章節使用httpd為前端調度器,也可以使用其他調度器;
[root@jev6 ~]#yum install httpd
在172.16.250.169上配置反向代理的負載均衡內容,類似如下所示:
<Proxy balancer://tcsrvs> BalancerMember http://172.16.250.121:8080 loadfactor=1 BalancerMember http://172.16.250.122:8080 loadfactor=1 ProxySet lbmethod=byrequests </Proxy> ProxyVia Off ProxyRequests Off ProxyPass / balancer://tcsrvs/ ProxyPassReverse / balancer://tcsrvs/ <Proxy *> Order Allow,Deny Allow From all </Proxy> <Location /> Order Allow,Deny Allow From all </Location>
[root@jev6 ~]#vim /etc/httpd/conf.d/tomcat_msm.conf
[root@jev6 ~]#service httpd start
5、測試會話保存功能
在瀏覽器中訪問http://172.16.100.6/test,不斷刷新,結果如下所示,其session ID在負載均衡環境中保持不變。
從測試結果可以看出,現在啟用會話共享服務的memcache節點為n1,此時將n1節點的memcache關閉;
[root@jev71 ~]#systemctl stop memcached
不斷刷新,結果如下所示。
此時,其session ID在負載均衡環境中保持不變,只是提供memcache服務的節點轉為n2;
實現了基于memcache的會話保持集群;
【本文完】
原創文章,作者:Jev Tse,如若轉載,請注明出處:http://www.www58058.com/68388