本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成。

由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开始只采用了单个Tomcat来运行工程项目,效果差得不尽人意,后来想到了利用Apache和Tomcat集群的负载均衡原理来解决这个问题。在网上查询了很多资料,由于Apache和Tomcat版本的不同,出现了不同配置方法的文章。不过,很感谢这些文章的编写作者,提供了大概类似的配置思路和方法。根据学习大牛们的配置方法,现在将自己的配置过程采用博客的形式记录下来,总结一下。

 一、环境和版本

环境:主机----Windows(本地IP:10.10.141.40);虚拟机(模仿远程)----Windows(远程IP:10.10.141.39)

版本:JDK----1.6(安装版); Tomcat----6.0.18(安装版);Apache----2.2.22(httpd-2.2.22-win32-x86-no_ssl.msi,安装版)

二、安装

1、安装JDK,目标盘符:D:\Program Files\Java\jdk1.6.0_07。

2、配置JDK环境变量:

2.1、建立系统变量:JAVA_HOME=D:\Program Files\Java\jdk1.6.0_07;

2.2、建立系统变量:CLASSPATH=.;(逗号+分号);

2.3、编辑path系统变量:在最前面加上%JAVA_HOME%\bin;。

3、安装Tomcat,目标盘符:D:\Program Files\Apache Software Foundation\Tomcat 6.0,安装之后运行一次,查看是否安装正确或运行正常,默认端口8080。

注:1、安装Tomcat的时候,如果你的C盘有如此目录:C:\Program Files\Java\jre*,则Tomcat会优先选择此目录作为安装条件,故要留意此种情况;

2、虚拟机中的JDK和Tomcat  的安装方式类似,本人虚拟机由于安装的时候只有一个盘符C,故全部都安装在C盘中了;

3、采用上述安装方式,不再需要单独配置Tomcat的环境变量了。

4、安装Apache,目标盘符:D:\Program Files\Apache Software Foundation\Apache2.2,默认端口80。

注:1、有些大牛的文章说,在安装的时候如果IIS处于运行状态,则安装可能不会成功,强调关闭IIS服务,本人安装过程中,IIS一直处于运行状态,但是安装成功了,估计可能跟版本有关吧;

2、打开http:10.10.141.40进行测试,如果能看到一个"It works!",证明安装成功。

三、Apache+JK+Tomcat集群配置

1、Apache----2.2.22版本已经集成了mod_jk功能,故不必配置繁琐的worker.properties文件什么的,配置过程很方便了。

2、利用编辑器打开D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf文件,找到如下代理块(proxy):

#LoadModule proxy_module modules/mod_proxy.so

             #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

             #LoadModule proxy_balancer_module modules/mod_proxy_balancer.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

3、去掉这些代理块的注释“#”符号,Apache在启动的过程中将加载上述代理(proxy)。

4、找到#Include conf/extra/httpd-vhosts.conf位置,并去掉“#”符号,结束后关闭httpd.conf文件。

5、利用编辑器打开D:\Program Files\Apache Software Foundation\Apache2.2\conf\extra\httpd-vhosts.conf文件,配置虚拟站点,在文件结束添加

<VirtualHost *:80> 

                    ServerAdmin 管理员邮箱 

                    ServerName 域名(没有可用IP地址代替)

                    ServerAlias localhost 

                    ProxyPass / balancer://cluster/ stickysession=JSESSIONID(大写很重要) nofailover=On

                    ProxyPassReverse / balancer://cluster/ 

                    ErrorLog "logs/lbtest-error.log" 

                    CustomLog "logs/lbtest-access.log" common 

              </VirtualHost>

本人的配置实例:

<VirtualHost *:80> 

                   ServerAdmin limingzhong1985@gmail.com

                   ServerName 10.10.141.40

                   ServerAlias localhost 

                   ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On

                   ProxyPassReverse / balancer://cluster/ 

                   ErrorLog "log/error.log" 

                   CustomLog "log/access.log" common 

             </VirtualHost>

注:1、balancer://是告诉Apache需要进行负载均衡的代理;

2、后面的cluster是集群名,可以随意取;

3、两个日志引擎ErrorLog负责记 录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取。

6、再次打开D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf,文件结束处添加如下代码:

ProxyRequests Off 

             <proxy balancer://cluster> 

                    BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1

                    BalancerMember ajp://10.10.141.40:8009 loadfactor=1 route=jvm2 

             </proxy>

注:1、ProxyRequests Off 是告诉Apache需要使用反向代理;

2、<proxy balancer://cluster>用于配置工作在集群中的节点列表,这里的“cluster”必须与上面的集群名保持一致;

3、Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口;

4、loadfactor是负载因 子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都 是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发;

5、route参数对应后续tomcat配置中的引擎路径 (jvmRoute)。

7、重新启动Apache服务,在浏览器中访问:http:10.10.141.40,你会发现得到了一个503的错误,内容如下:

Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime orcapacityproblems. Please try again later

打开刚刚配置的错误文件,我们会发现如下信息:

.......

[Mon Jun 18 17:59:16 2012] [error] (OS 10061)由于目标机器积极拒绝,无法连接。  : proxy: AJP: attempt to connect to 10.10.141.40:8009 (10.10.141.40) failed

              [Mon Jun 18 17:59:16 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.40)

              [Mon Jun 18 17:59:16 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.40

              [Mon Jun 18 17:59:23 2012] [error] (OS 10060)由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

: proxy: AJP: attempt to connect  to 10.10.141.39:8009 (10.10.141.39) failed

              [Mon Jun 18 17:59:23 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.39)

              [Mon Jun 18 17:59:23 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.39

从上面的信息我们可以知道:连接 10.10.141.40 和 10.10.141.39 两台服务器失败,原因是还没有启动Tomcat造成的。

8、配置Tomcat----server.xml文件

8.1、如果是2个Tomcat处于不同的机器上,就不需要修改任何端口;只是需要把<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">注释符放开,同时将<Engine name="Catalina" defaultHost="localhost">注释掉;

8.2、对于10.10.141.40的机器,将<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">,怎么知道要改成这样呢,看下面的配置:

ProxyRequests Off 

             <proxy balancer://cluster> 

                    BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1

                    BalancerMember ajp://10.10.141.40:8009 loadfactor=1 route=jvm2 

             </proxy>

在我的配置中,10.10.141.40对应的是:route=jvm2 ;

注:jvmRoute对应Apache httpd.conf中BalancerMember中配置的route参数。

        8.3、对于Tomcat安装在同一台机器上的情况,则需要做端口修改工作,同时上面的配置可以修改为如下情形:

ProxyRequests Off 

             <proxy balancer://cluster> 

                    BalancerMember ajp://localhost:8009loadfactor=1 route=jvm1

                    BalancerMember ajp://localhost:9009loadfactor=1 route=jvm2 

             </proxy>

接下来修改<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,将jvm2对应的Tomcat配置修改为<Connector
port="9009" protocol="AJP/1.3" redirectPort="8443" />。

注:端口对应 Apache httpd.conf中BalancerMember中配置的ajp连接端口。

8.4、将<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>的注释放开,目的是可以在集群中的所有tomcat节点间共享会话(Session)。

8.5、配置Connector的端口,把jvm2设置为在9080端口侦听,保证2个Tomcat的监听端口的不同。

8.6、server.xml文件配置完毕后,我们放入一个简单的java项目应用测试,两个目的:

a:测试session信息是否丢失,即同一个请求在不同刷新过程中是否改变,如果改变则配置失败,反之配置成功;

b:测试session是否在集群中的各个节点中成功复制,复制成功则才能实现集群的目的:负载均衡;

                 在此引用一个网络上的测试session的例子:

在每个Tomcat的webapps目录下新建test目录,在test目录下新建test.jsp文件,代码如下:

  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%@ page import="java.util.*" %>
  3. <html><head><title>Cluster App Test</title></head>
  4. <body>
  5. Server Info:
  6. <%
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
  8. <%
  9. out.println("<br> ID " + session.getId()+"<br>");
  10. String dataName = request.getParameter("dataName");
  11. if (dataName != null && dataName.length() > 0) {
  12. String dataValue = request.getParameter("dataValue");
  13. session.setAttribute(dataName, dataValue);
  14. }
  15. out.print("<b>Session 列表</b>");
  16. Enumeration e = session.getAttributeNames();
  17. while (e.hasMoreElements()) {
  18. String name = (String)e.nextElement();
  19. String value = session.getAttribute(name).toString();
  20. out.println( name + " = " + value+"<br>");
  21. System.out.println( name + " = " + value);
  22. }
  23. %>
  24. <form action="test.jsp" method="POST">
  25. 名称:<input type=text size=20 name="dataName">
  26. <br>
  27. 值:<input type=text size=20 name="dataValue">
  28. <br>
  29. <input type=submit>
  30. </form>
  31. </body>
  32. </html>

8.7、在test目录下新建WEB-INF目录和web.xml,在<web-app>节点下加入<distributable />,通知Tomcat在当前应用集群中的所有节点间实现Session共享。

8.8、启动两个Tomcat节点和Apache服务,进行测试,在浏览器中输入:http://10.10.141.40/test/test.jsp

测试结果:

1、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm2

                    Session 列表1 = 1

2、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm1

                    Session 列表1 = 1

3、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm2

                    Session 列表1 = 1

                    2 = 3

4、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm1

                    Session 列表1 = 1

                    3 = 4

                    2 = 3

注:1、由于博客有时候上传执行图片有点不尽人意,所以这里摘录了几条数据,进行说明;

2、通过这些数据可以知道,前面的sessionId是固定没变得,当我们不停的点击提交时,小数点后面的内容变了,实际上可以知道是哪个节点处理了当次请求,说明sessionId在各个节点的复制成功了,达到了我们预想的测试目的b;

3、通过每条数据下得Session 列表可以知道:当我们增加新的数据的时候,前面存入session里面的数据并没有丢失,说明我们预想测试目的a成功了;

              4、其实我们从两个Tomcat的控制台也可以看得出来,sessionId在不同节点是相同的;

5、关闭掉任何一个节点,请求都可以执行,而且sessionId是不变的。

 四:集群问题现象

1、当我将SpringMVC+Spring Security+Hibernate项目(该项目在单个Tomcat服务下没有任何问题)放在集群中的每个Tomcat节点下,偶尔会出现异常,即:系统登录成功后会自动退出,查看了Tomcat的控制台,发现SessionId不一致,SessionId没有复制成功,不知道这种情况各位大牛是否遇到过?(最近发现这篇文章不错,也许可以解决session的相关统一问题)

2、偶尔测试的时候,在test页面上根本获取不到处理节点的名称(如:jvm1、jvm2)?

Apache负载均衡与Tomcat集群配置学习(Windows环境)的更多相关文章

  1. apache、mod_jk负载均衡与tomcat集群

    最近需要搭建apache和tomcat的集群,实现静态网站直接通过apache访问,动态网站转交给tomcat处理,实现负载均衡和tomcat集群配置. apache安装 wget http://ap ...

  2. Tomcat集群配置学习篇-----分布式应用

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  3. 转载 Tomcat集群配置学习篇-----分布式应用

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  4. 161028、Nginx负载均衡实现tomcat集群方案简要小结

    重点两部分:一.负载均衡二.tomcat集群 所谓tomcat集群,就是可以向外提供并行服务的多台机器,任何一台服务器宕机,其它服务器可以替代它向外提供服务,而不影响用户访问. Nginx是一个常用的 ...

  5. Nginx+Keepalived+Tomcat高可用负载均衡,Zookeeper集群配置,Mysql(MariaDB)搭建,Redis安装,FTP配置

    JDK 安装步骤 下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html rpm ...

  6. nginx实现高性能负载均衡的Tomcat集群

    1. 安装软件: nginx 两个apache-tomcat 安装过程省略. 2.配置两个tomcat的http端口,第一个为18080,第二个为28080 注意:需要把server.xml文件中所有 ...

  7. Apache+Tomcat部署负载均衡(或集群)

    本来只打算写Tomcat集群部署,简化Apache和Tomcat整合过程的.后来想了想,这样不便于没有用过Apache的朋友来学习本文内容.于是干脆加大篇幅,让对Apache不了解的朋友能对Apach ...

  8. window xp Apache与Tomcat集群配置--转载

    转载地址:http://www.cnblogs.com/obullxl/archive/2011/06/09/apache-tomcat-cluster-config.html 一. 环境说明 Win ...

  9. Apache+tomcat集群配置

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

随机推荐

  1. Linux 查看负载

    top  iostat -x 1 10 free uptime cat /proc/cpuinfo cat /proc/meminfo src lsof 1,查看磁盘 df -h 2,查看内存大小 f ...

  2. POJ1151 Atlantis 扫描线算法

    题目大意 给出几个矩形对角端点坐标,求这些矩形整体覆盖的面积. 扫描线算法 整个平面被每个矩形的水平边所在直线(以后简称“水平线”)分成了几个部分,而整体覆盖面积则为每相邻的两个水平线间夹的长度(以后 ...

  3. hdoj--5621--KK's Point(简单数学)

    KK's Point Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  4. nyoj--79--导弹拦截(动态规划)

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任 ...

  5. 转四种常见的post请求

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  6. Path Sum II 总结DFS

    https://oj.leetcode.com/problems/path-sum-ii/ Given a binary tree and a sum, find all root-to-leaf p ...

  7. 快速排序c++实现 快排C++代码实现

    快速排序c++实现 快排C++ 第一.算法描述 快速排序由C. A. R. Hoare在1962年提出,该算法是目前实践中使用最频繁,实用高效的最好排序算法, 快速排序算法是采用分治思想的算法,算法分 ...

  8. Core篇——初探IdentityServer4(客户端模式,密码模式)

    Core篇——初探IdentityServer4(客户端模式,密码模式) 目录 1.Oatuth2协议的客户端模式介绍2.IdentityServer4客户端模式实现3.Oatuth2协议的密码模式介 ...

  9. 企业级Spring应用的搭建

    本次博客将要对SpringMVC做简单的介绍以及环境的搭建: 概述 Spring 框架是一个开源的平台,属于设计层面框架,整个系统面向接口,是分层的JavaSE/EE开源框架,用于解决复杂的企业应用开 ...

  10. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...