Apache+Tomcat 负载均衡 Session共享

一、本机环境

   1.Windows 7 32位操作系统

   2.java版本 "1.7"

   3.Apache安装包httpd-2.2.21-win32-x86-no_ssl.msi,默认安装

   4.tomcat7

   5.在一台机器上进行的

二、安装

   1.前提是Apache安装正确,启动正常

   2.解压缩多个tomcat,例如D:\Program Files\Apache Software Foundation

三、配置

   1.打开Apache根目录/conf/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
Include conf/extra/httpd-vhosts.conf

    2.在httpd.conf文件最后添加如下代码:

ProxyRequests Off
<proxy balancer://cluster>
	BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
	BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2        
    #The below is the hot standby
    #BalancerMember ajp://127.0.0.1:9999 status=+H #此为备份服务器,只需添加status=+H
    #ProxySet lbmethod=bytraffic  
 </proxy>
 

    3.打开Apache根目录/conf/extra/httpd-vhosts.conf文件,找到下列文字并注释 ,如下:

#<VirtualHost *:80>
#    ServerAdmin [email protected]
#    DocumentRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/docs/dummy-host.sm.com"
#   ServerName dummy-host.sm.com
#    ServerAlias www.dummy-host.sm.com
#    ErrorLog "logs/dummy-host.sm.com-error.log"
#    CustomLog "logs/dummy-host.sm.com-access.log" common
#</VirtualHost>

#<VirtualHost *:80>
#    ServerAdmin [email protected]
#    DocumentRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/docs/dummy-host2.sm.com"
#    ServerName dummy-host2.sm.com
#    ErrorLog "logs/dummy-host2.sm.com-error.log"
#    CustomLog "logs/dummy-host2.sm.com-access.log" common
#</VirtualHost>

    4.在httpd-vhosts.conf文件最后加入如下代码 (域名与路径根据自己需要配置):

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName localhost
    ServerAlias localhost
    ProxyPass / balancer://cluster/
    ProxyPassReverse / balancer://cluster/
    ErrorLog "logs/dummy-host2.sm.com-error.log"
    CustomLog "logs/dummy-host2.sm.com-access.log" common
</VirtualHost>

    注意:此处 balancer://cluster与第二步< proxy balancer://cluster > 相对应

    5.配置tomcat,修改conf/server.xml文件(注:本示例中用了两台Tomcat服务器与多台配置是相同的 )

    修改第二个tomcat(两个tomcat任意设置一个)

<Server port="8005" shutdown="SHUTDOWN">
将8005改为9005

<Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
将8080改为9080,将8443改为9443

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
将8009改为9009,将8443,改为9443

    6.所有Tomcat均做以下修改(conf/server.xml):

    a.找到<Engine name="Catalina" defaultHost= "localhost" >增加 jvmRoute属性如下:

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

    注意:jvmRoute属性值与第二步route=jvm*是相对应

    b.在<Engine name="." ..></Engine>标签中最后处添加以下代码:

    注意:对于这一步各个版本的Tomcat代码可能,具体可看http://localhost:8080/docs/cluster-howto.html

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="6">

          <Manager className="org.apache.catalina.ha.session.BackupManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"
                   mapSendOptions="6"/>
          <!--
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
          -->
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="5000"
                      selectorTimeout="100"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

    7.修改应用的web.xml,在<web-app>结束标签前追加 <distributable/>

    8.所有配置已经完毕,我们现在可以进行测试

    9.为了让效果更加明显,在各个Tomcat webapps\ROOT文件夹中添加index.jsp,代码如下:

<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>Cluster App Test</title>
</head>
<body>
<%
	out.println("Server Info::"+request.getLocalAddr() + ":" + request.getLocalPort()+"</br>");
	String jsessionid = session.getId();
	out.println("SESSION 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.println("<b>SESSION ATTRIBUTES:</b></BR>");
	Enumeration<String> e = session.getAttributeNames();
	while (e.hasMoreElements()) {
		String name = (String) e.nextElement();
		String value = session.getAttribute(name).toString();
		out.println("&nbsp;&nbsp;&nbsp;"+name + " = " + value + "<br>");
		System.out.println(name + " = " + value);
	}
	out.println("Tomcat*");//Tomcat1、Tomcat2....
%>
<form action="<%=request.getContextPath() %>/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>
 

    10.在浏览器中输入http://localhost,看看效果吧!刷新一下会有意外惊喜

    另可参考:http://www.cnblogs.com/sirc/archive/2011/05/17/2049307.html

猜你喜欢

转载自oma1989.iteye.com/blog/1747042