1. HAProxy简介

HAProxy是一种可以工作在七层HTTP或者四层TCP的负载均衡器软件,它实现了事件驱动、单一进程模型。

 

1.1 HAProxy主要工作模式

tcp 这是缺省的模式,SSL、SSH、SMTP等协议可以工作在此工作模式。在这种模式下,并不进行7层的检查。此时HAProxy就为浏览器和上游服务器之间建立一个全双工的连接。

它是工作在七层的应用程序,所以不管HAProxy的工作模式是tcp还是http,数据都是通过它,在用户空间重新封装并转发至上游服务器的,并不是像LVS一样在内核中就完成封装和转发。

http 代理服务器会分析客户端的http协议请求,可以对报文实施7层过滤、处理、交换等操作。

由于HAProxy可以在七层工作,能对HTTP报文头部信息按照编写的控制规则进行处理,就可以实现把不同的URL请求调度到不同的服务器组,可以做到具有不同特征的业务数据使用不同的服务器组处理或响应。这样做的好处是显而易见的。

 

2. 动静分离实验

2.1 实验规划

 HAProxy动静分离实验_动静分离

动静分离说明:

动态网页请求,例如php页面请求,调度至WEB1服务器处理

静态资源请求,例如html页面、css样式表文件等请求,调度至WEB2处理

 

2.2 实验步骤

2.2.1 配置WEB1

这台服务器作为动态服务器,可以执行PHP网页。安装php的时候会依赖httpd。

然后准备一个index.php页面。

# yum -y install php    
# vim /var/www/html/index.php     
<html>     
<head>     
<title>dynamic</title>     
<link href="css/main.css" rel="stylesheet" type="text/css">     
</head>     
<body>     
<table class="tb_show">     
  <tr>     
    <td>Client IP is</td>     
    <td class="content_show"><?php echo getenv('REMOTE_ADDR') . ':' . getenv('REMOTE_PORT') ?></td>     
  </tr>     
  <tr>     
    <td>Server IP is </td>     
    <td class="content_show"><?php echo getenv('SERVER_ADDR') . ':' . getenv('SERVER_PORT') ?></td>     
  </tr>     
</table>     
</body>     
</html>     
# service httpd start

注意:这里使用了外部样式表,其路径处在css/main.css。按照规划,静态内容指向WEB2的。

测试一下

HAProxy动静分离实验_HAProxy_02

虽然通过IP地址直接访问WEB1,WEB1也返回index.php的执行结果,返回状态码200正常。

但是没有应用样式表样式。这是因为它要访问的静态资源,要被放到WEB2上。WEB1只能在自己站点目录下找文件,找不到,因此样式表加载失败,返回404错误。

我们的目的是要做动静分离,下面就要把css样式表这样的静态资源放在其他服务器上,通过代理服务器,分别调度动静资源的请求到不同的服务器响应。

 

 

2.2.2 配置WEB2

安装httpd,并提供测试页index.html。

为WEB1创建样式表文件,这样通过代理会把php的请求调度给WEB1,而css文件调度到WEB2。这样通过访问http://172.16.23.80/index.php,就应该可以看到带有样式的信息输出到浏览器上。

# yum -y install httpd    
# vim /var/www/html/index.html     
<html>     
<head>     
<title>static</title>     
</head>     
<body>     
<h1 align="center">This is a static page</h1>     
</body>     
</html>     
# service httpd start
 
# mkdir /var/www/html/css    
# vim /var/www/html/css/main.css
 
.tb_show {    
    font-size: 18px;     
    border: 1px solid #333;     
    margin: 2px;     
    padding: 2px;     
    background-color: #F2F2F2;     
     400px;     
}     
.content_show {     
    text-align: center;     
    font-weight: bold;     
}
 
# service httpd start

 

2.2.3 代理服务器

# cat /proc/sys/net/ipv4/ip_forward    
0

这个参数实际不需要打开,因为所有的数据都要经过用户空间的HAProxy的处理,经由OUPUT链出去,没有经过FROWARD链转发。

安装HAProxy

# yum install -y haproxy    
# rpm -ql haproxy     
/etc/haproxy/haproxy.cfg     
/etc/rc.d/init.d/haproxy     
/usr/sbin/haproxy     
......     
/usr/share/haproxy     
/usr/share/haproxy/400.http     
/usr/share/haproxy/403.http     
/usr/share/haproxy/408.http     
/usr/share/haproxy/500.http     
/usr/share/haproxy/502.http     
/usr/share/haproxy/503.http     
/usr/share/haproxy/504.http     
......     
/var/lib/haproxy

 

2.2.4 配置HAProxy

# id haproxy    
uid=188(haproxy) gid=188(haproxy) groups=188(haproxy)
 
# vim /etc/haproxy/haproxy.cfg    
global     
    log         127.0.0.1 local2
 
    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     
    log                     global     
    option                  httplog     
    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     
    cookie ServerName insert nocache
 
frontend  lb-proxy *:80    
    acl url_static       path_beg       -i /static /p_w_picpaths /js /css     
    acl url_static       path_end       -i .jpg .gif .png .css .js .html .htm
 
    use_backend static          if url_static    
    default_backend             dynimac
 
backend static    
    balance     roundrobin     
    server      static 192.168.23.81:80 cookie WEB2 check
 
backend dynimac    
    balance     roundrobin     
    server app1 192.168.23.80:80 cookie WEB1 check     
    server sorry 127.0.0.1:8080 cookie local backup
 
# vim /etc/rsyslog.conf    
$ModLoad imudp     
$UDPServerRun 514     
local2.*                       /var/log/haproxy.log     
# service rsyslog restart
 
# service haproxy start

 

 

2.2.5 安装配置backup server

本机安装httpd,,修改监听在8080端口,并配置一个主页

# yum -y install httpd    
# vim /var/www/html/index.html     
<html>     
<head>     
<title>Sorry</title>     
</head>     
<body>     
<h1 align="center">Down for maintenance</h1>     
</body>     
</html>
 
# vim /etc/httpd/conf/httpd.conf
 
Listen 8080
 
# service httpd start
 
# ss -tnlp | grep 80    
LISTEN  0  128  :::8080 :::*  users:(("httpd",7122,4),("httpd",7124,4),("httpd",7125,4),("httpd",7126,4),("httpd",7127,4),("httpd",7128,4),("httpd",7129,4),("httpd",7130,4),("httpd",7131,4))     
LISTEN  0  128  *:80    *:*   users:(("haproxy",7108,4))

HAProxy和backup server都启动了。

 

 

3 测试

3.1 首页测试

HAProxy动静分离实验_HAProxy_03

HAProxy动静分离实验_HAProxy_04

[ 分析 ]

URL为http://172.16.23.80/,代理服务器的配置中url_static是无法匹配到的,因此使用缺省backend,把请求发给dynimac,也就是交给WEB1 192.168.23.80处理。

WEB1的默认首页是index.php,执行后返回给浏览器端,浏览器再次发起对css/main.css的请求。

代理服务器配置中的url_static能够匹配,因此请求被调度至WEB2,而WEB2上目录下有这个css文件,响应给浏览器端。

浏览器端使用样式显示信息,因此字体有了变化,有了边框。和单独测试192.168.23.80时浏览器中显示的格式不一样,因为它在本地css目录下找不到css文件的。

为了使区别更加明显,使用了cookie,不同服务器返回的cookie是不一样的。

 

因此,这就实现了动静分离

 

3.2 静态页面测试

HAProxy动静分离实验_HAProxy_05

[ 分析 ]

访问URL为http://http://172.16.23.80/index.html。配置中的url_static能够匹配,因此请求被调度至WEB2。

cookie显示为WEB2。

 

3.3 backup服务器测试

HAProxy动静分离实验_动静分离_06

[ 分析 ]

只是停止了WEB1的http服务,就出现了Sorry Server的响应,这是为什么?

对根“/”的访问,是backend dynimac处理的,如果WEB1停止服务,自然使用backend dynimac中定义的backup服务器顶上。

如果再把WEB2也停了,是不是访问index.html会有什么效果呢?

HAProxy动静分离实验_HAProxy_07

没有出现sorry server的网页,而是出现了503的错误。这是为什么?

原因是配置文件中backend static没有定义backup。

解决的办法,可以在backend static中定义。

backend static    
    balance     roundrobin     
    server      static 192.168.23.81:80 cookie WEB2 check     
    server sorry 127.0.0.1:8080 cookie local backup

 

至此,HAProxy实现的动静分离实验完成。