chenhua_1984 发表于 2013-1-29 21:57:29

apache2.2+tomcat6.0.18配置负载均衡

<!--   ><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><!-->
<div class="Section0">1) 下载apache httpd和apache tomcat,并安装
2) 配置apache
修改conf/httpd.conf文件
去掉以下文本前的注释符#,以便让Apache在启动时自动加载
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_http_module modules/mod_proxy_http.so
 
找到 Include conf/extra/httpd-vhosts.conf并去掉前面的#
 
打开conf/extra/httpd-vhosts.conf,并添加以下内容
ProxyRequests Off
<proxy balancer://capaacluster>
    BalancerMember http://127.0.0.1:8080 loadfactor=1 route=jvm1
    BalancerMember http://127.0.0.1:9080 loadfactor=1 route=jvm2
ProxySet stickysession=JSESSIONID
ProxySet lbmethod=bybusyness/byrequests/bytraffic
</proxy>
 
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.capaa.com
    ServerName 172.16.5.22
    ServerAlias www.dummy-host.capaa.com
    ProxyPass / balancer://capaacluster/
    ProxyPassReverse / balancer://capaacluster/
    ErrorLog "logs/172.16.5.22-error.log"
#    CustomLog "logs/172.16.5.22-access.log" common
    CustomLog "logs/172.16.5.22-access.log" "%{JSESSIONID}C %{BALANCER_SESSION_STICKY}e %{BALANCER_SESSION_ROUTE}e %{BALANCER_WORKER_ROUTE}e %{BALANCER_ROUTE_CHANGED}e %{Set-Cookie}o"
</VirtualHost>
 
保存,apache配置完毕。并重启apache
 
3) 配置tomcat
解压tomcat,并复制一份,分别称为t1, 2
分别修改tomcat1和tomcat2的server.xml,使其监听的端口不冲突
 
找到<Server port="8005" shutdown="SHUTDOWN">,t1不变,把t2改为9005
 
配置Connector的端口,找到non-SSL HTTP/1.1 Connector,即tomcat单独工作时的默认Connector,保留t1默认配置,在8080端口侦听,
而把t2设置为在9080端口侦听
 
AJP 1.3 Connector,<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,
这是tomcat接收从Apache过来的ajp连接请求时使用的端口,保留t1默认设置,把t2端口改为9009
找到<Engine name="Catalina" defaultHost="localhost">,去掉这段或改为注释,把上方紧挨的<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">注释符去掉,对于t2,去掉注释符并把jvm1改为jvm2。这里的jvmRoute对应Apache httpd.conf中BalancerMember中配置的route参数
找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,打开注释,这里的配置是为了可以在集群中的所有tomcat节点间共享会话(Session)
 
4) 测试app
分别在t1和t2的webapp目录下新增一个test app,并新增一个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>"); 
  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);
   }
%>
  <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>
 
修改此test app的web.xml文件,在<web-app>节点下加入<distributable />
 
访问http://172.16.5.22/test/test.jsp 页面会显示相应的信息,是哪个tomcat处理了请求,当前session中的数据等
 
--------jessionid无效的问题
关键字: java apache load balance
这是 apache部分的配置
 
<Proxy balancer://proxy>
       BalancerMember ajp://127.0.0.1:8009/  loadfactor=1 route=tomcat1
       BalancerMember ajp://127.0.0.1:8010/  loadfactor=1 route=tomcat2
</Proxy>
 <VirtualHost   *:80>
 ServerName www.a.com
 ServerAlias   www.a.com
 ProxyPass / balancer://proxy/ stickysession=JSESSIONID nofailover=On lbmethod=bytraffic
        ProxyPassReverse / balancer://proxy/
  </VirtualHost> 
 
Server.xml分别是
 
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
 
我在两个的ROOT文件夹下都放一个 test.jsp 分别输出不同的标识.
但刷新的时候,就会发现apache把请求分别发给 tomcat1 tomcat2. stickysession失败了. .这是为什么呢??? 哪位帮忙看看...
 
===========================================
以下为正确配置
 
 <VirtualHost   *:80>
 
 ServerName www.a.com
 ServerAlias   www.a.com
 ProxyPass / balancer://proxy/ stickysession=JSESSIONID
 ProxyPassReverse / balancer://proxy/
 <Proxy balancer://proxy>
        BalancerMember http://192.168.1.192:8080/  loadfactor=1 route=tomcat1
        BalancerMember http://192.168.1.192:8081/  loadfactor=2 route=tomcat2
 </Proxy>
 </VirtualHost> 
 
页: [1]
查看完整版本: apache2.2+tomcat6.0.18配置负载均衡