HAproxy是免费、高效、可靠的高可用及负载均衡解决方案。该软件非常适合于处理高负载站点的七层数据请求。HAproxy的工作模式使其可以非常容易且安全地集成到我们现有的站点架构中。使用类似的代理软件还可以对外屏蔽内部的真是web服务器,防止内部服务器受到外部的攻击。
为了让同一客户端访问服务器时可以保持会话(同一客户端第二次访问网站时可以被转发至相同的后端真是服务器),HAproxy有三种解决方案:客户端IP、cookie以及session。第一种方式中,HAproxy将客户端IP进行Hash计算并保存,以此确保当相同的IP访问代理服务器时可以转发到固定的真是服务器上。第二种方式中,HAproxy依靠真是服务器发送给客户端的cookie信息进行会话保持。第三种方式中,HAproxy将保存在真实服务器的session及服务器标识,实现会话保持功能。
HAproxy的安装与配置
HAproxy主机配置
[root@localhost ~]#tar zxvf haproxy-1.4.21.tar.gz
[root@localhost ~]#cd haproxy-1.4.21
[root@localhost ~]#uname -a //查看linux内核版本
[root@localhost ~]#make TARGET=linux2632 PREFIX=/usr/local/haproxy
[root@localhost ~]#make install PREFIX=/usr/local/haproxy
[root@localhost ~]#mkdir /var/haproxy
[root@localhost ~]#vim /etc/haproxy.cfg
global
log 127.0.0.1 local3
chroot /var/haproxy
pidfile /var/haproxy/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
nbproc 1
stats socket /var/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
#stats hide-version(隐藏版本号)
timeout check 10s
#balance source
maxconn 3000
listen web_proxy 192.168.106.128:80
server web1 192.168.106.129:80 cookie app1inst1 check inter 2000 rise 2 fall 5
server web2 192.168.106.133:80 cookie app1inst2 check inter 2000 rise 2 fall 5
由于配置文件中的user,group用的是haproxy用户和组,所以需要创建一个haproxy用户
[root@localhost ~]#useradd -s /sbin/nologin haproxy
打开日志功能
由于我采用的是Centos6.0,6.X与之前的5.X采用的日志系统不同,5.X用的是syslogd,而6.X中普遍使用的是rsyslogd,因此配置文件路径以及配置上有少许的不同。接着还需要打开syslogd或者rsyslogd的UDP端口(514),而网上流行的配置都是针对syslogd的,如修改 SYSLOGD=”-r”,加入-r参数。但在rsyslog中-r参数已经不被兼容了,所以修改SYSLOGD的方法无效。
[root@localhost ~]#vi /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
[root@localhost ~]#/etc/init.d/rsyslog restart
这样当负载均衡环境遇到问题的时候,会将问题记录到日志中,有助于我们排查错误
例如:
[root@localhost ~]# tail -f /var/log/haproxy.log
2015-06-16T19:18:24+08:00 localhost haproxy[2687]: 10.10.10.1:64535 [16/Jun/2015:19:18:24.132] web_proxy web_proxy/web2 361/0/1/1/363 304 149 - - ---- 4/4/0/1/0 0/0 "GET / HTTP/1.1"
2015-06-16T19:18:24+08:00 localhost haproxy[2687]: 10.10.10.1:64535 [16/Jun/2015:19:18:24.495] web_proxy web_proxy/web2 201/0/2/3/206 304 149 - - ---- 4/4/0/1/0 0/0 "GET / HTTP/1.1"
内核调优
[root@localhost ~]# vim /etc/security/limits.conf
文件中插入如下两行
* soft nofile 65535
* hard nofile 65535
这部分的解释如图
启动haproxy
[root@localhost ~]#haproxy -f /etc/haproxy.cfg
[root@localhost ~]#echo”/usr/local/sbin/haproxy -f /etc/haproxy.cfg” >> etc/rc.d/rc.local
真实服务器我准备了两台,都安装上了httpd,分别在index.html上写上各自机器的IP地址,启动httpd服务后进行测试(这里注意,在测试之前把防火墙和selinux都关掉)。
Haproxy还有图形化得监控界面
访问地址为:http://10.10.10.151/admin?stats
隐藏版本号:
stats hide-version 即可以实现从报告中隐藏版本号的需求。
修改配置文件、重启Haproxy再次测试。
修改负载平衡策略再次测试:
默认的负载平衡策略无法保证用户每次访问的都是同一后端服务器,会带来一些回话保持方面的问题,因此我们使用balance参数修改负载平衡策略。
将#balance source 行注释删掉,即指定HAproxy使用source负载平衡策略。source表示根据请求源IP,即同一IP请求均会被指向同一台后端服务器。
重启HAproxy,然后多次刷新页面,此时应该显示的是同一web页面,即每次访问的都是同一后端服务器,当然如果换IP访问,就会出现不同的web页面,但每个IP显示的页面应该是相同的。
参考资料:http://www.jiancool.com/article/11405039763/
http://blog.51yip.com/server/868.html http://www.linux78.com/haproxy-xue-xi-bi-ji-haproxy-pei-zhi-wen-jian-xiang-jie.html