haproxy基础详解及动静分离的实现

haproxy 介绍

 

1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器

 

 

01. 负载均衡调度器分类
02. 工作在四层:
03. #  lvs
04. 工作在七层:
05. #  nginx   (web,http reverse proxy,cache)
06. #  haproxy (http reverse proxy,tcp proxy)
07. #     tcp:  实现<a href="http://www.it165.net/database/dbmy/" target="_blank" class="keylink">MySQL</a>的读写中读的负载均衡
08. #  ats     (apache traffic  server)
09. #  perlbal
10. #  pound
11. #  squid
12. #  varnish
13. 以上程序都可以实现服务的向外拓展;

 

haproxy特性

 

haproxy 当前版本为1.3 1.4,下面我们介绍1.4版本的特性

 

01. # 客户端侧的长连接(client-side keep-alive)
02. # TCP加速(TCP speedups)
03. #  响应池(response buffering)
04. #  RDP协议
05. #  基于源的粘性(source-based stickiness)
06. #  更好的统计数据接口(a much better stats interfaces)
07. #  更详细的健康状态检测机制(more verbose health checks)
08. #  基于流量的健康评估机制(traffic-based health)
09. #  支持HTTP认证
10. #  服务器管理命令行接口(server management from the CLI)
11. #  基于ACL的持久性(ACL-based persistence)
12. #  日志分析器

 

官网站点:haproxy.1wt.eu

 

 

haproxy 架构图

 

wKioL1Np5h_i9MFbAADhowCMXv8632.jpg

 

 

haproxy.cfg 配置文件详解

 

安装

#yum -y inistall haproxy

配置文件路径

/etc/haproxy/haproxy.cfg

 

 

01. (1)配置由两部分组成
02. #global settings: 对haproxy进程自身属性的设定----------全局设定段
03. #proxies: 对代理的设定 -----------------代理设定段
04. defaults
05. frontend
06. backend
07. listen
08. 其中defaults为proxies提供默认属性,frontend接受客户端的请求,backend连接后端的上游服务器(类似于nginx的upstream),listen是特定的frontend与backend的组合
09. (2)定义一个完整的代理的方式:
10. frontend
11. backend
12. listen
13. (3)defaults段分析
14.  
15. #  option   httpclose:使用短连接
16. #  option   redispath:使用cookie保持会话,如果后端的server宕机,则使用redispath 重定向另一个路径继续保持会话;
17. #  option   http-server-close  :当keep-alive超时时,使用该选项在服务器上关闭会话   
18. #  timeout  connect  :haproxy转发到后边upstream server 时等待的时长
19. #  timeout  client   :客户端非活动状态的超时时长
20. #  timeout  server   :  haproxy和后边的服务器段保持一个会话,当后台服务器down掉后,haproxy等待的超时时间
21. #  timeout-keep-alive:定义保持连接模式的超时时长      
22. #  timeout-check     : 建立状态检测时间的超时时间
23. #  maxconn           :每一个server最大并发连接数

 

 

负载均衡调度方法

 

 

1. 格式:balance  roundrobin| static-rr| leastconn | source | uri | uri_param | hdr(&lt;name&gt;) | rdp-cookie(name)

 

 

01. 调度方法解析
02. #roundrobin :属于加权轮询 (动态)  支持服务器活动时修改其权重,服务器下线后重新上线时支持慢启动
03. #static-rr :  属于加权轮询(静态)不支持服务器活动时修改,需要重启服务才能生效
04. #             老服务器重新上线上时,立刻会收到大批量的请求
05. #leastconn :支持动态修改权重,慢启动
06. #source    :默认为(静态)方法,hash/ 源ip 取模算法,支持hash-type调整为动态
07. #uri       :默认为(静态)方法,hash/weight 取模算法,支持hash-type来调整
08. #url-params:默认为(静态)方法,hash/wgith 算法,支持hash-type调整
09. #hdr (<name>):默认为静态方法, 先对<name>做hash计算然后 hash/weight 计算,支持hash-type调整

 

 

01. 调度方法的使用总结
02. #1、调度众多的<a href="http://www.it165.net/database/dbmy/" target="_blank" class="keylink">MySQL</a>从服务器,用什么调度方法?
03. leastconn
04. #2、调度web图片服务器组,用什么调度方法?
05. roundrobin
06. #3、调度web图片服务器组,用什么调度方法?
07. source 或者 cookie
08. #4、调度web缓存服务器组,用什么调度方法?
09. uri
10. hash-type
11. map-based (默认的静态的hash表)
12. consistent(动态的一致性hash) ---------在后端的cache服务器上使用,否则会导致服务器的加入或者退出时 服务器群瘫痪

 

 

haproxy 的工作模式 (使用mode参数)

 

 

1. http :http协议  --------haproxy的价值体现于此
2. #      对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制;
3.  
4. tcp  :haproxy在客户端和upstream server之间建立一个全双工的连接
5. #      不会对应用层协议做任何检查
6. #      SSL 、MySQL、SSL等都应该使用此模式;
7. #      默认模式!

 

 

指定haproxy日志

 

01. # log global : 使用全局配置中定义的日志服务器;
02. # log <address> <facility> [<level>  [<minlevel>]]
03. # capture request header <HEADER>  len <LENGTH>
04. # capture resopense header <HEADER>  len <LENGTH>
05. 实例:在frontend中定义一个日志
06. (1)编辑rsyslog.conf
07. #vim  /etc/rsyslog.conf  在日志服务器上先定义一个日志
08. local3.*    /var/log/hawebsrv.log
09. #service rsyslog restart
10. (2)编辑haproxy.cfg
11. #vim /etc/haproxy/haproxy.cfg
12. frontend websrv
13. log 127.0.0.1 local3
14. bind *:80
15. default_backend  webservers
16. #serivce  haproxy reload
17. (3)haproxy服务器测试
18. #tail /var/log/hawebsrv.log

 

haproxy中的ACL

 

 

1. 格式:acl &lt;aclname&gt;  &lt;criterion&gt; [flags] [oprator] &lt;value&gt;    
2.  
3. value:   支持整数或者整数范围
4. 支持字符串
5. 支持正则表达式
6. 支持ip地址和网络地址

 

1. ACL例子
2. # acl url_static  path_beg  /static /images  /img /css                
3. # acl url_static  path_end  .gif  .png  .jpg  .css .js
4. # acl host_www    hdr_beg(host) -i  www         
5. # acl  host_static  hdr_beg(host) -i  img. video. download. ftp.  
6. # use_backend   static  if  host_static  or host_www or url_static
7. # use_backend   www  if  host_www

 

 

1. 实现访问控制     
2. http-request:7层过滤   (借助于定义好的acl实现)
3. tcp-request: 4层过滤    (借助于定义好的acl实现)

 

haproxy 动静分离的实现

 

架构图

 

wKioL1Np89Oik9d1AACXrXOJQ0o808.jpg

1、 环境配置

 

 

01. haproxy服务器配置
02. 外网网卡
03. #ifconfig eth0 172.16.13.2/16 up
04. #route add default gw 172.16.0.1
05. 内网网卡
06. #ifconfig eth1 192.168.20.1/24 up
07. 两台上游服务器配置
08. server1 配置
09. #ifconfig eth0 192.168.20.11/24
10. #route add default gw 192.168.20.1
11. 提供页面
12. #vim /var/www/html/index.html
13. &lt;h1&gt;node1.linux.com&lt;/h1&gt;
14. #service httpd start
15. server2配置
16. #ifconfig eth0 192.168.20.12/24 up
17. #route add default gw 192.168.20.1
18. 提供页面
19. #vim  /var/www/html/index.html
20. &lt;h1&gt;node2.linux.com&lt;h1&gt;
21. #service  httpd start

 

2、 安装配置haproxy

 

1. # yum -y install haproxy  安装haproxy
2. #vim /etc/haproxy/haproxy.cfg  编辑配置文件自定义一个backend和frontend,注释原有的内容
3. frontend  websrv *:80        
4. default_backend   webservers
5. backend   webservers
6. balance   roundrobin
7. server     node1  192.168.20.11:80  check
8. server     node2   192.168.20.12:80   check

 

3、 客户端测试

 

wKioL1Np9u2halzkAABm4VsD7kk102.jpg

wKioL1Np9vmQcAb_AABeMbu8jjs173.jpg

此时说明 haproxy服务器将客户的请求以roundrobin算法 反向代理给后端的服务器!

 

4、启用全局日志功能

 

01. (一)编辑rsyslog.conf
02. #vim  /etc/rsyslog.conf  开启如下行
03. # Provides UDP syslog reception
04. $ModLoad imudp
05. $UDPServerRun 514
06. # Provides TCP syslog reception
07. $ModLoad imtcp
08. $InputTCPServerRun 514
09. 添加日志
10. local2.*           /var/log/haproxy.log
11.  
12. #service rsyslog restart 重启服务
13. (二)编辑haproxy.cfg
14. # vim  /etc/haproxy/haproxy.cfg 开启如下行
15. log         127.0.0.1 local2
16. # service  haproxy restart  重启服务
17. (三)日志查看
18. #tail -f /var/log/haproxy.log

wKioL1Np-FvBb0ZpAAHBwD1gOvw836.jpg

 

接下来让我们来拓展haproxy的功能

 

5 、调度算法 uri的实现

 

 

01. 1)后端服务器 server1 与 server2 同时创建多个页面
02. server1
03. #cd /var/www/html/
04. # for i in {1..10}; do echo "<h1>node1.test$i</h1>"  >  test$i.html; done
05. server2 方法同server1
06. 2)更改haproxy.cfg的配置文件中的调度算法
07. balance uri
08. 3)客户端测试

 

wKiom1Np-0KQ9ElkAABm9L9x-ZY858.jpg

基于172.16.13.2/test1.html 该uri,haproxy服务器反向代理至后台服务器至同一台服务器server2

 

6、基于cookie实现会话绑定

 

 

01. 1)编辑haproxy.cfg配置文件
02. #vim  /etc/haproxy/haproxy.cfg  内容如下
03. frontend websrv
04. bind *:80
05. default_backend  webservers
06. backend  webservers
07. cookie node insert nocache
08. balance roundrobin
09. server  node1  192.168.20.11:80 check  cookie node1
10. server  node2  192.168.20.12:80 check  cookie node2
11. 2)客户端测试

 

wKiom1Np_WqxQWcTAAI6ilXivxo518.jpg

上图可见,基于cookie实现了客户端的请求与后端服务器server2的会话绑定

 

 

7、haproxy管理界面---stats enable

 

 

1. #vim /etc/haproxy/haproxy.cfg 增加一个listen段,如下所示
2. listen statspage
3. bind *:8009    -------侦听端口
4. stats enable   -------开启stats
5. stats hide-version -----隐藏版本
6. stats auth admin:admin ----登录验证信息
7. stats admin if TRUE    ----实现在管理界面上对所有backend服务器管理
8. stats uri /admin?stats ----登录的uri路径

 

wKiom1Np_4yADwYaAAedNz5EvyU391.jpg

 

8、haproxy动静分离的实现

 

 

01. 1)server2 服务器安装php
02. #yum -y install php php-mysql
03. 提供php动态页面
04. #vim /var/www/html/index.php
05. &lt;h1&gt;node2.linux.com&lt;/h1&gt;
06. &lt;?php
07. phpinfo();
08. ?&gt;
09.  
10. 2)重新配置haproxy配置文件
11. #vim  /etc/haproxy/haproxy.cfg   定义frontend  和 backend
12. frontend websrvs
13. bind *:80
14. acl url_static       path_beg       -i /static /images /javascript /stylesheets
15. acl url_static       path_end       -i .jpg .gif .png .css .js .html
16. acl host_static      hdr_beg(host)  -i img. video. download. ftp. imags. videos.
17. acl url_php          path_end       -i .php
18. use_backend static          if url_static or host_static
19. use_backend dynamic         if url_php
20. default_backend             dynamic
21. backend static
22. balance     roundrobin
23. server      node1 192.168.20.11:80  check maxconn 30000   
24.  
25. backend dynamic
26. balance     roundrobin
27. server  node2 192.168.20.12:80 check maxconn  1000
28. # service haproxy restart
29. 3) 客户端测试 动静分离

 

 

wKioL1NqALODh5OIAACFP2QLgmk328.jpg

wKioL1NqAMzBbvqRAAKEJyRnEEo275.jpg

如图所示:静态页面代理至server1服务器,动态页面代理至server2 服务器,实现

 

 

PS: 个人水平有限,不足之处请指出。关于更多信息请参考haproxy官方网站。

 

[转载自 http://www.it165.net/admin/html/201405/3013.html]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dengkane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值