Apache 解析html能力强悍,还具有很好的负载均衡转发能力,按照特定的算法可以优化网站。Tomcat作为servlet容器,专用于解析jsp之类的文件,效率较高 。两者的搭配可以解决一定程度的高流量大并发访问。
下面使用apache作为web端 tomcat作为容器搭建集群实现负载均衡
测试用到的软件版本:
Tomcat 5.5
Apache 2.2
Mod_jk.so
Jkd 1.6
Mysql
环境 Fedora 14+ Windows7
基本原理
把用户从客户端传送过来的请求使用apache拦截 ,把那些不该自己处理的请求通过JK_mount 交给tomcat处理。Tomcat处理完成返回给apache 然后返回给客户
2 负载均衡
Apache 安装目录 /usr/local/httpd
Tomcat 安装目录 /usr/Soft/tomcat /usr/Soft/baktomcat windows7下 E:\tomcat
要测试的应用 /usr/Application/appli 该应用在window7下目录 E:\appli
安装完成以后 在$http/conf/http.conf 加入下列代码
#Virtual hosts
Include conf/vhosts.conf
#mod_jk.so
Include conf/mod_jk.conf
就是引入两个文件
先说 mod_jk.conf 这个东西来处理请求转发 mod_jk.conf 需要有一下内容 :
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkShmFile logs/jk-runtime-status
JkLogLevel info
有了这个可以监控请求转发到那个服务器 还有启动遇到什么问题 一般 loglevel 设 为info即可 这里面还定义了另外一个文件
Workers.properties 这个文件定义的是和tomcat如何通信 需要留意的是使用粘性 session 需要显式设置。多个tomcat不使用粘性session的话,apache会把用户过来的请 求随机发给某一个服务器。不能保存用户信息 。使用粘性session定位到具体某一个 tomcat为用户服务。例子如下:
worker.list=appli,cooking,mabole,controller,jkstatus
worker.appli.type=ajp13
worker.appli.host=localhost
worker.appli.port=9009
worker.appli.lbfactor=1
worker.appli.activation=A
worker.cooking.type=ajp13
worker.cooking.host=localhost
worker.cooking.port=9010
worker.cooking.lbfactor=1
worker.appli.activation=A
worker.mabole.type=ajp13
worker.mabole.host=192.168.1.2
worker.mabole.port=9011
worker.mabole.lbfactor=2
worker.controller.type=lb
worker.controller.balance_workers=appli,cooking,mabole
worker.controller.sticky_session=1
worker.jkstatus.type=status
上文的意思是三个tomcat名字分别为appli,cooking,mabole
使用均衡器controller来做负载均衡
其中lbfactor为权重 表示分到的请求多少 越大分到的越多
最后一行使用粘性session 的配置: worker.controller.sticky_session=1
等同于:worker.controller.sticky_session=true
Httpd.conf中还引入了另外一个文件 whost.conf这个文件主要用来配置虚拟主机
需要注意的是把虚拟主机坚挺到的请求全部交给workers.properties中定义的controller 去处理就可以了 。Controller会根据各个 tomcat的加权比重权衡着分发请求
具体配置如下所示:
NameVirtualHost 192.168.10.130:80
<VirtualHost 192.168.10.130:80>
ServerAdmin [email protected]
ServerName localhost
DocumentRoot "/usr/local/httpd/htdocs"
DirectoryIndex index.html index.jsp index.htm
jkMount /*.jsp controller
jkMount /*.htm controller
</VirtualHost>
集群
负载均衡是集群搭建好以后才出现的一种效果 。一个是方法一个是目的 、集群还可。集群还有除了具有负载均衡功能之外还有别的用途。
实现方法:修改/use/Soft/tomcat/Server.xml 和/usr/Soft/baktomcat/server.xml 把这个文件中关于集群的注释去掉即可 这段代码的位置在<Host>节点内部,地点随意
如下:
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="15000"
waitForAck="true"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
需要注意的是两个tomcat如果在同一个机器上 要把<Receiver>节点里面的额tcpListenerPort要修改成不同的端口 避免发生冲突。
tomcat配置
Tomcat _server.xml主要需要注意的有3个端口如果在同一台服务器就要注意这三个端口的两个tomcat都不能重复
Server port="" 关闭tomcat使用的端口 监听shutdown命令
connectorPort=""自己做服务器是使用的端口 http://localhost:port
connetcotPort="" 和apache整合需要的端口 在workers.properties中配置的 work.appli.prot=....就是指的这个端口。使用的AJP13协议
置于b项中间tomcat请求重定向的端口不用管他 这个专门处理https,SSL请求 用的不多
Session复制
这是集群的另外一个好处。集群中的多台服务器共同为用户服务。在用户看来只是一个大的服务器。具体是那一台对用户来说是透明的 。但是如果这个用户正在访问的服务器出了问题当机了,就要用到session复制的功能了 。
配置的时候注意两个地方
a.应用里面 WEB-INF/web.xml 在节点<web-app>下面加上一行
<distributable/>
B.在worker.properties 配置worker.appli.activation=A
表示使用交互模式
C.想要session复制可以放入session的对象都是实现了序列化接口的 所以在编程的时候注意把DO实现serializable接口即可
工作原理:三个工作的服务器 ,用户过来以后 ,controller把请求交给appli但是,这时候appli当机了 ,control重新交给cooking 这样相当于把appli的session复制了一份给cooking 所以对用户来说不会收到任何影响 ,使用firefox的firebug插件可以看到在appli当机以后,虽然在另外一台服务器工作了 ,但是请求头里面的sessionId仍然显示的是appli这个session
这样就实现了session无缝迁移 。
Session复制会在一定程度上影响系统性能
要求不高的网站可以部配置这个选项。只要实现集群就可以相当程度分散服务器负担。只是无法保存用户状态 。比如登陆的用户点击某一个网页以后突然发现自己掉线了