apache+tomcat集群01 HTTP代理模式

前篇简单对集群进行了说明,其中apache服务器和tomcat的连接方法其实有三种:JK、http_proxy和ajp_proxy。本文主要介绍http_proxy方式。

一、需要的软件包

JDK:jdk-6u7-linux-i586.bin

Apache:apache_2.2.25-win32-x86-openssl-0.9.8k

Tomcat:apache-tomcat-6.0.16.tar.gz

二、Apache 安装说明:   

我们知道Apache的东西我们都可以从http://apache.org/网站上找到。

Apache是http服务器,我们利用其对Tomcat进行负载均衡,安装后安装过程中要配置域名、网址和管理员邮箱之类的信息,这个信息完全可以按照提示,然后修改下填入即可,之后想修改的话直接到配置文件中改就行了。除了这个地方,还要保证机器上的80端口没有被其他程序占用,安装成功后,系统右下角的托盘区会有个图标,我们可以通过这个启动apache,如果那个小红点变成绿色,说明服务已经正常启动了(如果服务没有启动起来,说明安装过程中的配置有错误,建议卸载后重装)。如果按照默认,端口是80的话,那打开浏览器,输入:http://localhost/ ,应该可以看到 " It works “的字样。这样就可以进入下一步了。

Tocmat有6和7。经测试,2个版本的Apache负载均衡配置过程都是一样的,因此下面的配置在Tomcat6或7集群是通用的。但是按照下面的配置,集群中Tomcat不能既有Tomcat6又有Tomcat7,否则虽能够负载均衡,但不能进行session复制,不知其他方式配置的集群是否可以。

三、配置

修改Apache安装目录的conf目录下的httped.conf文件

1、  加载module

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

2、  继续添加如下配置

ProxyPass / balancer://loadbalancer/
ProxyPassReverse / balancer://loadbalancer/
<Proxy balancer://loadbalancer/>
BalancerMember http://localhost:8081/
BalancerMember http://localhost:8082/
BalancerMember http://localhost:8083/
</Proxy>

3、  配置tomcat容器

参见:tomcat集群中实现Session共享

四、测试

新建test.jsp页面

<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>Cluster App Test</title>
</head>
<body>
	Server Info:
	<%
	out.println(request.getLocalAddr() + " : " + request.getLocalPort() + "<br>");
%>
	<%
		out.println("<br> ID " + session.getId() + "<br>");
		// 如果有新的 Session 属性设置
		String dataName = request.getParameter("dataName");
		if (dataName != null && dataName.length() > 0) {
			String dataValue = request.getParameter("dataValue");
			session.setAttribute(dataName, dataValue);
		}
		out.println("<b>Session 列表</b><br>");
		System.out.println("============================");
		Enumeration e = session.getAttributeNames();
		while (e.hasMoreElements()) {
			String name = (String) e.nextElement();
			String value = session.getAttribute(name).toString();
			out.println(name + " = " + value + "<br>");
			System.out.println(name + " = " + value);
		}
	%>
	<form action="test.jsp" method="POST">
		名称:<input type=text size=20 name="dataName"> <br> 值:<input
			type=text size=20 name="dataValue"> <br> <input
			type=submit>
	</form>
</body>
</html>

 将项目部署到3个服务器,然后分别启动Apache和3个Tocmat服务器,这些Tomcat启动顺序随意,然后打开http://localhost/TestTomcat/test.jsp

apache+tomcat集群01 HTTP代理模式

F5刷新结果如下:

apache+tomcat集群01 HTTP代理模式

apache+tomcat集群01 HTTP代理模式

多次刷新页面的sessionID看是同一个ID,说明session是复制成功了。那么session中的存储的东西呢,在输入框中分别输入1、1,2、2,3、3后,显示结果如下图:

apache+tomcat集群01 HTTP代理模式

apache+tomcat集群01 HTTP代理模式

apache+tomcat集群01 HTTP代理模式

以上的测试说明,集群中的session已经共享,每个集群对于同一访问均有相同的session,而且session中存储的变量也复制了。

五、节点插拔测试

插拔意思是应该保证当运行的集群中某节点中关闭或者启动时,集群正常工作并且节点能够正常工作。

        关闭Tomcat2,刷新页面,则不断访问Tocmat1和Tomcat3,再关闭Tomcat1后,则只访问一个Tomcat3,说明节点关闭时运行正常。

如果重启Tomcat2,无论怎么刷新,始终访问Tomcat3,难道Apache不能将请求转发给中途启动的Tomcat2。这时利用另外台机器访问页面,发现Tomcat2正常,然后在刷本地页面,又可以访问Tomcat2了。

从上面可以看出Apache的负载均衡时的算法了,对于每个新来的session,Apache按照节点配置中的lbfactor比重选择访问节点,如果某节点node1不能访问,则寻找下一可访问节点,并且将此node1就在该访问session的访问黑名单中,以后该session的访问直接不考虑node1,即使node1又可以访问了。而新来的session是无黑名单的,如果新的session能够访问到node1了,则会将node1在其他所有session访问的黑名单删除,这样其他session就又能访问node1节点了。

 

相关推荐