首页 > 代码库 > 负载均衡软件之Apache以及和tomcat整合

负载均衡软件之Apache以及和tomcat整合

    Apache不仅可以作为WEB服务器,也能够作为负载均衡服务器或者反向代理服务器。

    部分文字和内容来自网络。

    首先,Apache并不是用来设计做负载均衡服务器的,如果需要使用Apache的负载均衡功能,需要手动开启Apache的mod_proxy模块。

    利用Apache做负载均衡,有一些基本配置

1).基本配置

假设有一个域名为:www.a.com 的网站要用apache作为负载均衡设备, 首先需要启用Apache的几个必须的模块:

Httpd.conf代码

LoadModule proxy_modulemodules/mod_proxy.so

LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

LoadModule proxy_http_modulemodules/mod_proxy_http.so

 

mod_proxy提供代理服务器功能,mod_proxy_balancer提供负载均衡功能, mod_proxy_http让代理服务器能支持HTTP协议。如果把mod_proxy_http换成其他协议模块(如mod_proxy_ftp),能支持其他协议的负载均衡。

 

然后要添加以下配置:

Httpd.conf代码

 

ProxyRequests Off

<Proxy balancer://mycluster>

BalancerMemberhttp://node-a.myserver.com:8080

BalancerMemberhttp://node-b.myserver.com:8080

</Proxy>

ProxyPass / balancer://mycluster/

# 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!!

<Location /balancer-manager>

SetHandler balancer-manager

order Deny,Allow

Deny from all

Allow from localhost

</Location>

 

注:node-a.myserver.com,node-b.myserver.com是另外两台服务器的域名,不是当前服务器的域名

 

从上面的 ProxyRequests Off 这条可以看出,实际上负载均衡器就是一个反向代理,只不过它的代理转发地址不是某台具体的服务器,而是一个 balancer:// 协议:

 

ProxyPass / balancer://mycluster协议地址可以随便定义。然后,在<Proxy>段中设置该balancer协议的内容即可。 BalancerMember指令可以添加负载均衡组中的真实服务器地址。

 

下面那段<Location /balancer-manager>是用来监视负载均衡的工作情况的,调试时可以加上(生产环境中禁止使用!),然后访问 http://localhost/balancer-manager/ 即可看到负载均衡的工作状况。

 

OK,改完之后重启服务器,访问你的Apache所在服务器的地址(www.a.com),即可看到负载均衡的效果了。

 

出错提示:

访问网页提示Internal Serveral Error,察看error.log文件

Error.log代码

 

[warn] proxy: No protocol handler wasvalid for the URL /admin/login_form. If you are using a DSO version ofmod_proxy, make sure the proxy submodules are included in the configurationusing LoadModule.

 

 

原因是配置:# ProxyPass / balancer://mycluster 可能少了一个/

 

2). 负载比例分配

打开 balancer-manager 的界面,可以看到请求是平均分配的。

 

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置:

Httpd.conf代码

复制代码 代码如下:

 

ProxyRequests Off

<Proxy balancer://mycluster>

BalancerMemberhttp://node-a.myserver.com:8080 loadfactor=7

BalancerMemberhttp://node-b.myserver.com:8080 loadfactor=2

BalancerMemberhttp://node-c.myserver.com:8080 loadfactor=1

</Proxy>

ProxyPass / balancer://mycluster

 

 

3).负载分配算法

 

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使用lbmethod 属性。如:

Httpd.conf代码

ProxyRequests Off

<Proxy balancer://mycluster>

BalancerMemberhttp://node-a.myserver.com:8080 loadfactor=7

BalancerMemberhttp://node-b.myserver.com:8080 loadfactor=2

BalancerMember http://node-c.myserver.com:8080loadfactor=1

</Proxy>

ProxyPass / balancer://mycluster

ProxySet lbmethod=bytraffic

 

 

lbmethod可能的取值有:

 

lbmethod=byrequests 按照请求次数均衡(默认)

lbmethod=bytraffic 按照流量均衡

lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

 

各种算法的原理请参见Apache的文档。

 

2. 热备份(Hot Standby)

热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:

 

Httpd.conf代码

ProxyRequests Off

<Proxy balancer://mycluster>

BalancerMemberhttp://node-a.myserver.com:8080

BalancerMemberhttp://node-b.myserver.com:8080 status=+H

</Proxy>

ProxyPass / balancer://mycluster

 

从 balancer-manager 界面中可以看到,请求总是流向 node-a ,一旦node-a挂掉,Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况,如果node-a恢复,就继续使用node-a。

 

Tomcat 和 Apache的负载均衡组

下面是2个tomcat加一个Apache做的负载均衡组,供参考。

准备工作:

1.  使用tomcat免安装版,放在不同的目录下,tomcat使用不同的端口?

2.  安装JDK;

3.  下载安装apache_2.2.11-win32-x86-no_ssl.msi

 

apache使用的是apache_2.2.11-win32-x86-no_ssl.msi?如果版本低于2.2Apache负载均衡的配置要有所不同,因为这个2.2.11和2.2.8版本集成了jk2等负载均衡工具,所以配置要简单许多?

把Apache安装为运行在80端口的Windows服务,安装成功后在系统服务列表中可以看到Apache2.2服务?服务启动后在浏览器中输入http://localhost进行测试,如果能看到一个"Itworks!"的页面就代表Apache已经正常工作了?

 

在Apache安装目录下找到conf/httpd.conf文件,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块?

 

LoadModuleproxy_module modules/mod_proxy.so

LoadModuleproxy_ajp_module modules/mod_proxy_ajp.so

LoadModuleproxy_balancer_module modules/mod_proxy_balancer.so

LoadModuleproxy_connect_module modules/mod_proxy_connect.so

LoadModuleproxy_ftp_module modules/mod_proxy_ftp.so

LoadModuleproxy_http_module modules/mod_proxy_http.so

 

 

向下拉动文档找到<IfModuledir_module>节点,在DirectoryIndexindex.html后加上index.jsp,这一步只是为了待会配置完tomcat后能看到小猫首页,可以不做?继续下拉文档找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符?

 

然后打开conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上

<VirtualHost*:80>

ServerAdmin管理员邮箱

ServerNamelocalhost

ServerAliaslocalhost

ProxyPass/ balancer://sy/ stickysession=jsessionid nofailover=On

ProxyPassReverse/ balancer://sy/

ErrorLog"logs/sy-error.log"

CustomLog"logs/sy-access.log" common

</VirtualHost>

 

然后回到httpd.conf,在文档最下面加上

 

ProxyRequestsOff

<proxybalancer://sy>

BalancerMemberajp://127.0.0.1:8009 loadfactor=1 route=jvm1

BalancerMemberajp://127.0.0.1:9009 loadfactor=1 route=jvm2

</proxy>

 

ProxyRequestsOff 是告诉Apache需要使用反向代理,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口?loadfactor是负载因子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发?这样就可以使配置更灵活,例如可以给性能好的服务器增加处理工作的比例,如果采取多台服务器,只需要修改ip地址和端口就可以了?route参数对应后续tomcat负载均衡配置中的引擎路径(jvmRoute)

负载均衡软件之Apache以及和tomcat整合