实验前提:
1、本次实验是在RHEL 6.4(64bit)系统上完成的。
2、实验前确保每台服务器同步
3、本次实验有3台主机,其中haproxy作为反向代理地址为192.168.108.232,后面2台的httpd服务器为192.168.108.230和192.168.108.231.(我这里在虚拟机上使用的是桥接的方式,也可以使用仅主机方式,不过使用仅主机方式haproxy上需要2快网卡)
4、测试时请关闭防火墙和selinux
实验拓扑结构:
安装步骤:
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
后端的2个httpd服务配置完成之后最后测试一下,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,显示结果为:
然后在刷新该页面,显示结果为:
由于采用的是加权轮调算法,因此,每个用户请求都会均匀的分发给后端的服务器。
5、定义备份服务器
定义备份服务器的好处在于,当后端的所有服务器都不可用时,将启动备份服务器,此时备份服务器通常不是用来提供服务的,而是返回一些提示信息给用户,比如“网站正在维护中,请您稍好访问...”等之类的信息。
在backend段中在添加一个server,并且在这个server后面加上参数backup即可。比如:
backend webserver
server localweb 127.0.0.1 backup
然后在本机上安装httpd,并启动该服务器。
# yum -y install httpd
echo "sorry,Site is weihu
" > /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。如:
当用户下一次请求时,请求报文中将会新增一个cookie首部,如:
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
显示结果为:
将用户名xsl和密码xsl输入进去之后,显示结果为:
这个界面里面包含了各种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来完成请求资源的动静分离。
其架构设计如下:
在这个图中,所有静态资源有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 "
hello,static site" > /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 "
hello,dynamic site" > /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,访问结果如下:
访问http://192.168.108.230:8080/index.php,访问结果如下:
至此,请求资源的动静分离已经实现了。