最近建设了北京某*机构的网站,网站前段使用Apache做负载均衡,后端使用Tomcat做的集群,基于虚拟主机的方式访问,并且实现了静态资源和动态资源的分离。
开始的建设方案有两种,一种是使用apache的反向代理,配置虚拟主机访问不同的域名反向代理至不同的应用或者路径;第二种是tomcat配置虚拟主机,apache只做负载均衡转发请求。后来考虑了一下,还是决定使用反向代理【考虑回头换成nginx】。
其次,启用了页面cache,引入memcached作为页面cache。
首先是apache:
apache虚拟主机配置:
虚拟主机配置:【片段】
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>
这样通过www.xxx.gov.cn访问时apache会代理这个域名的访问,去访问http://127.0.0.1:9000,而如果不通过反向代理,由于tomcat在内网防火墙的保护之下,客户端无法直接访问tomcat,apache的重定向操作会被防火墙拦截。
注意:ProxyPassReverse 是必须要配置的,因为万一反向代理请求的是一个重定向操作,那么客户端也会随之重定向,那么会面临上述同样的问题,所以,配置该选项,apache会同样对重定向的操作进行代理,客户端感觉不到重定向。
动静分离:
首先将tomcat下的webapps目录作为apache的一个虚拟目录,或者将tomcat的应用复制一份另存目录,至保留该目录下的静态文件,配置如下【httpd.conf】:
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>
然后配置【workers.properties】:
#所有请求都由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处理,而动态网页等会由中间件去处理。
mod_jk配置:
# 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
Tomcat配置【片段,域名多达20多个】:
<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>