Apache和Tomcat 配置负载均衡(mod-proxy方式)(可用)

mod-proxy方式实现负载均衡是利用了Apache 2.x版本自带的mod_proxy模块使用代理技术来连接Tomcat;

http_proxy模式基于HTTP协议,要求Tomcat提供HTTP服务,也就是必须启用Tomcat的HTTP Connector;

ajp_proxy模式基于AJP协议,要求Tomcat提供AJP服务,也就是必须启用Tomcat的AJP Connector;


Apache2.2版本之后对mod-proxy模块进行了重写,增强了其功能和稳定性.配置简单,使用广泛.

网上也有大量的相关文章.其具体包括http-proxy,ajp-proxy,ftp-proxy等方式.


采用mod-proxy的连接方式,Apache需要加载以下模块:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule manager_module modules/mod_manager.so


下面介绍http-proxy,ajp-proxy两种最常用的方式.

一、准备工作

1) 软件准备

Apache 2.2.25: http://httpd.apache.org/download.cgi

Tomcat 6.0.39: http://tomcat.apache.org/download-60.cgi


2) 软件安装

Windows下安装Apache,并测试服务器正常工作;

Linux下安装 Apache 可参考: http://blog.csdn.net/wangjunjun2008/article/details/38314387;

Tomcat解压缩,分别命名为tomcat1和tomcat2;并启动tomcat测试其正常工作。


二、全局配置

1) 编辑${HTTPD_HOME}/conf/httpd.conf文件,开启以下模块,以便让Apache启动时自动加载:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule manager_module modules/mod_manager.so


2) 编辑${HTTPD_HOME}/conf/httpd.conf文件,找到<IfModule dir_module>,在DirectoryIndex index.html 后加上 index.jsp; 

这一步只是为了配置完tomcat后能看到小猫首页,可以不做。


3) 分别修改tomcat1和tomcat2的server.xml文件,修改如下标签的端口及,并添加jvmRoute属性:

tomcat1修改后的内容:

<Server port=”8010“ shutdown=”SHUTDOWN”>

<Connector port=”8080“ protocol=”HTTP/1.1” … redirectPort=”8443” />

<Connector port=”8090“ protocol=”AJP/1.3” redirectPort=”8443” />

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


tomcat2修改后的内容:

<Server port=”8011“ shutdown=”SHUTDOWN”>

<Connector port=”8081“ protocol=”HTTP/1.1” … redirectPort=”8443” />

<Connector port=”8091“ protocol=”AJP/1.3” redirectPort=”8443” />

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


三、负载均衡配置

对于http_proxy方式,配置如下:

ProxyPass / balancer://httpproxy/

<Proxy balancer://httpproxy/>

  BalancerMember http://127.0.0.1:8080/

  BalancerMember http://127.0.0.1:8081/

</Proxy>

#配置负载均衡管理界面;访问地址为 http://localhost/balancer-manager/

<Location /balancer-manager>

  SetHandler balancer-manager

  order Allow,Deny

  #Deny from All

  Allow from 127.0.0.1

</Location>


【说明】

“httpproxy”是集群名称(可为任意名称)

8080,8081分别对应tomcat的http协议端口;

如此,即可实现apache和tomcat基于http_proxy方式的负载均衡.


访问 http://localhost/balancer-manager 打开如下页面,


对于ajp_proxy方式,配置如下:

ProxyPass / balancer://ajpproxy/

<Proxy balancer://ajpproxy/>

  BalancerMember ajp://127.0.0.1:8090/

  BalancerMember ajp://127.0.0.1:8091/

</Proxy>

【说明】 8090,8091分别对应tomcat的ajp协议端口;

如此,即可实现apache和tomcat基于ajp_proxy方式的负载均衡.


访问 http://localhost/balancer-manager 打开如下页面,


如需具体控制负载均衡中各个节点的负载比例,则将以上配置作如下修改:

ProxyPass / balancer://ajpproxy/

<Proxy balancer://ajpproxy/>

  BalancerMember ajp://127.0.0.1:8090/ loadfactor=1 route=tomcat1

  BalancerMember ajp://127.0.0.1:8091/ loadfactor=2 route=tomcat2

</Proxy>

[说明]

loadfactor 是负载因子(取值范围是1~100),Apache会按照指定数字的比例分发请求(数值越大,处理的请求越多);

比如,两个tomcat的数字都是1,则按1:1的比例分发请求;若是2和1,则按2:1的比例分发请求;

“route=tomcat1” 是负载均衡的节点名称(可为任意名称,但不可重复);


四、添加测试代码

分别在tomcat1和tomcat2添加如下代码:

在${Tomcat_Home}/webapps/下新建test目录,在test目录下新建test.jsp文件,文件内容为:

  1. <%@ page contentType=“text/html; charset=GBK” %>  
  2. <%@ page import=“java.util.*” %>  
  3. <html>  
  4. <head>  
  5. </head>  
  6. <body>  
  7. <%  
  8.     out.println(“Server IP = “ + request.getLocalAddr() + ”<br>“);  
  9.     out.println(“Server Port = “ + request.getLocalPort() + ”<br>“);  
  10.     out.println(“<br>“);  
  11.     out.println(“SessionId = “ + session.getId() + ”<br>“);  
  12.     out.println(“<br>“);  
  13.       
  14.     String dataName = request.getParameter(“dataName”);  
  15.     if (dataName != null && dataName.length() > 0) {  
  16.         String dataValue = request.getParameter(“dataValue”);  
  17.         session.setAttribute(dataName, dataValue);  
  18.     }  
  19.   
  20.     out.print(“<b>Session 列表</b>“);  
  21.     Enumeration e = session.getAttributeNames();  
  22.     while (e.hasMoreElements()) {  
  23.         String name = (String)e.nextElement();  
  24.         String value = session.getAttribute(name).toString();  
  25.         out.println( name + ” = ” + value+”<br>“);  
  26.         System.out.println( name + ” = ” + value);  
  27.     }  
  28. %>  
  29.   
  30. <form action=“test.jsp” method=“POST”>  
  31.     名称:<input type=text size=20 name=“dataName”><br>  
  32.       值:<input type=text size=20 name=“dataValue”><br>  
  33.     <input type=submit>  
  34. </form>  
  35. </body>  
  36. </html>  
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html>
<head>
</head>
<body>
<%
    out.println("Server IP = " + request.getLocalAddr() + "<br>");
    out.println("Server Port = " + request.getLocalPort() + "<br>");
    out.println("<br>");
    out.println("SessionId = " + session.getId() + "<br>");
    out.println("<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目录下新建WEB-INF目录,在WEB-INF目录下新建web.xml,web.xml文件内容为:

  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2.   
  3. <web-app xmlns=“http://java.sun.com/xml/ns/javaee”  
  4.    xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  5.    xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee  
  6.         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”  
  7.    version=“2.5”>   
  8.   
  9.     <description>test</description>  
  10. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>

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

    <description>test</description>
</web-app>


五、进行负载均衡测试

启动Apache和tomcat1,tomcat2,访问http://localhost/test/test.jsp,

可以看到包括服务器地址、端口、SessionId等信息在内的页面,如下图:


[说明]

此处的SessionId多了”.tomcat0”,说明处理当前请求的服务器是节点为tomcat0的Tomcat;


如果需要向集群中增加节点,首先需要对新增的Tomcat作类似配置,然后修改${Apache_Home}/conf/httpd.conf 文件,增加BalancerMember,指向新增的tomcat即可。


                </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值