Apache+Tomcat使用Apache的反向代理功能实现的负载均衡设置

反向代理介绍

Apache可以被配置为正向(forward)反向(reverse) 代理
正向代理是一个位于客户端和原始服务器(originserver)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache 提供)减少网络使用率。
使用ProxyRequests 指令即可激活正向代理 。
因为正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施 以确保仅为经过授权的客户端提供服务。


反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置.客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问.反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。 另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
可以使用ProxyPass指令激活反向代理(在RewriteRule 指令中使用[P] 标记也可以)。配置反向代理并不需要 打开ProxyRequests 指令(但有可能需要加载)。

实现部分

需要Apache 2.4.4, Tomcat 7

Apache HTTP Server端配置

/apache/conf/httpd.conf

#去掉注释以开启以下模块:

#for load balance

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_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so

#to resolve the start failed issue:

#AH02432: Cannot find LB Method: byrequests

#AH01183: Cannot share balancer

#AH00020: Configuration Failed, exiting

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

#for index.jsp

<IfModule dir_module>
    DirectoryIndex index.html index.jsp
</IfModule>

#for static content cache

LoadModule buffer_module modules/mod_buffer.so
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

#最后加入以下内容

#for load balance

ProxyRequests Off
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
<proxy balancer://cluster/>
BalancerMember ajp://127.0.0.1:9001 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:9002 loadfactor=1 route=jvm2
</proxy>

ProxyRequests Off

我们只使用反向代理功能, ProxyRequests并不需要, 所以设置为Off

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

ProxyPass为代理转发的Url,即将所有访问/*的请求转发到群集balancer://cluster/

其中cluster后面的"/"不可缺少, 否则使用status模块查看apache代理运行状态的时候将会出错

<proxy balancer://cluster/>
BalancerMember ajp://127.0.0.1:9001 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:9002 loadfactor=1 route=jvm2
</proxy>

BalancerMember为群集的成员,即群集服务器Tomcat1, 2, ....,负载均衡服务器会根据均衡规则(loadfactor)来将请求转发给BalancerMember。

Apache使用ajp协议与tomcat子服务器进行交互, 协议后的路径为每个tomcat的运行地址, 端口为tomcat的ajp服务运行端口, 端口在server.xml的connector标签中设置.

route的值对应tomcat的server.xml中engine标签的jvmRoute属性.

Tomcat 端设置

需要多个tomcat安装到不同位置, 每个tomcat都需要配置以保证端口不互相冲突

Server.xml

8001需要保证端口不冲突

<Server port="8001" shutdown="SHUTDOWN">

 这部分的HTTP端口, 默认是8080可以注释掉

<!--
<Connector port="8080" protocol="HTTP/1.1"
			connectionTimeout="20000" redirectPort="8443" />
-->

相关推荐