设为首页 收藏本站
查看: 634|回复: 0

[经验分享] apache以mod_proxy实现负载均衡集群

[复制链接]

尚未签到

发表于 2018-11-21 11:11:14 | 显示全部楼层 |阅读模式
  目录
  1、测试环境概述
  2、ajp方式实现lb
  3、http方式实现lb
  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采用yum方式安装,版本为:
[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  #关闭正向代理

        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

#启用虚拟主机
DocumentRoot /tomcat/webapps/test
ServerName www.test.com
ErrorLog logs/test.com-error.log
CustomLog logs/test.com-access.log common

        SetHandler balancer-manager
        ProxyPass !
        Order allow,deny
        Allow from 192.168.0.0/24

ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
  对以上各指令的说明:
  ProxyRequests {On|Off}:是否开启apache正向代理的功能,启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off
  ProxyPass指令的语法为ProxyPass  [path]  !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 “!”号表示此虚拟路径不被代理到后端,而是在本地处理,在做动静分离时使用。
  另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
  min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
  max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。
  loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
  retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
  

  如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:
  lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
  maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
  nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户不会被故障转移到其他节点,这样用户就不能正常访问网站,如果设置成Off,表示允许发生故障转移,即用户访问的节点发生故障,会被转移到其他节点,如果在后端服务器没有解决session复制或共享时,将此值设置为On,那用户可能访问不到网站,如果设置成Off,那用户的session会丢失。
  stickysession:取值为调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
  上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,就像上边我设置的一样。
  

  配置文件中的
  
  BalancerMember ajp://192.168.0.201:8009 loadfactor=2 route=tomcata
  BalancerMember ajp://192.168.0.202:8009 loadfactor=2 route=tomcatb
  这部份中的route=tomcata与route=tomcatb这两个名称是在tomcat服务的配置文件中的Engine容器中jvmRoute的配置,如下:
  
  

  配置好后,启动httpd服务,进行测试:
[root@lb ~]# service httpd start  在后端两tomcat上提供的测试页面是两个能记录用户每次访问的session信息的jsp测试文件,文件内容如下:
[root@tomcat1 ~]# vim /tomcat/webapps/test/index.jsp


TomcatA

  TomcatA
  
   
    Session ID
  
   
   
   
    Created on
   
   
  

  在tomcat2上只是把此测试文件中的TomcatA更换成TomcatB即可,这样不断刷新主页就可观察到用户的访问在两个节点上不断的切换,如下图:
DSC0000.jpg

DSC0001.jpg

  每次刷新页面后,用户的session信息都会改变。
  3、http方式实现lb
  保证后端tomcat服务器监听在http的某个端口,我这里保持默认的8080,把httpd配置文件中的
  
  BalancerMember ajp://192.168.0.201:8009 loadfactor=2 route=tomcata
  BalancerMember ajp://192.168.0.202:8009 loadfactor=2 route=tomcatb
  修改为:
  
  BalancerMember http://192.168.0.201:8080 loadfactor=2 route=tomcata
  BalancerMember http://192.168.0.202:8080loadfactor=2 route=tomcatb
  这样即完成配置。
  在配置文件中配置了一个特殊的Location,如下:
  
  SetHandler balancer-manager
  ProxyPass !
  Order allow,deny
  Allow from 192.168.0.0/24
  
  这是一个proxy_module模块中能输出分布式集群环境中各节点的状态信息,并还有一定的管理功能的接口,所以此接口就配置成基于用户的访问控制或者调试好后直接禁用,此接口输出页面如下图:
DSC0002.jpg

  4、问题及总结
  上边提到过在不断刷新页面时会在两个节点不断的切换,用户的session信息也在不断的发生改变,如果在生产环境下保持用户的session信息是比较重要的,如果tomcat的后端没有session复制或共享的机制,那我们可以在httpd配置文件中启用“ProxySet stickysession=JSESSIONID”这个参数,表示绑定用户的session信息,当用户访问集群系统时被调度到了一个节点上,那其后边的连接也会都会调度到此节点上,这样session信息就不会被调度到其他节点而发生变化,但这样在一定程度上与负载均衡的思想相悖,不过这样的机制也能真正的解决session信息不断变化的问题。这里还有一个问题必须面临,那就是当用户访问的节点宕机了,那用户下次用户发起的连接是否会被调度到其他正常的节点,这是由“nofailover={On|Off}”来控制的,默认是Off,表示会自动进行故障转移,这样用户能正常访问站点,但因session信息丢失,站点会让用户再次进行登陆,如果设置成On,表示不会进行故障转移,那用户访问的节点发生故障后,用户将不能访问站点,这个需要管理员来权衡设置这两个参数。不过我们有更好的方案来解决这个问题,在tomcat集群中启用session的内存复制功能,或采用msm(Memcached Session Manager)方案来解决此次测试集群的缺陷,我将在后边的博文中呈现。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-637714-1-1.html 上篇帖子: Apache安装配置启用 下篇帖子: ubuntu 12.04下搭建web服务器(MySQL+PHP+Apache) 教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表