Apache + Tomcat 配置负载均衡
此文档内容已经经过测试
JavaSDK版本: 1.6.20
Apache版本: 2.2.15 http://httpd.apache.org/
Tomcat版本: apache-tomcat-6.0.35 http://tomcat.apache.org/download-60.cgi
====================================
安装
javaSDK就默认安装了.
apache的安装没有什么特别的,一路下一步即可,当然,最好修改apache的默认安装目录.
安装时注意,80端口不要被占用了.
tomcat的安装需要考虑下,是采用解压版本的tomcat,还是安装版本的tomcat.
我们这里采用解压版的tomcat
因为需要做tomcat的负载均衡,因此肯定需要解压2个以上的tomcat.我们这里用两个tomcat.
解压到某一个目录中后,需要修改tomcat目录中bin目录下的catalina.bat文件和catalina.bat文件,在文件首部加入:
set JDK_DIR=C:\Program Files\Java\jdk1.6.0_20
set JAVA_HOME=%JDK_DIR%
set tomcatStart="d:\tomcat1\bin\"
这样运行每个tomcat时,就不会因java和tomcat路径混乱导致出错了.
配置
一、配置apache
修改apache的配置文件httpd.conf
1. 启用moddle
将以下Module的注释去掉,这里并没有使用mod_jk.so进行apache和tomcat的链接,从2.X以后apache自身已集成了mod_jk.so的功能
。只需简单的把下面几行去掉注释,就相当于以前用mod_jk.so比较繁琐的配置了。这里主要采用了代理的方法,就这么简单。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
注: 我启用了三个就OK了 mod_proxy.so / mod_proxy_ajp.so / mod_proxy_balancer.so
2. 添加页面
再找到
DirectoryIndex index.html index.jsp
3、在httpd.conf同级目录新建mod_jk.conf
内容
#加载mod_jk Module
LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp controller
JkMount /*.do controller
JkMount /*.action controller
然后在httpd.conf文件最下方加入:include conf/mod_jk.conf
文件workers.properties内容
worker.list = controller #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8010 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
4. 虚拟主机设置 (这一步还没做)
接下来进行虚拟主机的设置。APACHE的虚拟主机设置如下:
首先要修改 conf/httpd.conf找到(#Include conf/extra/httpd-vhosts.conf) , 把注释去掉。
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
在下面加入
ServerAdmin [email protected]
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
其中的域名和路径根据你自己情况设置
然后再设置TOMCAT虚拟主机
二、tomcat配置
修改tomcat1的配置文件 server.xml
1. 修改SHUTDOWN端口(tomcat的关闭端口)
tomcat1:
tomcat2:
2. 修改运行端口
因为tomcat有两个,因此只需要修改其中某一个tomcat运行的端口即可:
tomcat1:
redirectPort="8443" />
tomcat2:
redirectPort="8443" />
注:只需要修改port参数,不用修改redirectPort参数
3. 修改connector的端口
tomcat1:
tomcat2:
注:只需要修改port参数,不用修改redirectPort参数
4. 启用配置 Engine
为了通过AJP来支持负载均衡,需要配置engine的jvmRoute属性.
server.xml文件中, 修改Engine 段, 增加jvmRoute参数,如下:
tomcat1:
tomcat2:
5. 配置Cluster
server.xml文件中,原来的配置
用下面的配置代替:(tomcat文档中推荐的).这个设置是主要用以tomcat的集群.
关键在于 Receiver 段中的port参数,tomcat之间必须不同:
tomcat1:
notifyListenersOnReplication="true"/>
port="45564"
frequency="500"
dropTime="3000"/>
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
tomcat2:
notifyListenersOnReplication="true"/>
port="45564"
frequency="500"
dropTime="3000"/>
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
三、启动服务,测试tomcat自带的例子
1、测试apache和tomcat协作。
先在每个tomcat中的\webapps\ROOT下的index.jsp下面加上以下的测试代码部分:(X代表不同的tomcat的输出不同的信息),把
index.html删除,以免影响测试效果。在最后面的加上.即
之间。
<%
System.out.println("hello,world!");
%>
然后再通过http://127.0.0.1/来访问一下,就会出现大家熟悉的猫猫。
然后再通过分别访问
http://127.0.0.1:8080/, http://127.0.0.1:8081/ , 它们访问的内容和上面的http://127.0.0.1/是一样的。
这样就说明apache和TOMCAT整合成功!
2、测试均衡器
通过http:// 127.0.0.1多次访问,要想看到真正的效果,必须用一些压力测试工具,可用微软Microsoft Web Application Stress
Tool进行简单压力测试,不然你靠不停刷新是体现不出来的,你只会在一个tomcat的控制台有输出结果。只用用压力测试工具模拟
大量用户同时访问,你会发现四个tomcat控制台均有打出控制信息,说明均衡器工作正常。
四、问题处理
若启动时出现这样的错误提示:
2010-06-28 15:04:51 org.apache.catalina.ha.deploy.FarmWarDeployer start
严重: FarmWarDeployer can only work as host cluster subelement!
则将以下部分注释掉: (一般情况都会遇到的)
以上内容参考了诸多文档,终于自己测试OK并部署成功了.
http://127.0.0.1/test.jsp
打开多个窗口 分别访问上面地址。。确保请求的不是一个tomcat
都输入 输入名称,值,
如:tomcat1 输入tomcat1,tomcat1
tomcat2 输入tomcat2,tomcat2
提交后session列表会显示当前session中保持的值, 这时可以停止tomcat1服务(此时tomcat1服务已停止,),再刷新访问
tomcat1的浏览器,在输入新值提交,如原来tomcat1还存在说明session同步成功,(因为此时tomcat1已停止,请求的是tomcat2服
务,tomcat1中session已成功复制到tomcat2服务中)
在做session同步的时候,需要注意一点的是:
1、保存至session中的对象一定要是可进行序列化的(实现Serializable接口),俺在
这个问题上折腾了会,其实想想也不难,session同步就是将对象/值在网络中传输的一个过程,apache,tomcat底层做session同步
也不过这样做,所以对象的话必须是可序列化的。
2、当然还有一种方法,在你的项目不要经过分布试部署的时候比较简单:去掉web.xml中的
ok !! 完成!
其它相关资料:
http://hi.baidu.com/luodaijun/blog/item/5bbe4cfb5ffef864034f56a1.html
Nginx
nginx的upstream目前支持4种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
Nginx+Tomcat+Memcached共享session集群配置 :_http://www.iteye.com/topic/676347
http://bbs.51yunwei.net/forum.php?mod=viewthread&tid=9269
http://bbs.51yunwei.net/forum.php?mod=viewthread&tid=8244
http://blog.s135.com/nginx_php_v6/
服务器性能测试工具
http://blog.licess.org/http_load-webbench-ab-siege/
jsp php 性能
http://hi.baidu.com/sheliyu/blog/item/4dc215433eddb7129213c649.html
http://linuxxx.blog.51cto.com/1824808/705590高性能服务器架设