mod_proxy方式Tomcat负载均衡原理详解及配置

宁鹏程
2023-12-01

使用Tomcat的童鞋们注意了。为了增加tomcat的性能和稳定性,我们一般采用balance

session同步机制。下图列出了我们常用也是最简单的解决方案。说明 1 balance

负载均衡我们一般采用Apache proxyApachemod_jk方式

所使用软件: Apache2.2.19 http://httpd.apache.org/download.cgi#apache22 ;

Tomcat7            http://tomcat.apache.org/download-70.cgi

1.1 mod_proxy方式 mod_proxy是一种分工合作的的形式,通过主服务器跳转到各台主

机负责不同的任务而实现任务分工,这种形式不能实现负载均衡,只能提供主服务器的

访问跳转

修改apachehttpd.conf文件配置

 

打开httpd.conf文件,取消下面四行的注释,用以打开代理所需的.so支持模块。

View Code

1   #LoadModule proxy_http_module modules/mod_proxy_http.so

2   #LoadModule proxy_connect_module modules/mod_proxy_connect.so

3   #LoadModule proxy_module modules/mod_proxy.so

4   #Include conf/extra/httpd-vhosts.conf

复制代码

 

打开文件conf\extra\httpd-vhosts.conf,可以看到如下代码:

View Code

 1   #

 2   # Use name-based virtual hosting.

 3   #

 4   NameVirtualHost *:80

 5 

 6   #

 7   # VirtualHost example:

 8   # Almost any Apache directive may go into a VirtualHost container.

 9   # The first VirtualHost section is used for all requests that do not

10   # match a ServerName or ServerAlias in any  < VirtualHost >  block.

11   #

12   < VirtualHost  *:80 >

13       ServerAdmin webmaster@dummy-host.leader89

14       DocumentRoot "C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host.leader89"

15       ServerName dummy-host.leader89

16       ServerAlias www.dummy-host.leader89

17       ErrorLog "logs/dummy-host.leader89-error.log"

18       CustomLog "logs/dummy-host.leader89-access.log" common

19   </ VirtualHost >

20 

21   < VirtualHost  *:80 >

22       ServerAdmin webmaster@dummy-host2.leader89

23       DocumentRoot "C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host2.leader89"

24       ServerName dummy-host2.leader89

25       ErrorLog "logs/dummy-host2.leader89-error.log"

26       CustomLog "logs/dummy-host2.leader89-access.log" common

27   </ VirtualHost >

复制代码

 

根据需要更改<VirtualHost>节点内的参数。

说明: NameVirtualHost *:80<VirtualHost *:80>中的*为当前服务器IP,如果有

固定IP可以用IP*替换掉,我这里使用的是动态IP,所以用*,我看apache帮助文档的

时候,一直认为这里的*为对应的域名,这个想法应该是错误的,因为我填上域名的时

候一直没有设置成功。ServerName这个填域名,DocumentRoot ServerName上域名对

应的根目录。

 

注:

如果访问域名出现403权限错误,且对应的文件夹everyone的权限都是全部控制,则问

题出在httpd.conf上。

编辑httpd.conf,找到DocumentRoot "C:/Program Files/Apache Software

Foundation/Apache2.2/htdocs"这项,这是默认根目录路径,但是要更改的不是这个,

一直往下找,找到<Directory />节点,然后在节点结束后加上:

View Code

 1   < Directory  "C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host.leader89" >

 2   Options Indexes FollowSymLinks

 3   AllowOverride all

 4   Order Allow,Deny

 5   Allow from all

 6   </ Directory >

 7   < Directory  "C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host2.leader89" >

 8   Options Indexes FollowSymLinks

 9   AllowOverride all

10   Order Allow,Deny

11   Allow from all

12   </ Directory >

复制代码

 

这里的"C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host.leader89""C:/Program Files/Apache Software Foundation/Apache2.2/docs/dummy-host2.leader89"为前面VirtualHost

的路径。

保存httpd.confhttpd-vhosts.conf,然后重启Apache

然后访问dummy-host.leader89打开的是C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host.leader89目录,

访问dummy-host2.leader89的是C:/Program Files/Apache Software

Foundation/Apache2.2/docs/dummy-host2.leader89目录,

实现了单IP多域名多站点的功能。

1.2 mod_proxy_blancer方式 mod_proxy_balancermod_proxy的扩展,提供负载平衡

支持,通过mod_proxy_balancer.so包实现负载平衡,公司生产服务器暂时就采用这种

方式。

修改apachehttpd.conf文件配置

 

打开httpd.conf文件,取消下面四行的注释,用以打开代理所需的.so支持模块。

View Code

 

1

 

#LoadModule proxy_http_module modules/mod_proxy_http.so

 

2

 

#LoadModule proxy_connect_module modules/mod_proxy_connect.so

 

3

 

#LoadModule proxy_module modules/mod_proxy.so

 

4

 

#LoadModule proxy_module modules/mod_proxy_blancer.so

复制代码

 

httpd.conf文件最后添加以下代码:

View Code

 

1

ProxyPass / balancer://proxy/ #注意这里以"/"结尾    

2 

Proxybalancer://proxy 

3 

BalancerMember http://127.0.0.1:8080/ loadfactor=3 #BalancerMember及其后面

URL表示要配置的后台服务器、test表示该服务器下的项目名称 

4 

BalancerMember http://127.0.0.1:8081/ loadfactor=1 #参数”loadfactor”表示后

台服务器负载到由Apache发送请求的权值,该值默认为1    

5 

</Proxy  

复制代码

 

将下载的tomcat压缩包解压两份,分别命名为tomcat1tomcat2。修改tomcat2

conf/server.xml中部分端口号(因为我在本机做测试,所以为了解决端口号被占用的问

题修改tomcat2的端口号,使tomcat1tomcat2能够同时启动,实现多服务器;如果有

多台PC服务器可不必修改),修改内容如下:

View Code 

………… 

Serverport="9005" shutdown="SHUTDOWN"

 #此处修改为9005,避免与tomcat18005冲突 

………… 

…………   

Connectorport="8081" protocol="HTTP/1.1"  connectionTimeout="20000"   redirectPort="8443"/>

 #此处修改为8081,避免与tomcat18080冲突 

…………   

<!--

 Define an AJP 1.3 Connector on port 8009

-->   

Connectorport="9009" protocol="AJP/1.3" redirectPort="8443"/>

 #此处修改为9009,避免与tomcat18009冲突。如果使用的是mod_proxy_blancer方式

此处可以注释掉,如果使用的是mod_jk方式则此处必须存在

 …………     

ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

 #去掉该行注释即可实现session复制功能 

…………

复制代码 

1)轮询均衡策略的配置 

ProxyPass / balancer://proxy/ 

Proxybalancer://proxy 

BalancerMember http://127.0.0.1:8080/ 

BalancerMember http://127.0.0.1:8081/

</Proxy  

 

实现负载均衡的原理如下:

 

假设Apache接收到http://localhost/test请求,由于该请求满足ProxyPass条件(URL

前缀为“/"),该请求会被分发到后台某一个BalancerMember,譬如,该请求可能会转发

http://127.0.0.1:8080/ 进行处理?当第二个满足条件的URL请求过来时,该请求可

能会被分发到另外一台BalancerMember,譬如,可能会转发到http://127.0.0.1:8081/

如此循环反复,便实现了负载均衡的机制?

 

2)按权重分配均衡策略的配置

ProxyPass / balancer://proxy/ 

Proxybalancer://proxy>    

BalancerMember http://127.0.0.1:8080/ loadfactor=3 

BalancerMember http://127.0.0.1:8081/ loadfactor=1 

</Proxy 

参数"loadfactor"表示后台服务器负载到由Apache发送请求的权值,该值默认为1,可以

将该值设置为1100之间的任何值?以上面的配置为例,介绍如何实现按权重分配的负

载均衡,现假设Apache收到http://myserver/test 4次这样的请求,该请求分别被负载到

后台服务器,则有3次连续的这样请求被负载到BalancerMember

http://127.0.0.1:8080/的服务器,1次这样的请求被负载BalancerMember

http://127.0.0.1:8081/后台服务器?实现了按照权重连续分配的均衡策略?

 

3)权重请求响应负载均衡策略的配置

ProxyPass / balancer://proxy/  lbmethod=bytraffic

 Proxybalancer://proxy 

BalancerMember http://127.0.0.1:8080/ loadfactor=3 

BalancerMember http://127.0.0.1:8081/ loadfactor=1 

</Proxy 

参数“lbmethod=bytraffic"表示后台服务器负载请求和响应的字节数,处理字节数的多

少是以权值的方式来表示的? loadfactor"表示后台服务器处理负载请求和响应字节

数的权值,该值默认为1,可以将该值设置在1100的任何值?根据以上配置是这么进行均

衡负载的,假设Apache接收到http://myserver/test请求,将请求转发给后台服务器,

BalancerMemberhttp://127.0.0.1:8080/后台服务器负载到这个请求,那么它处

理请求和响应的字节数是BalancerMemberhttp://127.0.0.1:8081/服务器的3(

(2)均衡配置,(2)是以请求数作为权重负载均衡的,(3)是以流量为权重负载均衡的,

是最大的区别)?

 

至此配置以完成

 

tomcat1webapps文件夹下新建test项目文件夹,test目录下新建如下页面

View Code 

<%@ 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); 

   } 

%> 

formaction="test.jsp" method="POST" 

    名称:inputtype=textsize=20name="dataName"    

br 

    :inputtype=textsize=20name="dataValue"    

br   

inputtype=submit  

</form 

</body 

</html

复制代码

 

如需session复制功能此步骤为必须操作

 

打开项目的WEB-INF下的web.xml</web-app>内添加<distributable/>标签,如果没有

则手动建立目录结构

View Code

 

web-appxmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"    

display-name

TomcatDemo

</display-name  

distributable/>

 #一般均放在web-app结束节点上一行 

</web-app

复制代码

 

tomcat1下的test项目复制一份到tomcat2webapps目录下

至此所有操作已完成 

 

启动tomcat1tomcat2apache。打开浏览器,输入http://localhost/test/test.jsp

回车,刷新几次即可从tomcat1tomcat2的控制台看到负载效果。输入session即可看

session复制效果

 类似资料: