因为以前并没有接触过负载均衡,所以虽然在听了曹老师的课以后还是不太明白如何去搭建一个负载均衡的架构,只得去网上到处查阅资料。
第一次,我先直接在windows下试验,结果看了网上教程,没能成功。
第二次,郁闷之余我决定还是去linux下搞,于是我按部就班照着一份教程在Fedora下开始安装,结果怎么都无法把apache和tomcat连接起来。
第三次,之后我又使用了不同版本的tomcat和apache在windows下配置,也看了很多不同博客的教程,任然未果。
第四次,我怀疑是windows64位搞的鬼,于是下载了64位的apache和tomcat,再装仍未果,主要遇到的问题是无法加载mod_jk模块,换了至少十种不同版本mod_jk都不行。
第五次,我又查阅了不少资料,决定最后一搏,功夫不负有心人,终于成功,具体步骤在后面详述。此时距离我最初开始配置负载均衡已经过了28小时了,其间我经历了一次吃坏肚子和一次没吃晚饭。
唉,too young too simple,尽信教程,不如无教程。
什么是负载均衡呢?
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
打个比方来解释一下负载均衡,就是,让在食堂中的收盘子大妈们的工作相对均衡,既不会有人太忙,也不会有人太闲。当然一般方法是使用一个协调者,但是我认为也可以在大妈(服务器)间相互通讯或者通过令牌环的方式来均衡负载。
在我们的Apache+tomcat+jk中,自然Apache是协调者。
我们一般有三种方式来负载均衡,轮询均衡策略的配置,按权重分配均衡策略,权重请求响应负载均衡策略的配置。
目标:
使用apache 和 tomcat 配置一个可以应用的 web 网站,要达到以下要求:
1、Apache 做为 HttpServer ,后面连接多个tomcat 应用实例,并进行负载均衡。
2、 为系统设定 Session 超时时间,包括 Apache 和 tomcat
3、 为系统屏蔽文件列表,包括 Apache 和 tomcat
注:本例程以一台机器为例子,即同一台机器上装一个apache和2个Tomcat。
4、 尝试共享cache(未果)
工欲善其事,必先利其器,首先我们得准备好需要安装的文件啊。对于apache和tomcat的版本选择就是第一个问题。
略有linux下的开发经验的我觉得linux下遇到最多的三个问题就是:权限、版本、防火墙。所以为了避免一些问题,我最终选择较老版本的apache和tomcat。这是我选择的版本:
apache-tomcat-6.0.14.zip:tomcat
apache_2.2.25-win32-x86-no_ssl.msi:apache
mod_jk-1.2.31-httpd-2.2.3.so:二者的连接驱动
我之前选择了这个版本的apache_2.2.8-win32-x86-no_ssl.msi,结果在我的win7(64位)下有问题,之后又选择了面安装版64位的apache,都有问题,抱着最后一丝侥幸心理的我选择了现在的:apache_2.2.25-win32-x86-no_ssl.msi,终于修成正果。
把apache解压到“D:\”下,tomcat解压到“D:\学习\负载均衡\apache-tomcat-6.0.14a”和“D:\学习\负载均衡\apache-tomcat-6.0.14b”。
经过我亲自的实践,apache的安装路径中不能有中文!不然会出问题的,不过tomcat的安装路径中可以带有中文的(*^__^*)。
最后把mod_jk-1.2.31-httpd-2.2.3.so放到apache目录下的module目录中。安装完成!
1. windows下的主要配置文件就在“安装目录/conf/httpd.conf”。
在%apache_home%\conf\httpd.conf的最后面添加
# module mod_jk config file
Include conf/extra/mod_jk.conf
因为我是使用的jk来配置负载均衡的,所以这么多就够了
然后,
2. 在%apache_home%\conf\extra\目录下新建文件:mod_jk.conf,内容如下
#load module mod_jk-1.2.31-httpd-2.2.3.so is for Apache 2.2.x.
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
#配置 mod_jk conf
#加载集群中的workers
JkWorkersFile conf/workers.properties
#加载workers的请求处理分配文件
JkMountFile conf/uriworkermap.properties
#指定jk的日志输出文件
JkLogFile logs/mod_jk.log
#指定日志级别
JkLogLevel info
3. 在%apache_home%\conf\目录下新建文件:workers.properties,内容如下:
# worker列表
worker.list=LB_worker,jkstatus
#第一个worker的配置,名为worker_1
#tomcat的主机地址,如不为本机,请填写ip地址
worker.worker_1.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="8009",默认8009
worker.worker_1.port=8009
worker.worker_1.type=ajp13
#负载的权重值,越高表示负载越大
worker.worker_1.lbfactor=1
#第二个worker的配置,名为worker_2
worker.worker_2.host=localhost
#ajp13 端口号,对应tomcat配置文件server.xml中Connector port="9009"
worker.worker_2.port=9009
worker.worker_2.type=ajp13
worker.worker_2.lbfactor=1
#LB_worker,用于负载均衡分发的控制器
worker.LB_worker.type=lb
#重试次数
worker.LB_worker.retries=3
#指定负载的worker列表,用逗号分隔
worker.LB_worker.balance_workers=worker_1,worker_2
#配置session会话是否为粘性
#这样负载均衡器lb就会尽量保持一个session,也就是使用户在一次会话中跟同一个Tomcat进行交互
worker.LB_worker.sticky_session=true
#如果sticky_session设为true时,此处一般设为false
worker.LB_worker.sticky_session_force=false
#设置运行状态的控制器
worker.jkstatus.type=status
4. 在%apache_home%\conf\目录下新建文件:uriworkermap.properties,内容如下
#所有请求都由LB_worker这个worker处理
/*=LB_worker
#所有包含jkstatus请求的都由名称叫jkstatus的这个worker处理
/jkstatus=jkstatus
好了,apache这边已经设置好了,再把tomcat设置好,就能用apache访问tomcat啦。
其中要进行两个tomcat的分别设置,并且和workers.properties里面的对应的内容相匹配
其实tomcat并不用怎么配置,就是两点,第一,保证tomcat的端口之间互不冲突(需要修改三个地方);第二,保证tomcat的Connector端口和apache的worker.property配置文件中一致(默认是8009的那个)。
这部分很多网上教程都有,就不详述了。
万事俱备,只欠东风!接下来我就分别在两个tomcat的webapps下面写了两个小jsp文件如下:
hello.jsp
这个jsp放到webapps/Root下面就好了。
为了让两个tomcat上的hello.jsp有所不同,另一个tomcat下的hello.jsp
这样写:
启动tomcat:点击一号tomcat的安装目录下的bin中的startup.bat
点击二号tomcat的安装目录下的bin中的startup.bat
看到两个tomcat占用的端口号都是不一样的~~~
启动apache:运行这个ApacheMonitor.exe就好啦
在浏览器里面输入
http://localhost/hello.jsp同时刷新浏览器
就会重复的出现:
和
喔喔喔,成功了,再回来看看tomcat命令行中的内容:
很简单,在worker配置文件中这样改一下:
这次经历也算是让我获取了不少教训,结合我自身知识总结一下:
1. 在windows下装apache/tomcat/hadoop什么的本来就是不靠谱的,没意义的。
2. 网上的教程很多都是不靠谱的,
原因一:教程的作者可能并没有实际操作过
原因二:教程所涉及的硬件(系统类型,版本,位数),软件(依赖的软件版本)和我们实际使用肯定有差距
3. Windows64位的使用者安装软件时候一定要小心该软件是否适用于64位系统。
4. 软件安装过程中任何不起眼的报错都会影响最终结果。
5. 永远别忘了我总结的linux三大杀手:权限,版本,防火墙
6. 千万小心中文路径,对于apache和eclipse我都遇到过类似问题。