1.环境描述:

HAProxy  IP:192.168.239.128 Centos6.0-64bit
Web1 IP:192.168.239.129 Centos6.0-64bit
Web2 IP:192.168.239.133 Centos6.0-64bit

2.环境准备:


  这里仅作测试性的实验,不用于正式线上业务,因此所有软件均采用yum的方式安装。

HAProxy:

[root@haproxy1_test ~]# yum -y install haproxy.x86_64

Web1:

[root@web1 ~]# yum -y install httpd

Web2:

[root@web2 ~]# yum -y install httpd


  修改web1,web2节点的index.html文件:


[root@web1 ~]# cat /var/www/html/index.html
I am web1
[root@web2 ~]# cat /var/www/html/index.html
I am web2

这样判定我们实际访问的后端web服务器到底是web1还是web2。


3.修改HAprxoy配置:


[root@haproxy1_test ~]# cat /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local0
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    nbproc      1
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option                  forwardfor 
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    stats   uri             /admin?stats
    timeout check           10s
    #balance                 source
    maxconn                 3000
listen web_proxy 192.168.239.128:81
server web1 192.168.239.129:80 cookie app1inst1 check inter 2000 rise 2 fall 5
server web2 192.168.239.133:80 cookie app1inst2 check inter 2000 rise 2 fall 5


  以下是部分参数的解释:

  maxconn 4000#最大连接数

  user        haproxy#用户
  group       haproxy#用户组

daemon     #使HAProxy进程进入后台运行。这是推荐的运行模式

nbproc 1   #创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"

  defaults   #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK

  mode http  #http模式

  option httplog#采用http日志

  retries 3#尝试三次失败则认为服务器不可用

  option redispatch#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器

stats   uri             /admin?stats #Haproxy的管理页面

#balance      source  #Haproxy算法,source表示根据请求源IP,即同一IP请求均会被指向同一台后端服务器,这里暂不启用

listen web_proxy 192.168.239.128:81  #定义了监听的IP、端口,如果有vip也可以换成vip
server web1 192.168.239.129:80 cookie app1inst1 check inter 2000 rise 2 fall 5

server web2 192.168.239.133:80 cookie app1inst2 check inter 2000 rise 2 fall 5

#定义了web1,web2两台后端服务器




4.测试:

启动相关软件:


[root@haproxy1_test ~]# /etc/init.d/haproxy start
Starting haproxy:                          [  OK  ]
[root@web1 ~]# /etc/init.d/httpd start
Starting httpd:                            [  OK  ]
[root@web2 ~]# /etc/init.d/httpd start
Starting httpd:                            [  OK  ]


  使用浏览器访问:  

  监控页面效果图:

HAProxy负载均衡实验_HAProxy负载均衡实验


  页面内容:

HAProxy负载均衡实验_HAProxy负载均衡实验_02


 根据此时的页面内容我们可以判定此时访问的是web1这台服务器,再次刷新:

HAProxy负载均衡实验_HAProxy负载均衡实验_03

 发现此时的页面内容有变化,访问的是web2这台服务器!

 可以默认情况下,HAproxy的负载平衡策略会导致一些问题,例如回话保持,无法在用户登录期间

 记录用户的一些状态、信息等。


5.修改负载平衡策略再次测试:

默认的负载平衡策略无法保证用户每次访问的都是同一后端服务器,会带来一些回话保持方面的问题,因此我们使用balance参数修改负载平衡策略。

#balance source     行注释删掉,即指定HAproxy使用source负载平衡策略。source表示根据请求源IP,即同一IP请求均会被指向同一台后端服务器。

  重启HAproxy,然后多次刷新页面,此时应该显示的是同一web页面,即每次访问的都是同一后端服务器,当然如果换IP访问,就会出现不同的web页面,但每个IP显示的页面应该是相同的。


6.隐藏版本号:

默认的配置是显示Haproxy的版本号的,从前面管理页面的图中也是可以看到的:当前的版本号是1.4.22。暴漏版本号是有一定风险的,因此我们要想办法将其隐藏起来。通过查询官方的配置文档(

链接 http://cbonte.github.io/haproxy-dconv/configuration-1.4.html#stats%20hide-version):

HAProxy负载均衡实验_HAProxy负载均衡实验_04


     可以看出stats hide-version 即可以实现从报告中隐藏版本号的需求。

     修改配置文件、重启Haproxy再次测试:

     配置修改如下:


defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option                  forwardfor 
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    stats   uri             /admin?stats
    stats hide-version

      注意添加的位置必须和stats uri在同一标签下(这里为default),否则加入stats hide-version会导致管理页面不可用,暂不清楚是什么原因。重载配置、打开管理页面:


HAProxy负载均衡实验_HAProxy负载均衡实验_05

      可以看到Haproxy的版本信息已经被隐藏了。

7.分离Haproxy的日志:

Haproxy的日志默认是写在/var/log/messages里面的,这样的导致一个问题就是Haproxy的日志混杂在系统日志里,不方面故障排查、日志分析等。因此我们需要从messages里面分离Haproxy的日志。

        而Haproxy中使用log 参数来控制日志的写入的:

           global

           log         127.0.0.1 local0

        因此我们需要修改这里,将其改为local2(也可以是其他的,0-7均可以)。同时我们在rsyslog.conf中加入如下一行:

[root@haproxy1_test ~]# vi /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.*                      /var/log/boot.log
#for   the Haproxy                                     
local2.*                     /var/log/haproxy.log

       注意由于我采用的是Centos6.0,6.X与之前的5.X采用的日志系统不同,5.X用的是syslogd,而6.X中普遍使用的是rsyslogd,因此配置文件路径以及配置上有少许的不同。接着还需要打开syslogd或者rsyslogd的UDP端口(514),而网上流行的配置都是针对syslogd的,如修改  SYSLOGD=”-r”,加入-r参数。但在rsyslog中-r参数已经不被兼容了,所以修改SYSLOGD的方法无效。

      google一番,找个一个靠谱的方法,感谢国外的大神贡献~,方法如下:


[root@haproxy1_test ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp.so                                                                                                                  
$UDPServerRun 514

     在rsyslog.conf中将其UDP的541端口监听打开。

[root@haproxy1_test ~]# netstat -lnutp | grep 514
udp        0      0 0.0.0.0:514                 0.0.0.0:*                               4460/rsyslogd      
udp        0      0 :::514                      :::*                                    4460/rsyslogd    


      之后重启rsyslogd,haproxy就可以了。查看相关日志:


[root@haproxy1_test ~]# /etc/init.d/rsyslog restart
Shutting down system logger: [  OK  ]
Starting system logger: [  OK  ]
[root@haproxy1_test ~]# /etc/init.d/haproxy restart
Stopping haproxy: [  OK  ]
Starting haproxy: [  OK  ]
[root@haproxy1_test ~]# tailf /var/log/haproxy.log
Jun 21 01:21:51 localhost haproxy[4548]: Proxy web_proxy started.
Jun 21 01:21:53 localhost haproxy[4549]: Server web_proxy/web1 is DOWN, reason: Layer4 timeout, check duration: 2004ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.


        可以看出来,haproxy的日志已经被写在/var/log/haproxy.log中了。当然也可以指定haproxy的日志的不同等级,从而写入不同的日志文件中。

       附rsyslogd记录Haproxy解决办法的原链接:

         http://kvz.io/blog/2010/08/11/haproxy-logging/