Apache和Tomcat互连实现网站架构
一:拓扑图
二:架构
- 架构环境:
- 软件包:jdk-7u5-linux-i586.rpm apache-tomcat-7.0.29.tar.gz
- 平台:Redhat5.5 kernel:2.6.18-308.el5
- 服务环境:为某企业架构员工交流站点(由于公司机密站点内容不外露,配置雷同)
- 服务器型号:戴尔PowerEdge R410(Xeon E5540/1GB)
- 首先安装tomcat的运行时的jdk环境
- rpm –ivh jdk-7u5-linux-i586.rpm
- 编辑/etc/profile文件
- 最后可以安装tomcat
- tar xf apache-tomcat-7.0.29.tar.gz -C /usr/local/tomcat
- 首先简单的配置一个主机
- 在<host> </host>内添加
- <Context path="/tech" docBase="/www/webapps/tech" reloadable="true" />
- 定义日志的位置 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/logs/www.haicang.com/ "
- prefix=" access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
- Mkdir /www/webapps/tech -pv
- 在 /tech 目录下 mkdir WEB-INF/{classes,lib} ,再新建index.jsp主页重启tomcat服务测试
- 注意:在定义虚拟主机时比如<Host name="tomcatA" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- 其中的tomcatA 为主机名字 访问时需要用主机名+端口+路径访问,所以需要DNS|hosts文件解析tomcatA为本机Ip
- 编译安装Apache的mod_proxy_http mod_proxy_ajp mod_proxy_balancer模块
- Apache通过Connetcor mod_proxy_ajp模块时,Apache和tomcat之间传输数据是基于二进制数据的形式传输而非文本文件的形式传输
- 第一:编译安装Apache(httpd 2.4.2) 详细参看LAMP架构
- httpd –D DUMP_MODULES 确定启用代理模块
- 说明:Apache和Tomcat的连接器Connector总体上两种方式:一种是基于HTTP协议的连接,另一种是基于AJP协议的连接
三:Apache在网络前端实现代理服务
- 说明:这时需要关闭虚拟主机(基于mod_jk模块连接Tomcat)
- 重启服务验证:
- 可以看出站点正常工作了
四:Tomcat实现负载均衡与Apache连接
- 首先安装两台tomcat server
- Tomcat server 1 IP:172.16.10.2
- Tomcat server 2 Ip:172.16.10.3
- Apache server IP:172.16.10.1
- 关于Tomcat server和Apache server的配置请参看上述安装过程
- 接下来,我们开始配置Apache server 和Tomcat serve的连接
- 实现负载均衡并在Apache server服务器之上监控Tomcat server的健康状态
- 在/etc/extra目录中添加文件httpd-jk.conf
- LoadModule jk_module modules/mod_jk.so
- JkWorkersFile /etc/httpd/extra/workers.properties
- JkLogFile logs/mod_jk.log
- JkLogLevel debug
- JkMount /* lbcluster
- kMount /status stat1
- 配置 /etc/httpd/extra/workers.properties
- 添加如下内容
- worker.list = lbcluster,stat1
- worker.TomcatA.type = ajp13
- worker.TomcatA.host = 172.16.10.2
- worker.TomcatA.port = 8009
- worker.TomcatA.lbfactor = 2
- worker.TomcatB.type = ajp13
- worker.TomcatB.host = 172.16.10.3
- worker.TomcatB.port = 8009
- worker.TomcatB.lbfactor = 2
- worker.lbcluster.type = lb
- worker.lbcluster.sticky_session = 0
- worker.lbcluster.balance_workers = TomcatA, TomcatB
- worker.stat1.type = status
- 配置/etc/http-vhost文件
- ProxyRequests Off
- ServerName www.ghc.com
- ProxyPass / balancer://lbcluster/ stickysession=jsessionid
- ProxyPassReverse / balancer://lbcluster/
- <proxy balancer://lbcluster>
- BalancerMember ajp://172.16.10.2:8009 loadfactor=10 route=TomcatA
- BalancerMember ajp://172.16.10.3:8009 loadfactor=10 route=TomcatB
- ProxySet lbmethod=bytraffic
- </proxy>
- <Location /lbmanager>
- SetHandler balancer-manager
- Require all granted
- </Location>
- Tomcat A 配置
- 在其server.xml文件的<Engine> </Engine>之间添加如下代码实现Tomcat集群功能
- 代码 如下:<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.50.10.1" bind="172.16.10.3" port="45564"
- frequency="500" dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="172.16.10.3" 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=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
- <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>
注意:
- 应用程序的中添加web.xml文件,即
- 在/webapps/sess目录中需要如下目录和文件
- index.jsp WEB-INF/ classes lib web.xml
- 且在web.xml中添加 <distributable/>
在其server.xml文件的<Engine> </Engine>之间添加如下代码实现Tomcat集群功能
- TomcatB配置
- 应用程序的中添加web.xml文件,即
- 在/webapps/sess目录中需要如下目录和文件
- index.jsp WEB-INF/ classes lib web.xml
- 且在web.xml中添加 <distributable/>
- 重启Apache Tomcat服务验证,用户的session_id是否永久保持
- 结果可以看出,用户的Session-id 在tomcatA和tomcatB上始终没有发生改变
- 监控worker的工作状态信息:
由于时间匆促,如有错误,欢迎指正,交流,谢谢! 后记:多谢马哥教育指正,博客中有点说明的不是太清楚:在Apache和Tomcat的实现连接的过程中有两种连接方式mod_proxy和mod_jk 我们只需要在Apache的主配置文件中启用某一项即可如图所示:
- 说明:其中一台tomcat服务器down机
- 使用tomcat的status监控服务主机,status页面反应较慢,
- 不能将后端服务器的监控状况及时的反应到前端监控主机上,这时一个缺点,建议使用其他方式