设为首页 收藏本站
查看: 2280|回复: 0

[经验分享] haproxy基础详解及动静分离的实现

[复制链接]
YunVN网友  发表于 2017-4-18 09:08:48 |阅读模式
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 架构图
 
DSC0000.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 动静分离的实现
 
架构图
 
DSC0001.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、 客户端测试
 
DSC0002.jpg
DSC0003.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


DSC0004.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)客户端测试
09.# http://172.16.13.2/test1.html


 
DSC0005.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)客户端测试
12.#http://172.16.13.2/test1.html


 
DSC0006.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路径


 
DSC0007.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) 客户端测试 动静分离


 
 
DSC0008.jpg
DSC0009.jpg
如图所示:静态页面代理至server1服务器,动态页面代理至server2 服务器,实现
 
 
PS: 个人水平有限,不足之处请指出。关于更多信息请参考haproxy官方网站。
 
[转载自 http://www.it165.net/admin/html/201405/3013.html]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-365719-1-1.html 上篇帖子: haproxy 1.3.16 is getting closer ! 下篇帖子: 转载:HAProxy 研究笔记 -- rules 实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表