Tomcat一步步實現反向代理、負載均衡、內存複製

 Tomcat是一個開源的Java EE服務器,想弄明白其中原理還有很長路要走,但是對於有Apache,Nginx經驗的我們來說部署它還是沒有問題的,下面我們來一步步的構建這些基本的功能吧。

實驗環境:rhel 5.8,SElinux已經關閉

一.構建一個基本的Tomcat服務器

不需要額外服務器配合,自己可以直接響應請求。

規劃: 

  1. 172.16.1.22  .cat.laoguang.me  

1.1 下載安裝jdk

下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html 選擇適合你的平臺

  1. rpm -ivh jdk-7u9-linux-i586.rpm   ##默認安裝在/usr/java中 

1.2 聲明JAVA_HOME變量,併爲了使用方便將生成的命令加入PATH中

  1. vi /etc/profile.d/java.sh 
  2.  
  3. JAVA_HOME=/usr/java/latest 
  4. PATH=$PATH:/usr/java/lastest/bin 
  5. export JAVA_HOME PATH 
  6.  
  7. source /etc/profile.d/java.sh  ##加載剛纔的配置
  8. java -version ##顯示版本號代表成功 

1.3 下載安裝tomcat

下載地址:http://tomcat.apache.org

  1. tar xvf apache-tomcat-7.0.33.tar.gz -C /usr/local/ 
  2. cd /usr/local/ 
  3. ln -sv apache-tomcat-7.0.33/ tomcat  ##創建軟鏈接 

1.4 聲明CATALINA_HOME環境變量,爲方便使用生成的命令加入到PATH中

  1. vi /etc/profile.d/tomcat.sh 
  2.  
  3. CATALINA_HOME=/usr/local/tomcat/ 
  4. PATH=$PATH:/usr/local/tomcat/bin 
  5. export CATALINA_HOME PATH 
  6. source /etc/profile.d/tomcat.sh ##加載剛纔配置 
  7. 測試是否生效 
  8. catalina.sh version  ##如果顯示版本號則成功 

1.5 查看tomcat的下的文件與目錄 

  1. bin       ##命令目錄 
  2. conf      ##配置文件目錄 
  3. lib       ##類庫
  4. logs      ##日誌 
  5. webapps   ##事例網站所在目錄 
  6. work      ##編譯時用到的工作目錄 
  7. 配置文件最需要注意的有:
  8. server.xml    ##tomcat 主配置文件 
  9. tomcat-users.xml   ##認證文件,過會會講到
  10. web.xml       ##每個站點部署都需用到web.xml,如果站點有用站點的,沒有則用這個默認的 

1.6 查看示例站點下的文件與目錄

  1. cd /usr/local/tomcat 
  2. ls webapps/examples/ 
  3. index.html  jsp  servlets  WEB-INF  websocket 
  4. 其它是自定義的,唯有WEB-INF是私有資源的目錄,部署時用到的目錄,通常是不允許他人訪問的,查看下面的目錄文件 
  5. ls webapps/examples/WEB-INF/ 
  6. classes  jsp  jsp2  lib  tags  web.xml 
  7. 需要請注意的有: 
  8. classes   ##包含所有服務器端類及當前應用程序相關的其它第三方類等 
  9. lib       ##包含JSP所用到的JAR文件; 
  10. web.xml   ##包含當前webapp的deploy描述符,定義時部署時用到的私有資源 

1.7 啓動comcat,查看默認站點

  1. catalina.sh configtest    ##配置文件檢測有沒有語法錯誤 
  2. catalina.sh start         ##啓動 

1.8 訪問測試,默認監聽的是8080,這個是在server.xml中定義的

  1. http://172.16.1.22:8080/ 
  2. 如果能看到那隻公貓,就成功了 

1.9 添加認證用戶,使用頁面中的Server Status ,Manager Apps與Host Manager這些管理工具

  1. vi /usr/local/tomcat/conf/tomcat-users.xml 添加如下 
  2.  
  3. <role rolename="manager-gui"/>  ##這個組是tomcat規定可以訪問manager的組
  4. <role rolename="admin-gui"/>  ##這個是訪問Host Manager的組
  5. <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>  ##你懂得

點擊Server Status ,Manager Apps與Host Manager 輸入賬號tomcat密碼tomcat查看後臺的管理信息,具體表示找google吧,其中Manager中有個session,這個裏面存的是個個站點的session id,一會兒講session複製內容會用到。

二.自定義一個主機,如www.laoguang.me

2.1 建立一目錄,用來存放文檔

  1. mkdir -pv /web/apps/WEB-INF 

2.2 建立一個測試頁面

  1. vi /web/apps/index.jsp 
  2.  
  3. <%@ page language="java" %> 
  4. <%@ page import="java.util.*" %> 
  5. <html> 
  6.   <head> 
  7.     <title>JSP test page.</title> 
  8.   </head> 
  9.   <body> 
  10.     <% out.println("Hello,world!"); %> 
  11.   </body> 
  12. </html> 

 2.3 編輯tomcat的配置文件 /usr/local/tomcat/conf/server.xml 定義虛擬主機,在默認Host上添加如下(不要添加到另外的host中哦)

  1. <Host name="www.laoguang.me"  appBase="/web/apps" 
  2.             unpackWARs="true" autoDeploy="true"> 
  3.     <Context path="" docBase="/web/apps" reloadable="true" /> 
  4. </Host> 

2.4 下面簡單說說server.xml中一些標籤的意思,注意:server.xml區分大小寫的

  1. <Server port="8005" shutdown="SHUTDOWN">    ##最大的容器server,端口號8005可用來管理Server 
  2. <Service name="Catalina">   ##service開始定義,名字Catalina 
  3. <Connector port="8080" protocol="HTTP/1.1" />   ##http連接器,看到了吧端口號8080 
  4. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ##ajp連接器,端口號8009 
  5. <Engine name="Catalina" defaultHost="localhost"> ##定義引擎,與默認主機 
  6. <Realm className="org.apache.catalina.realm.LockOutRealm"> ##關於認證的類 
  7. <Host name="" appBase="" unpackWARs="" autoDeploy=""></Host> 
  8. ##定義一個主機appBase主機的目錄,相當於apache的DocumentRoot,upackWARs自動解壓WAR包,autoDeploy自動部署 
  9. <Context path="" docBase="" />  
  10. ##Context 上下文,相當於apache的Aliase,path=""後面跟的是URI,docBase訪問path的URI即訪問的目錄 
  11. <Valve className="org.apache.catalina.valves.AccessLogValve" />  ##過濾器 

2.5 測試

  1. catalina.sh stop ##先關閉catalina 
  2. catalina.sh configtest ##查看有沒有語法錯誤 
  3. catalina.sh start ##啓動tomcat會自動部署 
  4. 更改window的hosts文件,添加解析 
  5. 172.16.1.22     www.laoguang.me 
  6. 訪問www.laoguang.me:8080測試,如果顯示hello world!就成功了 

三.部署JspRun測試

或許一個簡單的測試頁面不能滿足你的胃口,那我們部署個論壇吧

3.1 下載安裝 JspRun 

下載地址:http://www.jsprun.com/downloads/JspRun/6.0.0/JspRun!_6.0.0_GBK.zip

  1. unzip JspRun\!_6.0.0_GBK.zip 
  2. mv upload/ /web/jsprun 

3.2 編輯/usr/local/tomcat/conf/tomcat-users.xml 再添加一虛擬主機

  1. <Host name="jsprun.laoguang.me"  appBase="/web/jsprun" 
  2.       unpackWARs="true" autoDeploy="true"> 
  3.   <Context path="" docBase="/web/jsprun" /> 
  4. </Host> 

3.3 編輯windows的hosts,添加解析

  1. 172.16.1.22     jsprun.laoguang.me 

3.4 安裝Mysql,因爲該jsprun需要,爲了簡單yum 安裝吧

  1. yum -y install mysql-server 
  2. service mysqld start 

3.5 爲jsprun建立賬號

  1. mysql  
  2. mysql> create database jsprun; 
  3. mysql> grant all on jsprun.* to 'jsprun'@'localhost' identified by 'redhat'; 
  4. mysql> flush privileges; 

3.6 編緝jsprun的配置文件,修改mysql以下信息

  1. dbhost = localhost 
  2. dbport=3306 
  3. dbuser = jsprun 
  4. dbpw = redhat 
  5. dbname = jsprun 

3.7 訪問http://jsprun.laoguang.me:8080/install.jsp 安裝

根據提示安裝即可

四.apache做前端代理,基於mod_proxy模塊與Tomcat連接

4.1 編譯安裝apache

過程見http://laoguang.blog.51cto.com/6013350/1039208

唯一的區別是在編譯時額外加上

  1. --enable-proxy --enable-proxy-http --enable-proxy-ajp  
  2.  
  3. --enable-proxy  ##啓用代理 
  4. --enable-proxy-http ##啓用http代理模塊 
  5. --enable-proxy-ajp ##啓用ajp代理模塊 

4.2 編緝/etc/httpd/httpd.conf

  1. vi /etc/httpd/httpd.conf  
  2.  
  3. LoadModule slotmem_shm_module modules/mod_slotmem_shm.so      ##啓用該模塊 
  4. #DocumentRoot "/usr/local/apache/htdocs"   ##註釋掉,我們啓用虛擬主機 
  5. Include /etc/httpd/extra/httpd-vhosts.conf  ##我們用虛擬主機

4.3 編緝/etc/httpd/extra/httpd-vhosts.conf

  1. <VirtualHost *:80> 
  2.     ServerName jsprun.laoguang.me 
  3.     ProxyVia Off   ##不讓代理在http首部中顯示
  4.     ProxyRequests Off   ##關閉正向代理
  5.     ProxyPass /     http://jsprun.laoguang.me:8080/ ##訪問/則代理到jsprun中 
  6.     ProxyPa***everse /      http://jsprun.laoguang.me:8080/ ##不讓tomcat直接響應客端
  7.     <Proxy *> 
  8.         Require all granted 
  9.     </Proxy> 
  10.     <Location /> 
  11.         Require all granted 
  12.     </Location> 
  13.     ErrorLog "logs/laoguang-error_log" 
  14.     CustomLog "logs/laoguang-access_log" common 
  15. </VirtualHost> 

4.4 修改linux的/etc/hosts爲jsprun.laoguang.me解析

  1. vi /etc/hosts 
  2.  
  3. 172.16.1.22     jsprun.laoguang.me      jsprun 

4.5 訪問http://jsprun.laoguang.me測試

4.6 基於ajp協議與tomcat連接,與http的基本相同,只修改協議與端口即可,其它的一樣

  1. ProxyPass /     ajp://jsprun.laoguang.me:8009/ 
  2. ProxyPa***everse /      ajp://jsprun.laoguang.me:8009/ 

五.apache做前端代理,基於mod_jk模塊與Tomcat連接

4.1 編譯安裝mod_jk模塊,下載地址:http://mirrors.tuna.tsinghua.edu.cn/apache//tomcat/tomcat-connectors/jk/

  1. tar xvf tomcat-connectors-1.2.37-src.tar.gz 
  2. cd tomcat-connectors-1.2.37-src 
  3. cd native/ 
  4. ./configure --with-apxs=/usr/local/apache/bin/apxs 
  5. make && make install 

4.2 apache要使用mod_jk連接器,需要在啓動時加載此連接器模塊。爲了便於管理與mod_jk模塊相關的配置,這裏使用一個專門的配置文件/etc/httpd/extra/httpd-jk.conf來保存相關指令及其設置。其內容如下:

  1. vi /etc/httpd/extra/httpd-jk.conf 
  2.  
  3. # Load the mod_jk 
  4. LoadModule  jk_module  modules/mod_jk.so 
  5. JkWorkersFile  /etc/httpd/extra/workers.properties 
  6. JkLogFile  logs/mod_jk.log 
  7. #JkLogLevel  debug 
  8. JkMount  /*  laoguang 
  9. JkMount  /status/  status 

4.3 建立mod_jk需要的配置文件

  1. vi /etc/httpd/extra/workers.properties 
  2.  
  3. worker.list=laoguang,status 
  4. worker.laoguang.port=8009 
  5. worker.laoguang.host=172.16.1.22       
  6. worker.laoguang.type=ajp13 
  7. worker.laoguang.lbfactor=1 
  8. worker.status.type = status 

4.4 在/etc/httpd/httpd.conf中把/etc/httpd/extra/httpd-jk.conf 包含進來,並註釋掉虛擬主機,與其中的代理會衝突的哦

  1. vi /etc/httpd/httpd.conf 
  2.  
  3. #Include /etc/httpd/extra/httpd-vhosts.conf 
  4. Include /etc/httpd/extra/httpd-jk.conf 
  5. ##重啓httpd 
  6. service httpd restart 

4.5 訪問http://jsprun.laoguang.me/測試,能否能看到jsprun

五.基於mod_proxy構建負載均衡

爲了實現負載均衡,我們增加一臺服務器

  1. 172.16.1.21 tom.laoguang.me    

5.1 安裝jdk與上相同

5.2 安裝tomcat與上相同

5.3.1 增加一虛擬主機,並添加engine的jvmRoute

  1. mkdir -pv /web/balance/WEB-INF 
  2. vi /usr/local/tomcat/conf/server.xml 
  3.       <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">  ##找到Engine添加 
  4.       <Host name="balance.laoguang.me"  appBase="/web/balance" 
  5.             unpackWARs="true" autoDeploy="true"> 
  6.         <Context path="" docBase="/web/balance" /> 
  7.       </Host> 

5.3.2 添加一測試頁面

  1. vi /web/balance/index.jsp 
  2.  
  3. <%@ page language="java" %> 
  4. <html> 
  5.   <head><title>TomcatA</title></head> 
  6.   <body> 
  7.     <h1><font color="red">TomcatA </font></h1> 
  8.     <table align="centre" border="1"> 
  9.       <tr> 
  10.         <td>Session ID</td> 
  11.         <% session.setAttribute("abc","abc"); %> 
  12.         <td><%= session.getId() %></td> 
  13.       </tr> 
  14.       <tr> 
  15.         <td>Created on</td> 
  16.         <td><%= session.getCreationTime() %></td> 
  17.      </tr> 
  18.     </table> 
  19.   </body> 
  20. </html> 

5.3.2 重啓catalina 聲明:修改tomcat配置文件後需重啓以後不再說明了

  1. catalina stop 
  2. catalina start 

5.3.2 添加windows的hosts解析

  1. 172.16.1.21     balance.laoguang.me 

5.3.3 訪問http://balance.laoguang.me:8080/ 查看是否成功

5.4.1 同樣在原來cat服務器上也增加同樣的虛擬主機,方法同上,engine的jvmroute改爲TomcatB,爲了方便查看修改index.jsp顯示的顏色

  1. vi /usr/local/tomcat/conf/server.xml 
  2. <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">  ##找到Engine添加 
  3.  
  4. vi /web/balance/index.jsp 
  5. <%@ page language="java" %> 
  6. <html> 
  7.   <head><title>TomcatB</title></head> 
  8.   <body> 
  9.     <h1><font color="green">TomcatB </font></h1> 
  10.     <table align="centre" border="1"> 
  11.       <tr> 
  12.         <td>Session ID</td> 
  13.         <% session.setAttribute("abc","abc"); %> 
  14.         <td><%= session.getId() %></td> 
  15.       </tr> 
  16.       <tr> 
  17.         <td>Created on</td> 
  18.         <td><%= session.getCreationTime() %></td> 
  19.      </tr> 
  20.     </table> 
  21.   </body> 
  22. </html> 

5.4.2 重啓catalina

5.4.3 修改剛添加的windows的hosts測試這個主機

  1. 172.16.1.22     balance.laoguang.me 

5.4.4 訪問http://balance.laoguang.me:8080/測試

5.5.下面來配置前端apache來實現後端負載均衡

apache是在cat上安裝的,注意的是基於mod_proxy的負載均衡必須在中心主機中配置

5.5.1 編緝apache配置文件/etc/httpd/httpd.conf

  1. vi /etc/httpd/httpd.conf 
  2.  
  3. #Include /etc/httpd/extra/httpd-jk.conf  ##註釋掉原來的jk 
  4. ServerName balance.laoguang.com:80 
  5. #DocumentRoot "/usr/local/apache/htdocs"  ##不註釋也可以,在下面添加 
  6. ProxyRequests Off  
  7. <Proxy balancer://lbcluster> 
  8.         BalancerMember ajp://172.16.1.21:8009 loadfactor=10 route=TomcatA 
  9.         BalancerMember ajp://172.16.1.22:8009 loadfactor=10 route=TomcatB 
  10. </Proxy> 
  11. ProxyPass / balancer://lbcluster/  
  12. ProxyPa***everse / balancer://lbcluster/ 

5.5.2 重啓httpd訪問http://balance.laoguang.me/測試,如果頁面能切換代表ok

5.6 當然也可以用http協議與tomcat連接,更改協議與端口即可

  1. BalancerMember http://172.16.1.21:8080 loadfactor=10 route=TomcatA 
  2. BalancerMember httpp://172.16.1.22:8080 loadfactor=10 route=TomcatB 

六.基於mod_jk實現負載均衡

6.1 註釋剛纔添加的基於proxy_mod的配置,啓用已添加的mod_jk配置

  1. #ProxyRequests Off 
  2. #<Proxy balancer://lbcluster> 
  3. #       BalancerMember ajp://172.16.1.21:8009 loadfactor=10 route=TomcatA 
  4. #       BalancerMember ajp://172.16.1.22:8009 loadfactor=10 route=TomcatB 
  5. #</Proxy> 
  6. #ProxyPass / balancer://lbcluster/  
  7. #ProxyPa***everse / balancer://lbcluster/ 
  8.  
  9. Include /etc/httpd/extra/httpd-jk.conf 

6.2 修改 /etc/httpd/extra/httpd-jk.conf

  1. vi /etc/httpd/extra/httpd-jk.conf 
  2.  
  3. # Load the mod_jk 
  4. LoadModule  jk_module  modules/mod_jk.so 
  5. JkWorkersFile  /etc/httpd/extra/workers.properties 
  6. JkLogFile  logs/mod_jk.log 
  7. #JkLogLevel  debug 
  8. JkMount  /*  cluster1 
  9. JkMount  /status/  status 

6.3 修改/etc/httpd/workers.properties

  1. worker.list = cluster1,status 
  2. worker.TomcatA.type = ajp13 
  3. worker.TomcatA.host = 172.16.1.21 
  4. worker.TomcatA.port = 8009 
  5. worker.TomcatA.lbfactor = 5  
  6. worker.TomcatB.type = ajp13 
  7. worker.TomcatB.host = 172.16.1.22 
  8. worker.TomcatB.port = 8009 
  9. worker.TomcatB.lbfactor = 5  
  10. worker.cluster1.type = lb 
  11. worker.cluster1.sticky_session = 0    ##如果爲1會綁定session  
  12. worker.cluster1.balance_workers = TomcatA, TomcatB 
  13. worker.status.type = status 

6.4 測試訪問 http://balance.laoguang.me/

七.構建基於內存session複製的tomcat集羣
爲了防止由於節點故障導致的session丟失,我們來構建基於內存session複製的集羣,在剛纔的的負載均衡中你或許已經發現網頁顯示的session id一直是變動的,這個session id 就是通過jsp獲得的此次會話的id,我們發現會話id一直是變動的,TomcatA中一直是TomcatA的session id,下面我們來構建吧。

7.1 修改172.16.1.21的server.xml,在engine下添加如下

  1. vi /usr/local/tomcat/conf/server.xml  
  2.  
  3. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
  4.                    channelSendOptions="8"> 
  5.      <Manager className="org.apache.catalina.ha.session.DeltaManager" 
  6.                     expireSessionsOnShutdown="false" 
  7.                     notifyListenersOnReplication="true"/> 
  8.        <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
  9.           <Membership className="org.apache.catalina.tribes.membership.McastService" 
  10.                    address="227.50.10.1"   bind="172.16.1.21"   port="45564" 
  11.                    frequency="500"  dropTime="3000"/> 
  12.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
  13.                                 address="172.16.1.21"   port="4000"  autoBind="100" 
  14.                                 selectorTimeout="5000"   maxThreads="6"/> 
  15.              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
  16.                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
  17.              </Sender> 
  18.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 
  19.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
  20.      </Channel> 
  21.      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
  22.                         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> 
  23.      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> 
  24.      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
  25.                      tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" 
  26.                     watchDir="/tmp/war-listen/"  watchEnabled="false"/> 
  27.       <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> 
  28.       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
  29. </Cluster> 

7.2 修改balance虛擬主機的部署文件web.xml

我們建立的balance時沒有建立web.xml,我們繼承的是/usr/local/tomcat/conf/web.xml的,我們現在需要修改部署文件,所以拷貝到/web/balance/WEB-INF中修改,在<web-app> </web-app>中添加 <distributable/>,部份如下

  1. cp /usr/local/tomcat/conf/web.xml /web/apps/WEB-INF/     
  2. vi /web/apps/WEB-INF/web.xml   
  3.   
  4.     <welcome-file-list> 
  5.         <welcome-file>index.html</welcome-file> 
  6.         <welcome-file>index.htm</welcome-file> 
  7.         <welcome-file>index.jsp</welcome-file> 
  8.     </welcome-file-list> 
  9. <distributable/> 
  10. </web-app> 

7.3 修改172.16.1.22 的server.xml 基本與172.16.1.21的相同,只修改多播ip與接收ip即可,爲了不浪費51blog的存儲空間,就不完全顯示了

  1. <Membership className="org.apache.catalina.tribes.membership.McastService" 
  2.          address="227.50.10.1"   bind="172.16.1.22"   port="45564" 
  3.          frequency="500"  dropTime="3000"/> 
  4.    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
  5.                       address="172.16.1.22"   port="4000"  autoBind="100" 
  6.                       selectorTimeout="5000"   maxThreads="6"/> 

7.4 對balance虛擬主機部署文件修改與172.16.1.21相同

7.5 測試訪問 http://balance.laoguang.me/ 查看session id變化情況

到此構建結束,過程並不難,但要熟練使用tomcat必須得去了解java啊,還有好長的路要走,不要以爲會構建了tomcat就覺的會tomcat了,其實還不到10%,所以加油,寫給你們,也寫給自己。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章