Apache和Tomcat互连实现网站架构

 Apache和Tomcat互连实现网站架构

一:拓扑图

二:架构

  
  
  
  
  1. 架构环境: 
  2. 软件包:jdk-7u5-linux-i586.rpm  apache-tomcat-7.0.29.tar.gz 
  3. 平台:Redhat5.5  kernel:2.6.18-308.el5 
  4. 服务环境:为某企业架构员工交流站点(由于公司机密站点内容不外露,配置雷同)
  5. 服务器型号:戴尔PowerEdge R410(Xeon E5540/1GB)
  
  
  
  
  1. 首先安装tomcat的运行时的jdk环境  
  2. rpm –ivh jdk-7u5-linux-i586.rpm  
  3. 编辑/etc/profile文件  

  
  
  
  
  1. 最后可以安装tomcat  
  2. tar  xf  apache-tomcat-7.0.29.tar.gz  -C /usr/local/tomcat 

  
  
  
  
  1. 首先简单的配置一个主机 
  2. <host> </host>内添加 
  3. <Context path="/tech" docBase="/www/webapps/tech" reloadable="true" /> 
  4.  定义日志的位置    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/logs/www.haicang.com/  " 
  5. prefix=" access_log." suffix=".txt" 
  6. pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 
  7.  
  8. Mkdir  /www/webapps/tech  -pv  
  9. 在 /tech 目录下 mkdir WEB-INF/{classes,lib} ,再新建index.jsp主页重启tomcat服务测试 
  10. 注意:在定义虚拟主机时比如<Host name="tomcatA" appBase="webapps" 
  11.             unpackWARs="true" autoDeploy="true"> 
  12. 其中的tomcatA 为主机名字 访问时需要用主机名+端口+路径访问,所以需要DNS|hosts文件解析tomcatA为本机Ip 

  
  
  
  
  1. 编译安装Apache的mod_proxy_http  mod_proxy_ajp  mod_proxy_balancer模块 
  2. Apache通过Connetcor mod_proxy_ajp模块时,Apache和tomcat之间传输数据是基于二进制数据的形式传输而非文本文件的形式传输 
  3. 第一:编译安装Apache(httpd 2.4.2) 详细参看LAMP架构 
  4. httpd –D  DUMP_MODULES 确定启用代理模块
  5. 说明:Apache和Tomcat的连接器Connector总体上两种方式:一种是基于HTTP协议的连接,另一种是基于AJP协议的连接

三:Apache在网络前端实现代理服务

  
  
  
  
  • 首先基于虚拟主机的连接 
  1. 在Apache的虚拟主机中配置 
  2. ProxyRequests Off---关闭前向代理 
  3. <VirtualHost *:80> 
  4.      ServerName www.ghc.com 
  5.      ProxyPass  / http://172.16.10.3:8080/ 
  6.      ProxyPassReverse  / http://172.16.10.3:8080/ 
  7. </VirtualHost> 
  8.  
  9. ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,
  10. 在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器 
  11. ProxyRequests {On|Off}:是否开机apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。
  12. 同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off 
  13. ProxyPass  [path]  !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,
  14. path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。
  15. 需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 
  16. 重启服务器验证: 

  
  
  
  
  • 基于连接器Connector连接Apache和Tomcat 
  1. 安装tomcat-connectors 
  2. tar xf tomcat-connectors-1.2.37-src.tar.gz  
  3. cd tomcat-connectors-1.2.37-src/native/ 
  4. ./configure --with-apxs=/usr/local/apache/bin/apxs  
  5. make && make install 
  6. 在/etc/extra目录中添加文件httpd-jk.conf 
  7. LoadModule  jk_module  modules/mod_jk.so 
  8. JkWorkersFile  /etc/httpd/extra/workers.properties 
  9. JkLogFile  logs/mod_jk.log 
  10. JkLogLevel  debug 
  11. JkMount  /*  TomcatA 
  12. kMount /status  stat1  
  13. 说明:TomcatA需要与tomcat的配置文件的引擎中指定的jvmRoute一致 
  14.  
  15. <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> 
  16. kMount /status  stat1:显示分布式环境中各实际worker工作状态 
  17. 配置 /etc/httpd/extra/workers.properties 
  18. 添加如下内容 
  19. worker.list=TomcatA 
  20. worker.TomcatA.port=8009 
  21. worker.TomcatA.host=172.16.10.3 
  22. worker.TomcatA.type=ajp13 
  23. worker.TomcatA.lbfactor=1 
  24. worker.TomcatA.type=status 
  25. 说明: ajp13:此类型表示当前worker为一个运行着的Tomcat实例 
  26.      当tomcat为负载均衡时有多个worker就不在是ajp13类型 
  27. lbfactor:权重值 
  28. status:显示分布式环境中各实际worker工作状态 
  29. 最后让Apache的主配置文件/etc/httpd/httpd.conf 上述文件 

  
  
  
  
  1. 说明:这时需要关闭虚拟主机(基于mod_jk模块连接Tomcat) 
  2. 重启服务验证: 

  
  
  
  
  1. 可以看出站点正常工作了 

四:Tomcat实现负载均衡与Apache连接

  
  
  
  
  1. 首先安装两台tomcat server  
  2. Tomcat server 1  IP:172.16.10.2   
  3. Tomcat server 2  Ip:172.16.10.3  
  4. Apache server   IP:172.16.10.1 
  5. 关于Tomcat server和Apache server的配置请参看上述安装过程 
  6. 接下来,我们开始配置Apache server 和Tomcat serve的连接 
  7. 实现负载均衡并在Apache server服务器之上监控Tomcat server的健康状态 
  8. 在/etc/extra目录中添加文件httpd-jk.conf 
  9. LoadModule  jk_module  modules/mod_jk.so 
  10. JkWorkersFile  /etc/httpd/extra/workers.properties 
  11. JkLogFile  logs/mod_jk.log 
  12. JkLogLevel  debug 
  13. JkMount  /*  lbcluster 
  14. kMount /status  stat1  
  15.  
  16.  
  17. 配置 /etc/httpd/extra/workers.properties 
  18. 添加如下内容 
  19. worker.list = lbcluster,stat1 
  20. worker.TomcatA.type = ajp13 
  21. worker.TomcatA.host = 172.16.10.2 
  22. worker.TomcatA.port = 8009 
  23. worker.TomcatA.lbfactor = 2 
  24. worker.TomcatB.type = ajp13 
  25. worker.TomcatB.host = 172.16.10.3 
  26. worker.TomcatB.port = 8009 
  27. worker.TomcatB.lbfactor = 2 
  28. worker.lbcluster.type = lb 
  29. worker.lbcluster.sticky_session = 0
  30. worker.lbcluster.balance_workers = TomcatA, TomcatB 
  31. worker.stat1.type = status  

  
  
  
  
  1. 配置/etc/http-vhost文件 
  2. ProxyRequests Off 
  3.      ServerName www.ghc.com 
  4.      ProxyPass  / balancer://lbcluster/  stickysession=jsessionid 
  5.      ProxyPassReverse  / balancer://lbcluster/ 
  6.    <proxy balancer://lbcluster> 
  7.       BalancerMember ajp://172.16.10.2:8009 loadfactor=10 route=TomcatA 
  8.       BalancerMember ajp://172.16.10.3:8009 loadfactor=10 route=TomcatB 
  9.      ProxySet lbmethod=bytraffic 
  10.    </proxy> 
  11. <Location /lbmanager> 
  12.   SetHandler balancer-manager 
  13.   Require all granted 
  14. </Location> 

   
   
   
   
  1. Tomcat A 配置 
  2. 在其server.xml文件的<Engine> </Engine>之间添加如下代码实现Tomcat集群功能
  
  
  
  
  1. 代码 如下:<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
  2.                    channelSendOptions="8"> 
  3.      <Manager className="org.apache.catalina.ha.session.DeltaManager" 
  4.                     expireSessionsOnShutdown="false" 
  5.                     notifyListenersOnReplication="true"/> 
  6.        <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 
  7.           <Membership className="org.apache.catalina.tribes.membership.McastService" 
  8.                    address="228.50.10.1"   bind="172.16.10.3"   port="45564" 
  9.                    frequency="500"  dropTime="3000"/> 
  10.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
  11.                                 address="172.16.10.3"   port="4000"  autoBind="100" 
  12.                                 selectorTimeout="5000"   maxThreads="6"/> 
  13.              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
  14.                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
  15.              </Sender> 
  16.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 
  17.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
  18.      </Channel> 
  19.      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 
  20.                         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> 
  21.      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> 
  22.      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
  23.                      tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" 
  24.                     watchDir="/tmp/war-listen/"  watchEnabled="false"/> 
  25.       <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> 
  26.       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 
  27. </Cluster> 
注意:
  
  
  
  
  1. 应用程序的中添加web.xml文件,即 
  2. 在/webapps/sess目录中需要如下目录和文件 
  3. index.jsp  WEB-INF/ classes  lib  web.xml  
  4. 且在web.xml中添加 <distributable/> 

  
  
  
  
  1. TomcatB配置 
在其server.xml文件的<Engine> </Engine>之间添加如下代码实现Tomcat集群功能

  
  
  
  
  1. 应用程序的中添加web.xml文件,即 
  2. 在/webapps/sess目录中需要如下目录和文件 
  3. index.jsp  WEB-INF/ classes  lib  web.xml  
  4. 且在web.xml中添加 <distributable/> 

  
  
  
  
  1. 重启Apache  Tomcat服务验证,用户的session_id是否永久保持 

  
  
  
  
  1. 结果可以看出,用户的Session-id 在tomcatA和tomcatB上始终没有发生改变 
  
  
  
  
  1. 监控worker的工作状态信息: 
  
  
  
  
  1. 说明:其中一台tomcat服务器down机 
  2. 使用tomcat的status监控服务主机,status页面反应较慢,
  3. 不能将后端服务器的监控状况及时的反应到前端监控主机上,这时一个缺点,建议使用其他方式 
由于时间匆促,如有错误,欢迎指正,交流,谢谢! 后记:多谢马哥教育指正,博客中有点说明的不是太清楚:在Apache和Tomcat的实现连接的过程中有两种连接方式mod_proxy和mod_jk 我们只需要在Apache的主配置文件中启用某一项即可如图所示:

你可能感兴趣的:(apache,tomcat,网站架构)