由于php搭建动态网站当访问量到达一定上限时,就会成为整个系统的瓶颈,这是由于php本身的缺陷造成的。因此tomcat的出现,能够很好的解决php搭建的动态网站带来的问题。这是因为tomcat本身用现在比较流行的java语言开发的,然后在java语言有一种特点,一次编译,到处运行,当然前提是需要提供其运行环境。至于tomcat有哪些好处,这是里就不再介绍。
    这次实现apache做tomcat的反代。而apache提供mod_proxy与mod_jk分别实现tomcat的反代。为什么有两种,前面一种是利用http协议,后一种是利用ajp协议。至于为什么要用两种,这就没办法回答你。谷歌,百度随便搜。。。。
    在tomcat中自己提供一种特殊的集群,并能将对方服务器所产生的会话复制给自己,这就是会话共享。会话共享的作用现代网站中有着巨大的作用。当用户打开一个网站将商品加入到购物车时,如果刷新浏览器,选购的商品就没有了,如果你是一名消费者,你还会去这个网站上购物吗?答案肯定不会,除非你要买的商品,只有这家有卖。因此会话共享在电子商务的网站中有着巨大的作用。说到这里你或许就应该知道会话是啥东西。当用户正在选购商品的服务器突然发生故障,如果会话做了共享,那么用户所选的商品并不突然不见。

实验拓扑图如下:

152041124.jpg

一,apache为源码编译,详情不在此博文中描述参照http://bingodeng.blog.51cto.com/1038075/923845。httpd-2.4.2.tar.bz2


  1. #tar xf apr-1.4.6.tar.bz2  

  2. #cd apr-1.4.6  

  3. #./configure --prefix=/usr/local/apr  

  4. #make && make install  

  5. #tar xf  apr-util-1.4.1.tar.bz2  

  6. #cd apr-util-1.4.1    

  7. #./configure --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr  

  8. #make && make install  

  9. #tar xf httpd-2.4.2  

  10. #cd httpd-2.4.2  

  11. #./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so  

  12. --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre

  13. --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util  

  14. --enable-proxy --enable-proxy-http --enable-proxy-ajp  

  15. #make && make install  

二,给apache提供一个服务控制脚本上传上附中,下载的脚本,直接使用。
三,vim /etc/profile 添加一行。并执行. /etc/profile


  1. PATH=$PAHT:/usr/local/apache/bin/ 新增一行

  2. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC 在一行上面添加就ok

四,将其添加到chkconfig中。执行chkconfig --add httpd。并启动服务,查看httpd安装是否正常。service httpd start。如果正常,则继续下一步

下面开始给两台服务安装tomcat。由于后面两台服务器做成tomcat集群,才能共享会话。因此需要将两台服务的时间调成一样。

一,Tomcat依赖j2ee平台,因此需要安装jdk-7u5-linux-i586.rpm,安装之后执行

  1. #/usr/java/jdk1.7.0_05/bin/java -version 显示下列信息表示安装成功

  2. java version "1.7.0_05"

  3. Java(TM) SE Runtime E

  4. nvironment (build 1.7.0_05-b05)

  5. Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

二,将java的bin路径添加到环境变量中去 vim /etc/profile

  1. JAVA_HOME=/usr/java/jdk1.7.0_05

  2. PATH=$PATH:$JAVA_HOME/bin

  3. export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

  4. # .  /etc/profile

三,安装tomcat很简单,直接解压就可以使用,我使用的是apache-tomcat-7.0.29.tar.gz 。

  1. #tar xf apache-tomcat-7.0.29.tar.gz  -C /usr/local  

  2. #cd /usr/local/

  3. #ln -sv apache-tomcat-7.0.29.tar.gz  tomcat

  4. #cd tomcat

  5. #bin/catalina

  6. #bin/catalina.sh start 启动服务,

在浏览器中输入http://172.16.150.3:8080如果能正常访问则tomcat也安装成功。在另外一台机器也将环境搭建好。
四,给两台tomcat自定义好主页:
在tomcatA上

  1. # cd /usr/local/tomcat/webapps/

  2. # mkdir -pv sess/WEB-INF/{classes,lib}

  3. # cd sess

  4. vim index.jsp

  5. <%@ page language="java" %>

  6. <html>

  7. <head><title>TomcatA</title></head>

  8. <body>

  9. <h1><fontcolor="red">TomcatA </font></h1>

  10. <tablealign="centre"border="1">

  11. <tr>

  12. <td>Session ID</td>

  13. <td><%= session.getId() %></td>

  14. </tr>

  15. <tr>

  16. <td>Created on</td>

  17. <td><%= session.getCreationTime() %></td>

  18. </tr>

  19. </table>

  20. </body>

  21. </html>

为sess提供web.xml

  1. #vim webapps/sess/WEB-INF/web.xml

  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

    version="2.5">

    <display-name>TomcatDemo</display-name>

     <distributable/>  //添加这一行

    </web-app>

在tomcatB 上也需要做同样的配置,只需要将主页的这一行代码做修改。
<h1><font color="blue">TomcatB </font></h1>
五,定义tomcat集群,实现会话共享,在两台节点的engine后都添加下面代码。
下面利用mod_proxy来实现。在tomcatA

  1. #vim conf/server.xml

  2. <Enginename="Catalina"defaultHost="localhost"jvmRoute="TomcatA"> 添加jvmRoute="TomcatA"测试效果时需要用到

  3.   添加下面这些代码在Engine 的下面

  4. <ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"

  5. channelSendOptions="8">

  6. <ManagerclassName="org.apache.catalina.ha.session.DeltaManager"

  7. expireSessionsOnShutdown="false"

  8. notifyListenersOnReplication="true"/>

  9. <ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">

  10. <MembershipclassName="org.apache.catalina.tribes.membership.McastService"

  11. address="228.50.10.1"bind="172.16.150.3"port="45564"

  12. frequency="500"dropTime="3000"/>

  13. <ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"

  14. address="172.16.150.3"port="4000"autoBind="100"

  15. selectorTimeout="5000"maxThreads="6"/>

  16. <SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">

  17. <TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

  18. </Sender>

  19. <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

  20. <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

  21. </Channel>

  22. <ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"

  23. filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>

  24. <ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  25. <DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"

  26. tempDir="/tmp/war-temp/"deployDir="/tmp/war-deploy/"

  27. watchDir="/tmp/war-listen/"watchEnabled="false"/>

  28. <ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>

  29. <ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>

  30. </Cluster>


在tomcatB上也需要将做上述修改,并将172.16.150.3改成tomcatB的ip。两台tomcat需要重启服务;

  1. #cd /usr/local/tomcat

  2. #bin/catalina.sh stop

  3. #bin/catalina.sh start

六,在apache上,启用mod_proxy模块来做会话共享

  1. #vim /etc/http/http.conf

  2. LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 启用这个模块。

  3. #DocumentRoot "/usr/local/apache/htdocs" 这一行注释

  4. # Virtual hosts

  5. Include /etc/httpd/extra/httpd-vhosts.conf 启用虚拟机配置文件,这样做方便管理。


  1. #cd /etc/httpd/extra/

  2. #vim httpd-vhosts.conf

  3. ProxyRequests Off

  4. <proxy balancer://lbcluster1>

  5.        BalancerMember ajp://172.16.150.3:8009 loadfactor=10route=TomcatA

  6. (10表示服务器权重值,为了演示效果将其设置一样TomcatA与jvmRoute="TomcatA这要保持一致,下面一样)

  7.        BalancerMember ajp://172.16.150.4:8009 loadfactor=10route=TomcatB ()

  8.        proxySet lbmethod=bytraffic 调度算法

  9. </proxy>

  10. ProxyPass /lbmanager !  如果访问http://192.168.0.130/lbmanager表示不转发。下同

  11. ProxyPass /status !

  12. ProxyPass / balancer://lbcluster1/

  13. ProxyPassReverse / balancer://lbcluster1/

  14. ProxyStatus On

  15. <Location /lbmanager>

  16.        SetHandler balancer-manager

  17.        Require all granted

  18. </location>

  19. <Location /status>

  20.        SetHandler server-status

  21.        Require all granted

  22. </location>


重启服务sevice httpd restart,打开浏览器输入
http://192.168.0.130/lbmanager 可以查看后台tomcat的状态并且带管理功能
http://192.168.0.130/status  只能查看tomcat的状态
http://192.168.0.130/sess 验证有没有实现会话共享
点刷新,如果成功则只有TomcatA变成TomcatB,之前产生session id和create on并不会变化。

154032414.jpg

154048413.jpg

下面利用mod_jk来实现tomcat的会话共享:
七,在apache服务器,先对http打补丁,需要下载mod_jk的源码。tomcat-connectors-1.2.37-src.tar.gz,已经上传上附件中

  1. #tar xf 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

  6. 八,vim /etc/httpd/httpd.conf

  7. # Virtual hosts

  8. #Include /etc/httpd/extra/httpd-vhosts.conf 将这行注释

  9. Include /etc/httpd/extra/httpd-jk.conf  添加一行

新建httpd-jk.conf文件

  1. #cd /etc/httpd/extra/

  2. #vim /etc/httpd/extra/httpd-jk.conf  

  3. LoadModule jk_module modules/mod_jk.so

  4. JkWorkersFile  /etc/httpd/extra/workers.properties

  5. JkLogFile  logs/mod_jk.log

  6. JkLogLevel  debug

  7. JkMount  /*  lbcluster1

  8. JkMount  /status  stat1

新建workers.properties

  1. #vim workers.properties  

  2. worker.list=lbcluster1,stat1

  3. worker.TomcatA.port=8009

  4. worker.TomcatA.host=172.16.150.3

  5. worker.TomcatA.type=ajp13

  6. worker.TomcatA.lbfactor=2

  7. worker.TomcatB.port=8009

  8. worker.TomcatB.host=172.16.150.4

  9. worker.TomcatB.type=ajp13  ajp协议13版

  10. worker.TomcatB.lbfactor=1 权重值

  11. worker.lbcluster1.sticky_session = 0

  12. worker.lbcluster1.type=lb

  13. worker.lbcluster1.balance_workers=TomcatA,TomcatB

  14. worker.stat1.type=status

重启服务service httpd restart并测试有没有效果。两种模块的测试完成