实验前提:

1、本次实验是在RHEL 6.4(64bit)系统上完成的。

2、实验前确保每台服务器同步

3、本次实验有3台主机,其中haproxy作为反向代理地址为192.168.108.232,后面2台的httpd服务器为192.168.108.230192.168.108.231.(我这里在虚拟机上使用的是桥接的方式,也可以使用仅主机方式,不过使用仅主机方式haproxy上需要2快网卡)

4、测试时请关闭防火墙和selinux

 

实验拓扑结构:

 

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy

 

 

 

安装步骤:

1、配置web1

首先需要安装httpd服务(需要事先配置好yum)

# yum -y install  httpd

 

然后修改httpd的根目录下的index.html文件,修改内容如下:

# echo  “I am a web1,my ip is  192.168.108.230”  >  /var/www/html/index.html

 

启动httpd服务

# service httpd start

 

2、配置web2

安装httpd服务

# yum -y install  httpd

 

然后修改httpd的根目录下的index.html文件,修改内容如下:

# echo  “I am a web1,my ip is  192.168.108.231”  >  /var/www/html/index.html

 

启动httpd服务

# service httpd start

 

 

后端的2httpd服务配置完成之后最后测试一下,httpd是否可以正常工作。如果可以,则继续下面的步骤。

 

 

3、配置haproxy

RHEL 6.4上面有自带的RPM包,因此在这里我们直接使用RPM包的方式进行安装。

# yum -y install haproxy

 

配置完成之后,然后在编辑其配置文件为如下内容:

# vim /etc/haproxy/haproxy.cfg

global

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon

    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats

 

defaults

    mode                    http

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    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

    timeout check           10s

    maxconn                 3000

 

frontend  first

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    capture  request header Host len 20

    capture  request header referer  len 60

    default_backend             webserver

 

 

backend webserver

    balance     roundrobin 采用加权轮调算法

    server      web1 192.168.108.230:80  check inter 1000 rise 1 fall 2  maxconn 2000

    server      web2 192.168.108.231:80  check inter 1000 rise 1 fall 2  maxconn 2000

 

 

 

 

4、测试负载均衡功能是否生效

访问http://192.168.108.233,显示结果为:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy_02

 


然后在刷新该页面,显示结果为:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy_03

 

由于采用的是加权轮调算法,因此,每个用户请求都会均匀的分发给后端的服务器。

 

5、定义备份服务器

定义备份服务器的好处在于,当后端的所有服务器都不可用时,将启动备份服务器,此时备份服务器通常不是用来提供服务的,而是返回一些提示信息给用户,比如“网站正在维护中,请您稍好访问...”等之类的信息。

在backend段中在添加一个server,并且在这个server后面加上参数backup即可。比如:

 backend webserver

                server localweb  127.0.0.1 backup


然后在本机上安装httpd,并启动该服务器。

# yum -y install httpd

echo "<h1>sorry,Site is weihu</h1>" > /var/www/html/index.html


然后启动httpd服务即可

# service httpd start




6、定制日志文件

haproxy的特性之一就是可以将日志文件定义到其他服务器上。

在haproxy配置文件中,在global中添加如下信息,如:

globa 

        log 192.168.108.231 daemon info

说明:daemon必须是rsyslog系统上的标准facility之一。


global端配置完成之后,还需要在default段中添加log global等参数。如:

default 

        log global

        option httplog


然后重载haproxy服务

# service haproxy reload


此时,在配置文件定义完成之后,还需要在日志服务器上(这里为192.168.108.231)的日志服务配置文件添加如下信息:

# vim /etc/rsyslog.conf

daemon.*                                                /var/log/haproxy.log


此时重启日志系统服务

#  service rsyslog restart


测试访问http://192.168.108.232,并查看日志文件/var/log/haproxy.log中的日志信息。其日志内容大概为如下信息:

Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.691] first webserver/web1 5/0/1/1/7 200 286 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"

Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.699] first webserver/web2 19/0/1/2/22 404 472 - - ---- 2/2/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"


如果不加参数option httplog参数时,其日志文件中的内容大概为如下内容:

Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65116 to 192.168.108.232:80 (first/HTTP)

Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65117 to 192.168.108.232:80 (first/HTTP)


通常,如果将某日志文件定义在一台日志服务器上时,我们还应该在日志文件中记录是由哪台服务器发送来的日志信息,以便分析使用。在global段中添加log-send-hostname指令即可。如

global 

    log-send-hostname "director" (引号中的内容可以自行定义,默认为当前主机名)


定义完成之后,其日志内容大概为:

Dec 25 10:16:52 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.110] first webserver/web2 814/0/1/1/816 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"

Dec 25 10:16:53 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.927] first webserver/web1 127/0/1/1/129 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"


7、session保持机制

session保持方式一般说来有四种:

(1)、基于ip的绑定。这种方式不利用负载均衡,比如nat服务器后的所有用户将会被调度到后端的同一个服务器上。lvs、nginx、haproxy均提供了此功能。

(2)、基于cookie绑定。这种做法可以使得每个用户的请求被调度到不通的后端服务器,从而实现负载功能。而我们的haproxy提供了此功能。

(3)、session集群或session复制,这种做法会使得服务器资源消耗太大,并且集群服务器之间的session信息相互复制,会增大网络io。

(4)、使用一台单独的服务器作为session服务器,当需要某个客户端的session信息时,直接从这台session服务器上获取即可。但是这种做法需要为session服务器提供高可用服务,否则session服务器故障了,则所有的session信息不可用。


在这里只介绍如何使用cookie来实现会话保持功能

如在配置文件中添加如下内容:

backend  webserver

        balance roundrobin

        cookie SERVERID insert nocache

        server  web1 192.168.108.230:80 cookie websession1 check inter 10 fall 2 rise 1

        server  web2 192.168.108.231:80 cookie websession2 check inter 10 fall 2 rise 1


然后重载haproxy服务

# service haproxy reload


然后测试访问http://192.168.108.232,第一次访问时将会在响应报文中出现一个set-cookie的首部信息,其值为相应后端服务器返回的value,这里为websession1。如:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy_04

当用户下一次请求时,请求报文中将会新增一个cookie首部,如:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_httpd_05




8、启用统计报告功能,使用web界面来管理其haproxy的状态连接等信息

需要在其配置文件中添加如下信息:

listen stats

        mode http

        bind *:8080

        stats enable

        stats  hide-version

        stats uri /haproxyadmin?stats

        stats realm  "hello\ proxy"

        stats auth  xsl:xsl

        stats admin if TRUE表示只有认证通过后才可以管理其统计信息

 

创建认证用户和密码

# useradd  xsl

# passwd  xsl    (密码也为xsl

 

然后在重启haproxy服务

# service haproxy restart

 

测试,在浏览器中输入:http://192.168.108.232:8080/haproxyadmin?stats

显示结果为:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_httpd_06

 

将用户名xsl和密码xsl输入进去之后,显示结果为:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy_07


这个界面里面包含了各种haproxy的状态、连接、会发、宕机时长等信息。其中这些参数的意思如下:

Queue显示的是一些队列的参数

Cur:当前的队列数

Max:最大队列数

Limit:队列的限制数

Session rate显示的是与会话速率相关的参数

Cur:表示当前每秒的会话数,也是当前每秒的请求数。

Max:表示当前每秒最大的会话数。也是指的是最大并发数。

Limit:限制每秒的会话数。

Session显示的是与会话统计相关的参数

Cur:当前的会话数

Max:某一时刻的最大会话总数

Limit:会话限制数

Total:总的连接数或者总的session数

Lbtot: total number of times a server was selected,从后端选择一台服务器所花的时间。

Last:表示上一次会话到现在所经过的时间。如果此参数太大了,表示该服务器一致处于空闲状态。

Byte:显示的请求和响应的字节数

In:表示进来的字节数

Out:表示出去的字节数

Denied:拒绝的字节数

Req:表示请求被拒绝的字节数

Resp:响应被拒绝的字节数

Error:表示与错误相关的参数

Req:表示错误的请求数

Conn:错误的连接数

Resp:错误的响应数

Warnings:与提示相关的参数

Retr:表示重新尝试连接的次数

Redis:重新发送的次数

server:与服务器状态相关的参数

status:显示的后端服务器的状态,及其由一种状态转换为另一种状态的时间。服务器状态只有up或down。

LastChk:表示是通过4层还是通过7层方式来检查后端服务器的健康状况。con表示连接被拒绝,因此,监测失败。ok表示检测成功。

Weight:后端服务器的权重

Act:是否是活动主机。Y表示yes。

Bct:是否是备份主机。

Chk:后端服务器的健康状况监测失败的次数。

Dwn:后端服务器宕过的次数。

Dwntme:宕机的总时间


9、haproxy实现请求的动静分离

通常,在一个中上等规模的网站架构中,需要将静态资源和动态资源分开进行处理。即静态内容由一台或多台服务器进行处理;而动态内容由另外的一台或多台服务器进行处理。这样静态和动态内容实现分离响应。haproxy可以利用acl来完成请求资源的动静分离。

其架构设计如下:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_httpd_08

在这个图中,所有静态资源有static site站点处理,而所有的动态资源则由dynamic site站点处理。

其中haproxy的ip地址为192.168.108.230

static site ip为192.168.108.51

dynamic site ip为192.168.108.52


动静分离的配置如下:

frontend  webproxy *:8080

        acl url_static path_beg -i /static /img /p_w_picpaths /css

        acl url_static path_end -i .html .xml .css .txt .png .gif .js .gpg

        acl url_dynamic  path_end -i .php

        use_backend static  if url_static

        use_backend dynamic if url_dynamic

        default_backend static


backend static

        balance roundrobin

        option httpchk HEAD /test.html (定义7层检测方法,默认是通过4层来检测的)

        server static  192.168.108.51:80 check inter 5 fall 2 rise 1 weight 1 maxconn 2000


backend dynamic

        balance roundrobin

        option httpchk HEAD /test.html

        server dynamic 192.168.108.52:80 check inter 5 fall 2 rise 1 weight 1 maxconn 1000


在后端服务器192.168.108.51上,添加如下文件:

# echo "<h1>hello,static site<h1>"  > /var/www/html/index.html

# echo "This is the static site..." > /var/www/html/index.php

启动httpd服务

# server httpd start


在后端服务器192.168.108.52上,添加如下文件:

# echo "<h1>hello,dynamic site<h1>"  > /var/www/html/index.html

# echo "This is the dynamic site..." > /var/www/html/index.php

启动httpd服务

# server httpd start


访问http://192.168.108.230:8080/index.html,访问结果如下:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_HAproxy_09




访问http://192.168.108.230:8080/index.php,访问结果如下:

haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现_反向代理_10 

至此,请求资源的动静分离已经实现了。