【原创】Apache和基于虚拟主机的Tomcat集群方案

最近建设了北京某*机构的网站,网站前段使用Apache做负载均衡,后端使用Tomcat做的集群,基于虚拟主机的方式访问,并且实现了静态资源和动态资源的分离。

开始的建设方案有两种,一种是使用apache的反向代理,配置虚拟主机访问不同的域名反向代理至不同的应用或者路径;第二种是tomcat配置虚拟主机,apache只做负载均衡转发请求。后来考虑了一下,还是决定使用反向代理【考虑回头换成nginx】。

其次,启用了页面cache,引入memcached作为页面cache。

首先是apache:

apache虚拟主机配置:

虚拟主机配置:【片段】

【原创】Apache和基于虚拟主机的Tomcat集群方案
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.xx.gov.cn
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
ErrorLog logs/www.xx.gov.cn-error_log.log
CustomLog logs/www.xx.gov.cn-access_log.log common
</VirtualHost>
【原创】Apache和基于虚拟主机的Tomcat集群方案

这样通过www.xxx.gov.cn访问时apache会代理这个域名的访问,去访问http://127.0.0.1:9000,而如果不通过反向代理,由于tomcat在内网防火墙的保护之下,客户端无法直接访问tomcat,apache的重定向操作会被防火墙拦截。
注意:ProxyPassReverse 是必须要配置的,因为万一反向代理请求的是一个重定向操作,那么客户端也会随之重定向,那么会面临上述同样的问题,所以,配置该选项,apache会同样对重定向的操作进行代理,客户端感觉不到重定向。

动静分离:

首先将tomcat下的webapps目录作为apache的一个虚拟目录,或者将tomcat的应用复制一份另存目录,至保留该目录下的静态文件,配置如下【httpd.conf】:

【原创】Apache和基于虚拟主机的Tomcat集群方案
Alias /bjoweb "d:\Pictures\web"
<Directory "d:\Pictures\web">
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    allow from all
</Directory>

Alias /owebfiles "D:\web\wenjian\webapps\owebfiles"
<Directory "D:\bjoweb\wenjian\webapps\owebfiles">
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    allow from all
</Directory>
【原创】Apache和基于虚拟主机的Tomcat集群方案

然后配置【workers.properties】:

【原创】Apache和基于虚拟主机的Tomcat集群方案
#所有请求都由controller这个server处理
/*=controller
!/bjoweb/index.html=controller
/jkstatus=controller
!/*.gif=controller
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.doc=controller
!/*.pdf=controller
!/*.mdb=controller
!/*.gif=controller
!/*.jpg=controller
!/*.bmp=controller
!/*.png=controller
!/*.zip=controller
!/*.rar=controller

!/*.xls=controller

#所有包含jkstatus请求的都由status这个server处理
/jkstatus=status
【原创】Apache和基于虚拟主机的Tomcat集群方案

这样,所有的静态资源都会交由apache处理,而动态网页等会由中间件去处理。

mod_jk配置:

【原创】Apache和基于虚拟主机的Tomcat集群方案
# worker列表
worker.list=controller, status

#第一个server的配置,server名为s1
#ajp13 端口号,在tomcat下server.xml配置,默认8080
worker.s1.port=9019
#tomcat的主机地址,如不为本机,请填写ip地址
worker.s1.host=192.168.1.18
worker.s1.type=ajp13
#server的加权比重,值越高,分得的请求越多
worker.s1.lbfactor=1

#第二个server的配置,server名为s2
worker.s2.port=9009
worker.s2.host=192.168.1.18
worker.s2.type=ajp13
worker.s2.lbfactor=1

#server名为controller,用于负载均衡
worker.controller.type=lb
#重试次数
worker.retries=3   
#指定分担请求的server列表,用逗号分隔
worker.controller.balanced_workers=s1,s2
#设置用于负载均衡的server的session可否共享 有不少文章说设置为1是可以的,但是我是设置为0才可以的
worker.controller.sticky_session=1
worker.controller.sticky_session_force=0

worker.status.type=status
【原创】Apache和基于虚拟主机的Tomcat集群方案

Tomcat配置【片段,域名多达20多个】:

【原创】Apache和基于虚拟主机的Tomcat集群方案
<Host name="www.xxx.gov.cn"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
         <Context path="" docBase="web" debug="0" reloadable="true" crossContext="true"/>
         <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="www_xxx_gov" suffix=".txt" timestamp="true"/> 
      </Host>
       <!--yifen-->
       <Host name="www.xxx.xxx.gov.cn" debug="0" appBase="D:\\sfile\\Zh_CN\\yfy" unpackWARs="true" autoDeploy="true" xmlValidation="false"  xmlNamespaceAware="false"> 
         <Context path="" docBase="." debug="0" reloadable="true" crossContext="true"/>
         <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="www_xxx_gov" suffix=".txt" timestamp="true"/> 
      </Host>
【原创】Apache和基于虚拟主机的Tomcat集群方案

【原创】Apache和基于虚拟主机的Tomcat集群方案

上一篇:含有GROUP BY子句的查询中如何显示COUNT()为0的成果(分享)


下一篇:Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题