apache以mod_proxy实现负载均衡集群

apache以mod_proxy实现负载均衡集群,第1张

apache以mod_proxy实现负载均衡集群

目录

1.测试环境概述

2、ajp实现lb的方式

3.lb是通过http实现的

4.问题和总结

1.测试环境概述

这个测试采用三台主机,其中两台提供tomcat服务。在之前的博文中,已经配置了tomcat环境,其中一个提供了httpd来实现tomcat上的负载均衡效果。

服务器规划:

1台服务器IP:192.168.0.200主机名“lb”

2服务器IP:192.168.0.201主机名“tomcat1”

3服务器IP:192.168.0.202主机名“tomcat2”

后端tomcat安装配置此时不再可用。请参考之前的博文http://zhaochj.blog.51cto.com/368705/1639740.httpd是百胜安装的,版本是:

[root@lb ~]# rpm -qa httpd httpd-2.2.15-39.el6.centos.x86_64

安装此版本后,检查已编译的模块,以确保以下模块可用于完成此测试:

[root@lb ~]# httpd -M proxy_module (shared)  proxy_balancer_module (shared) proxy_http_module (shared)  proxy_ajp_module (shared)

2、ajp实现lb的方式

修改配置为虚拟主机的httpd的配置文件。

[root@lb ~]# vim /etc/httpd/conf/httpd.conf  .....省略.... #DocumentRoot "/var/www/html"   #注释中心主机 ..... ProxyRequests Off  #关闭正向代理 <Proxy balancer://lbcluster1>         BalancerMember ajp://192.168.0.201:8009 loadfactor=2 route=tomcata         BalancerMember ajp://192.168.0.202:8009 loadfactor=2 route=tomcatb         ProxySet lbmethod=byrequests         #ProxySet lbmethod=bytrffic         #ProxySet lbmethod=bybusyness         #ProxySet stickysession=JSESSIONID  #一定要写成大写的jsessionid         ProxySet nofailover=On </Proxy> <VirtualHost *:80> #启用虚拟主机 DocumentRoot /tomcat/webapps/test ServerName www.test.com ErrorLog logs/test.com-error.log CustomLog logs/test.com-access.log common <Location /status>         SetHandler balancer-manager         ProxyPass !         Order allow,deny         Allow from 192.168.0.0/24 </Location> ProxyPass / balancer://lbcluster1/ ProxyPa***everse / balancer://lbcluster1/ </VirtualHost>

上述说明的描述:

ProxyRequests{On|Off}:是否打开apache的转发代理功能。启用此选项时,必须启用mod_proxy_http模块才能代理http协议。同时,如果为apache设置了ProxyPass,则ProxyRequests必须设置为Off。

ProxyPass命令的语法是ProxyPass[path]!|url[key=valuekey=value...]]:将后端服务器的url与当前服务器的虚拟路径相关联,作为提供服务的路径,其中路径是当前服务器上的虚拟路径,URL是后端服务器上的URL路径。使用此指令时,ProxyRequests的值必须设置为Off。请注意,如果path以“/”结尾,则相应的url也必须以“/”结尾,反之亦然。"!"否。表示此虚拟路径不代理到后端,而是在本地处理,用于动态和静态分离。

此外,mod_proxy模块在httpd2.1版本之后支持与后端服务器的连接池功能,连接是按需创建的,可以保存在连接池中以备后用。连接池大小或其他设置可以通过在ProxyPass中使用key=value来定义。的常用键如下:

Min:连接池的最小容量。这个值与实际的连接数无关,只是表示空之间要初始化的连接池的最小大小。

Max:连接池的最大容量,每个MPM都有自己独立的容量;值都与MPM本身有关,比如Prefork的总是1,而其他的则取决于ThreadsPerChild指令的值。

Loadfactor:用于负载均衡集群配置,定义对应后端服务器的权重,取值范围为1-100。

重试:当apache向后端服务器发送请求并得到错误响应时,等待多长时间再重试。以秒为单位。


如果代理规范以balancer://开头,也就是说,当它用于负载平衡集群时,它还可以接受一些特殊参数,如下所示:

Lbmethod:apache对负载均衡的调度方式默认为byrequests,即统计请求数基于权重进行调度,bytraffic基于权重进行流量计数调度,bybusyness则考虑各后端服务器的当前负载进行调度。

Maxattempts:放弃请求前实现故障转移的次数。默认值为1,最大值不应大于节点总数。

Nofailover:值为On或Off。当后端服务器出现故障时,用户不会被故障转移到其他节点,导致用户无法正常访问网站。如果设置为Off,表示允许故障转移,即用户访问的节点出现故障,将转移到其他节点。如果在后端服务器无法复制或共享会话时将此值设置为On,则用户可能无法访问网站。如果设置为Off,则用户的会话。

Stickysession:值是调度器的stickysession的名称,根据web编程语言的不同,它的值是JSESSIONID或PHPSESSIONID。

以上指令可以在banlancer://或者ProxyPass中设置,也可以使用ProxySet指令直接设置,就像我上面设置的一样。


在配置文件中

<代理平衡器://lbcluster1>;

平衡器成员ajp://192.168.0.201:8009loadfactor=2route=Tomcata

balancermemberajp://192.168.0.202:8009loadfactor=2route=tomcatb

本节中的名称route=tomcata和route=tomcatb是tomcat服务配置文件的引擎容器中jvmRoute的配置,如下所示:

<enginename="Catalina"defaulthost="localhost"JVMroute="tomcatb">;


配置完成后,启动httpd服务并测试它:

[root@lb ~]# service httpd start

后端tomcat上提供的测试页面是两个jsp测试文件,可以记录用户每次访问的会话信息。这些文件的内容如下:

[root@tomcat1 ~]# vim /tomcat/webapps/test/index.jsp <%@ page language="java" %> <html>  <head><title>TomcatA</title></head>  <body>   <h1><font color="red">TomcatA </h1>   <table align="centre" border="1">    <tr>     <td>Session ID</td>   <% session.setAttribute("abc","abc"); %>     <td><%= session.getId() %></td>    </tr>    <tr>     <td>Created on</td>     <td><%= session.getCreationTime() %></td>    </tr>   </table>  </body> </html>

在tomcat2上,只需将这个测试文件中的TomcatA替换为TomcatB,这样用户的访问就可以通过不断刷新主页在两个节点上不断切换,如下图所示:

每次页面刷新,用户的会话信息都会改变。

3.lb是通过http实现的

确保后端tomcat服务器监听http的某个端口。我将在这里保留默认的8080,并将

<代理平衡器://lbcluster1>;

平衡器成员ajp://192.168.0.201:8009loadfactor=2route=Tomcata

balancermemberajp://192.168.0.202:8009loadfactor=2route=tomcatb

修改为:

<代理平衡器://lbcluster1>;

balancermemberhttp://192.168.0.201:8080loadfactor=2route=Tomcata

balancermemberhttp://192.168.0.202:8080loadfactor=2route=tomcatb

这就完成了配置。

在配置文件中配置了一个特殊位置,如下所示:

<位置/状态>

SetHandler平衡器管理器

ProxyPass!

订单允许、拒绝

允许从192.168.0.0/24开始

</Location>;

这是proxy_module模块中的一个接口,可以输出分布式集群环境中各个节点的状态信息,具有一定的管理功能。因此,该接口被配置为基于用户访问控制或调试后直接禁用。该界面的输出页面如下:

4.问题和总结

如上所述,页面不断刷新时,两个节点会不断切换,用户的会话信息也在不断变化。如果在生产环境中保存用户的会话信息很重要,如果tomcat后端没有会话复制或共享机制,那么,我们可以在httpd配置文件中启用参数“proxysetstickysession=jssessionid”,这意味着当用户访问集群系统时,绑定用户的会话信息被调度到一个节点,后续的连接也会被调度到这个节点,这样会话信息就不会被调度到其他节点而发生变化。但这在一定程度上违背了负载均衡的思想,但这种机制也确实可以解决会话信息不断变化的问题。这里还有一个必须面对的问题,就是当用户访问的节点宕机时,用户发起的下一次连接是否会被调度到其他正常节点?这由“nofailover={On|Off}”控制,默认为Off,这意味着故障转移将自动执行,以便用户可以正常访问站点。但是,由于会话信息丢失,网站会让用户重新登录。如果设置为on,则意味着不会发生故障转移。用户访问的节点出现故障后,用户将无法访问该站点。这需要管理员平衡和设置这两个参数。不过,我们有更好的解决方案来解决这个问题,比如在tomcat集群中启用session的内存复制功能,或者采用msm(MemcachedSessionManager)方案来解决这个测试集群的缺陷,我会在下面的博文中呈现。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/782540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存