实验前提:php
一、本次实验是在RHEL 6.4(64bit)系统上完成的。css
二、实验前确保每台服务器同步html
三、本次实验有3台主机,其中haproxy做为反向代理地址为192.168.108.232,后面2台的httpd服务器为192.168.108.230和192.168.108.231.(我这里在虚拟机上使用的是桥接的方式,也可使用仅主机方式,不过使用仅主机方式haproxy上须要2快网卡)linux
四、测试时请关闭防火墙和selinuxnginx
实验拓扑结构:web
安装步骤:redis
一、配置web1算法
首先须要安装httpd服务(须要事先配置好yum源)vim
# 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
二、配置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是否能够正常工做。若是能够,则继续下面的步骤。
三、配置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
四、测试负载均衡功能是否生效
访问http://192.168.108.233,显示结果为:
而后在刷新该页面,显示结果为:
因为采用的是加权轮调算法,所以,每一个用户请求都会均匀的分发给后端的服务器。
五、定义备份服务器
定义备份服务器的好处在于,当后端的全部服务器都不可用时,将启动备份服务器,此时备份服务器一般不是用来提供服务的,而是返回一些提示信息给用户,好比“网站正在维护中,请您稍好访问...”等之类的信息。
在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
六、定制日志文件
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"
七、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首部,如:
八、启用统计报告功能,使用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:宕机的总时间
九、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 "<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,访问结果以下:
访问http://192.168.108.230:8080/index.php,访问结果以下:
至此,请求资源的动静分离已经实现了。