HAproxy是免费、高效、可靠的高可用及负载均衡解决方案。该软件非常适合于处理高负载站点的七层数据请求。HAproxy的工作模式使其可以非常容易且安全地集成到我们现有的站点架构中。使用类似的代理软件还可以对外屏蔽内部的真是web服务器,防止内部服务器受到外部的攻击。

为了让同一客户端访问服务器时可以保持会话(同一客户端第二次访问网站时可以被转发至相同的后端真是服务器),HAproxy有三种解决方案:客户端IPcookie以及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.06.X与之前的5.X采用的日志系统不同,5.X用的是syslogd,6.X中普遍使用的是rsyslogd,因此配置文件路径以及配置上有少许的不同。接着还需要打开syslogd或者rsyslogdUDP端口(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负载均衡_解决方案 

HAproxy负载均衡_客户端_02 

启动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负载均衡_web服务器_03 

HAproxy负载均衡_cookie_04 

Haproxy还有图形化得监控界面

访问地址为:http://10.10.10.151/admin?stats

HAproxy负载均衡_web服务器_05

隐藏版本号:

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