反向代理负载均衡(Apache + Tomcat集群)

百度知道中关于负载均衡的定义:负载均衡的意思就是有几台服务器或者几个服务,通过设备或者软件,将外部来的连接均匀的分配到这几个服务器或者服务上面,使服务器的负载平均,使外部访问基本达到快速。

     负载均衡又分为硬负载和软负载,硬负载通过特定的负载均衡器硬件来设置;软负载又分为应用负载、NDS负载、反向代理负载等。Apache2.2中自带的proxy_mod模块实现了反向代理负载。

     简单模拟一下负载均衡:

     一台Win2003服务器,IP172.29.128.1,上面安装了Apache2.2,两个Tomcat5.5,用Apache作负载均衡器,实现Tomcat服务器的负载均衡。

                        Apache2.2

                                 |

                                 |

                              /     /

                           /             /

                  Tomcat1     Tomcat2

     为了使两个tomcat可以在一台机器上工作,需要对端口做一些修改:

1)         打开tomcat1server.xml,将<Engine name="Catalina" defaultHost="localhost">改为

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

2)         打开tomcat2server.xml,将<Engine name="Catalina" defaultHost="localhost">改为

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

3)         tomcat2中的<Server port="8005" shutdown="SHUTDOWN">改为<Server port="9005" shutdown="SHUTDOWN">

4)         tomcat2中的<Connector port="8080" maxHttpHeaderSize…改为<Connector port="9080"…redirectPort="8443"改为redirectPort="9443"

5)         tomcat2中的<Connector port="8080" maxHttpHeaderSize…改为<Connector port="9080" maxHttpHeaderSize…redirectPort="8443"改为redirectPort="9443"

6)         tomcat2中的<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />改为<Connector port="9009" enableLookups="false" redirectPort="9443" protocol="AJP/1.3" />

     将准备好的测试应用部署在两个tomcatwebapps下,我很无耻的抄袭了这个测试应用TomcatDemo

     TomcatDemo/ WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

<display-name>TomcatDemo</display-name>

</web-app>

TomcatDemo/index.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>");%> <% String jsessionid = session.getId(); out.println("<br> ID " + jsessionid+"<br>"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session 列表</b>"); 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); } out.println("Tomcat1"); %> <form action="/TomcatDemo/index.jsp" method="POST"> 名称:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body>

 

tomcat2index.jspout.println("Tomcat1")改为out.println("Tomcat2")

 

配置Apache2.2

1)         打开httpd.conf,引入

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

2)         加入

ProxyRequests Off

ProxyPass /TomcatDemo balancer://localhost/

<Proxy balancer://localhost/>

       BalancerMember ajp://localhost:8009/TomcatDemo route=tomcat1 loadfactor=50

       BalancerMember ajp://localhost:9009/TomcatDemo route=tomcat2 loadfactor=50

</Proxy>

其中80099009tomcat AJP协议的端口。

 

     以上配置完成,先启动两个tomcat,运行测试成功后启动apache;在浏览器中输入http://localhost/TomcatDemo即可看到测试页面,每次刷新均访问了不同的tomcat服务器,如果其中一个宕机,则仅访问正常的那个。

         但是事情并没有这么简单,每次提交后,先前保存的会话内容都会丢失,这显然不是我们想要的结果。

         提到负载均衡就应当说说集群,把上面的架构加入集群就可以实现tomcat中的会话复制:

                      Apache2.2

                                 |

                                 |

                         Cluster

                          /       /

                       /            /

              Tomcat1     Tomcat2

         Tomcat官方文档上有关于tomat5.5集群配置的详细说明:http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html简单的配置就是将连个tomcatCluster放开,将tomcat2tcpListenPort="4001"改为tcpListenPort="9001"。注意两个tomcatMembership配置一定要相同,而且mcastAddr必须是多播地址。然后在TomcatDemo/ WEB-INF/web.xml中加入<distributable/>以上配置完成,启动tomcat1成功后再启动tomcat21.TomcatA starts up  2.TomcatB starts up (Wait that TomcatA start is complete) ),而后启动apache,运行测试,可以看到这次提交后集群间复制了会话。

 

         再次对架构做个小小的诠释:

                                       Apache2.2(balance)

                                            /                      /

                                          /                          /

 Apache2.2(balance)           Apache2.2(balance)

                                 |                                   |               

                                 |                                   |

                        Cluster1      Cluster2

                          /     /                                  /     /

                       /           /                             /         /

              Tomcat1     Tomcat2         Tomcat3    Tomcat4  

 

         在另一台win2003服务器(IP172.29.128.2)上部署应用,所有步骤和配置文件与第一台win2003一致即可;为了便于直观查看,仅需要把index.jspout.print(“Tomcat1”)改为out.print(“Tomcat3”)out.print(“Tomcat4”)

         在第三台win2003服务器(IP172.29.128.3)上安装Apache2.2

1)         打开httpd.conf,引入

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

2)         加入

ProxyRequests Off

ProxyPass /TomcatDemo balancer://localhost/ stickysession=jsessionid nofailover=On

<Proxy balancer://localhost/>

       BalancerMember http://172.29.128.1:80/TomcatDemo loadfactor=50

       BalancerMember http://172.29.128.2:80/TomcatDemo loadfactor=50

</Proxy>

         配置完成,启动172.29.128.3apache,在浏览器中输入http://localhost/TomcatDemo,提交请求后可看到session保存了所有信息。

 

 

 

你可能感兴趣的:(apache,tomcat,负载均衡,String,Module,服务器)