要提高Java应用服务器的扩展性和可用性, 采用前端Web服务器来进行Load-Balance负载均衡是一种极为靠谱的方式. 这种方式在用户数量和应用负载进行增长的时候很容易扩展, 也能够在一个机器硬件(网卡,硬盘等)出问题被动down机或者管理员主动down机进行维护的情况下保证系统可用. 架构师和开发人员越早了解这种方式并在实际应用中使用, 会对自己的Web应用越有信心.
下面我们用最简单可行的方式(一台Windows下Apache 2.2.x + Tomcat 6.0.18), 让大家对这种配置有一个直接的了解, 配置虽然是在WindowsXP上完成的, 但对Debian Linux下的情况也进行介绍, 你会发现, 在Linux下做这个工作只会更加省心, 毕竟Apache和Tomcat和*nix环境更加亲和 (如果你只安装了Windows, 我推荐你尽快安装Cygwin
或者coLinux
).
1.
从 http://httpd.apache.org
下载
apache_2.2.11-win32-x86-openssl-0.9.8i.msi
, 安装至如 e:\Apache2.2, 安装的时候他让你填domain,hostname, 都选你的主机名即可 (可通过ipconfig/all或者hostname命令得到).
提示:
Debian下更简单, $apt-get install apache2 命令直接完成.
2.
编辑conf\httpd.conf, 把下面的注释行生效:
#ServerName yourHostname:80
启动: bin\httpd.exe 或者 net start Apache2.2, 第一种启动方式有时便于你查错.
提示:
Debian下用 $apache2
或者 $apache2ctl -k start
3.
下载mod_jk (mod_jk-1.2.28-httpd-2.2.3.so
)
配置使用mod_jk, conf\httpd.conf 中增加:
---------------------------------------------------------------------------------
# jamesqiu
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
# trace, debug, info(*default), warn, error
JkLogLevel warn
# 让controller处理的url, controller和workers.properties中的名称需一致
JkMount /* controller # */
# 不让controller处理的url
JkUnMount /test.html controller
---------------------------------------------------------------------------------
新建:
conf\workers.properties (内容如下, 或见附件1)
#--- see following for detail
# "http://tomcat.apache.org/connectors-doc/"
# "http://tomcat.apache.org/connectors-doc/reference/workers.html"
#========server列表========
worker.list=controller
#========controller,负载均衡控制器========
worker.controller.type=lb # load-balance worker, can be "lb, status"
worker.controller.method=B # 如何选择最优的worker, B[usyness]: 选最不忙的, R[equest]: 缺省
worker.controller.balance_workers=tomcat1,tomcat2 # 指定分担请求的tomcat
# *注意* sticky_session=1的时候不能设置sticky_session_force=1, 否则永远不能由另一worker接手
worker.controller.sticky_session=1 # 1: True, otherwise False, 相同session id一直访问同一服务器
worker.controller.sticky_session_force=0 # session id出错状态不返回500(Server Error), 由另一worker接手
#========tomcat1========
worker.tomcat1.port=8009 # ajp13 端口号,在tomcat下server.xml配置, 注意不是http端口8080
worker.tomcat1.host=localhost # tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13 # apache和tomcat通讯方式, can be "ajp13, ajp14"
worker.tomcat1.lbfactor=1 # server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8019 # ajp13 端口号,在tomcat下server.xml配置
worker.tomcat2.host=localhost # tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13 # apache和tomcat通讯方式, can be "ajp13, ajp14"
worker.tomcat2.lbfactor=1 # server的加权比重,值越高,分得的请求越多
提示:
Debian下没得说, $apt-get install libapache2-mod-jk
直接完成
安装
4.
从 http://tomcat.apache.org
下载 Tomcat 6.0.18
, 得益于Java程序的方便性, 解压至如 e:\tomcat 即用(需有安装好的jdk如sun jdk1.6.0_13). 因为要做多个tomcat进行load-balance, 至少得准备2份Tomcat.
如果此时你想都不想就从e:\tomcat复制出一份e:\tomcat2, 我要提醒你了同学: 作为一位IT人, 要尽量秉承DRY(别干傻事)和节约机器资源的原则, 不要老搞copy&paste的糗事让内行鄙视.
, 你仅仅需要不同的conf\server.xml而已. bin\, lib\, webapps\完全可以共用, 这里我绕个弯(不用catalina run -config server2.xml), 以便郑重推荐Junction(下载地址
)这个类似于*nix下ln命令的工具, 他可以用一个<JUNCTION>链接来冒充实际目录欺骗Windows(其实现在这些OS挺傻的, 被虚拟机骗得找不着北, 都不知道自己运行在什么CPU和硬件上).
在各自的conf/server.xml中修改 http端口8080->808x, shutdown端口8005->80x5, ajp端口8009->80x9, 如:
tomcat1 http:8080, shutdown:8005, ajp:8009
tomcat2 http:8081, shutdown:8015, ajp:8019
tomcat3 http:8082, shutdown:8025, ajp:8029
.....
为了启动,停止,重启tomcat方便, 你可以在path里使用 tm.bat 和 tm2.bat, 但不要在其他地方设置 CATALINA_HOME (内容如下, 或见附件2)
@echo off
setlocal
if '%1'=='' (
echo tm 1 启动tomcat
echo tm 0 停止tomcat
echo tm 2 重启tomcat
goto end
)
set CATALINA_HOME=E:\tomcat
if %1==1 ( rem 启动
%CATALINA_HOME%\bin\startup.bat
) else if %1==0 ( rem 停止
%CATALINA_HOME%\bin\shutdown.bat
) else if %1==2 ( rem 重启
%CATALINA_HOME%\bin\shutdown.bat
sleep 1 && %CATALINA_HOME%\bin\startup.bat
)
:end
endlocal
@echo on
提示:
Debian下你当然是用 ln -s
来轻松造出多份Tomcat了; 改用shell来写 tm.bat 也非常容易;
5.
重启Apache, 启动所有tomcat实例, 你可以手工用浏览器测试, 我安装了curl(在cygwin上), 也可以用如下脚本测试:
for /L %B in (0,1,9) do curl http://localhost/test.jsp
可以看出tomcat1, tomcat2被轮流调用;
把其中一个tomcat实例停止, 再测试发现已经转到其他tomcat来处理了.
%CATALINA_HOME%\webapps\ROOT\test.jsp 的内容很简单, 仅仅标示一下自己是那个Tomcat实例:
<%
out.println("CATALINA_HOME=" + System.getenv("CATALINA_HOME") );
%>
6.
后记:
- 要把一个Tomcat实例仅仅作为其他实例不工作时的临时应急, 而不在正常状态下参与 (例如: 较低配置的备份机器), 也很容易在workers.properties里面进行配置(参考
)
- 是否还需要在load-balance的基础上做Cluster( 进行session复制 )? 请自行认真评估应用需求. Cluster保证session不丢失的同时, 同步session行为也会出现更多的稳定性问题和性能问题(尤其在tomcat实例数量较多时), 而你放入session的对象, 也得认真实现java.io.Serializable. Cluster的配置Tomcat自带文档写得很清楚.
分享到:
相关推荐
内附完整配置教程和修改后的apache的httpd.conf文件和tomcat的server.xml配置文件,包含test测试项目,不包含apache和tomcat安装文件。 本教程参考网上资料,本机测试成功,如有问题可以私信说明。
本人自己配置的windows平台apache+tomcat负载均衡实现,这个资源中包括apache,tomcat,测试项目+说明文档。只要正确安装apache,即可直接正常运行。本人参考网络,所以给贡献网络。
此配置是本人在公司项目中所用到的Tomcat集群技术,Apache负责负载均衡,参考众多博客,其中还做了优化!
#对 "/Dossm3RabbitMQConsumer/" 启用负载均衡 location /Dossm3RabbitMQConsumer/ { proxy_pass http://localhost:8086; #保留用户真实信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header ...
下载完成后,将压缩包解压到位,并将多余的 ...2、安装配置 Apache 环境。 3、安装配置 Tomcat 集群环境。 具体的详细操作步骤及参数详解请参考: https://blog.csdn.net/hello_world_qwp/article/details/79698334
window下完整的apache+mod_jk或mod_proxy+tomcat配置方案,用于负载均衡及动静态页面分离。里面包含有相对应版本的apache、tomcat、mod_jk,已经多个参考文档
而实际情况下,采取Apache 加Tomcat进行负载均衡集群的时候,是可以不用将Session复制到所有的节点里, 比如有六个Tomcat实例 Tomcat1,Tomcat2,Tomcat3,Tomcat4,Tomcat5,Tomcat6 是可以配置成 三组互相复制...
自己整理的技术文档,里面许多都是自己实践过的; 耗费了好几个星期,才整理完成!!! 1、Virtualbox安装centos 5.4图解参考一......讨论篇:Apache+Tomcat 集群负载均衡 mod_proxy模式.... 201 讨论篇:网站静态化
6.3 Nginx负载均衡与反向代理的配置实例 6.4 Nginx负载均衡的HTTP Upstream模块 6.5 Nginx负载均衡服务器的双机高可用 第7章 Nginx的Rewrite规则与实例 7.1 什么是Nginx的Rewrite规则 7.2 Nginx Rewrite规则相关指令...
通过Nginx实现反向代理服务器集群,同时搭建squid集群以作为静态页面和图片的缓存 通过web服务器的配置来实现负载均衡,即通过apache或是Nginx 将客户请求均衡的分给tomcat1,tomcat2….去处理 数据存储的设计思路 1...
方案2:在负载均衡服务器中运行一个精灵线程,预测服务器压力过大时会自动把session转移压力过小的服务器中。 3、做专门的图片服务器。使用一个http服务器,Apache.或者Nginx。使用ftp服务上传图片,vsftpd ##...