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 ]
使用浏览器访问:
监控页面效果图:
页面内容:
根据此时的页面内容我们可以判定此时访问的是web1这台服务器,再次刷新:
发现此时的页面内容有变化,访问的是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):
可以看出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的版本信息已经被隐藏了。
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 514udp 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/