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

[经验分享] HAProxy 之 概念和配置介绍

  [复制链接]

尚未签到

发表于 2017-11-7 10:00:38 | 显示全部楼层 |阅读模式
本文索引

  • 1  概述

  • 2  HAProxy功能
  • 3  HAProxy组成
  • 4  相关配置
  •         4.1  global配置
  •         4.2  绑定监听端口配置
  •         4.3  定义后端主机的各服务器及其选项
  •         4.4  compression设置
  •         4.5  健康状态检测
  •         4.6  cookie配置
  •         4.7  工作模式
  •         4.8  错误页配置
  •         4.9  修改报文首部
  •         4.10 连接超时


1  概述

HAProxy:是法国人Willy Tarreau开发的一个开源软件,是一款应对客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡器(LB)。其功能是用来提供基于cookie的持久性,基于内容的交换,过载保护的高级流量管制,自动故障切换,以正则表达式为基础的标题控制运行事件,基于Web的报表,高级日志记录以帮助排除故障的应用或网络及其他功能。HAProxy  系统自带管理页面。版本有1.41.5 1.6 1.7 1.8
HAProxy官网:http://www.haproxy.org

2  HAProxy功能
.HAProxy是基于TCP/HTTP反向代理服务器,尤其适合于高可用性环境
.可以针对HTTP请求添加cookie,进行路由后端服务器
.可平衡负载至后端服务器,并支持持久连接
.支持基于cookie进行调度
.支持所有主服务器故障切换至备用服务器
.支持专用端口实现监控服务
.支持不影响现有连接情况下停止接受新连接请求
.可以在双向添加,修改或删除HTTP报文首部
.支持基于pattern实现连接请求的访问控制
.通过特定的URI为授权用户提供详细的状态信息
.支持http反向代理
.支持动态程序的反向代理
.支持基于数据库的反向代理
HAProxy放置在如下的位置调度请求
6943703-a2ed7faa6dc4032e.png

3  HAProxy组成

.程序环境:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
单元文件:/usr/lib/systemd/system/haproxy.service
配置文件配置段:
.global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
.proxies:代理配置段,proxy 名称:使用字母数字-_ . : 并区分字符大小写
defaults:为frontend, backend,listen提供默认配置,如果其他段没配置,则相关参数使用defaults段里设定的参数
frontend:前端, 指定接收客户端连接侦听套接字设置,相当于是VIP,发布到公网的ip,功能相当于在nginx中是配置于 server {}
backend:后端, 指定将连接请求转发至后端服务器的相关设置,相当于是RS,同一个RS可以属于多个backend,功能相当于在nginx中是配置于upstream {}
listen:指定完整的前后端设置,同时拥有前端和后端,只对TCP 有效,适用于一对一环境,但是建议写出frontend和backend格式,方便调整
4  相关配置

4.1  global配置
.global配置参数:
.进程及安全管理:chroot, deamon,user,group, uid, gid
nbproc <number>:要启动的haproxy的进程数量,这个是和内核有关,单核的系统默认单进程,如果是两核,默认是两个,要求使用daemon模式,不建议设置太多数量,因为涉及到上下文
ulimit-n <number>:每个haproxy进程可打开的最大文件数,系统自动会指定,不建议设置
daemon 后端方式运行,建议使用
log:定义全局的syslog服务器;最多可以定义两个
log  <address> [len<length>] <facility>[max level [min level]]
address:rsyslog服务器地址
len:记录日志的长度,默认1024
.性能调整:
maxconn  <number>:设定每个haproxy进程所能接受的最大并发连接数,一般3000比较合适,可以设置在defaults和frontend配置段里
maxconnrate <number>:设置每个进程每秒种所能建立的最大连接数量
maxsessrate <number>:设置每个进程每秒种所能建立的最大会话数量
会话和连接的区别是,一个连接可以包括多个会话。同时,一个连接里也可以没有会话
maxsslconn <number>: 每进程支持SSL的最大连接数量
spread-checks <0..50, inpercent> 健康检测延迟时长比,建议2-5之间。一般不是同时发送,错开检测,把负载均摊在不同的时间里,放在给haproxy服务器造成负担,这里就是定义错开的时间,2表示2%.
4.2  绑定监听端口配置
.bind:指定一个或多个前端侦听地址和端口,应用于frontend和listen
bind  [<address>]:<port_range>  [, ...] [param*]
.示例:
listen http_proxy
bind  :80,:443 #绑定多个ip或端口,用逗号隔开,注意,绑定的端口不能和当前haproxy服务器的其他服务混用,如果和其他服务冲突,建议更改其他服务的默认端口
1
2
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock  user root mode 600 accept-proxy



#这是socket,对内用的,没有实际应用的意义。
以下写法等价于如下的配置,实现功能一样,但是listen是一对一,直接指定前端和后端,Frontend和Backend 区分前端和后端的好处是比较灵活,可以交叉调用,所以建议用前端和后端交叉写
写法一
1
2
3
4
5
6
7
frontend  http
    bind *:80
    default_backend    websrv
backend websrv
    balance    roundrobin
    server     web6e 172.18.50.65:80 check
    server     web7e 172.18.50.75:80 check





写法二
1
2
3
4
5
listen http
    bind :80
    balance roundrobin
    server     web6e 172.18.50.65:80 check
    server     web7e 172.18.50.75:80 check





4.3  定义后端主机的各服务器及其选项
.server  <name>  <address>[:[port]] [param*]
server <name>  <address>[:port]  [settings ...]
default-server  [settings ...]
为backend中的各server设定默认选项
<name>:服务器在haproxy上的内部名称;出现在日志及警告信息
<address>:服务器地址,支持使用主机名
[:[port]]:端口映射;省略时,表示同bind中绑定的端口
[param*]:参数,有以下三类:
weight<weight>:权重,默认为1
例子server web1 172.18.50.65:80 check weight2
maxconn<maxconn>:当前server的最大并发连接数,这里设置5000就很大。
backlog <backlog>:当server的连接数达到上限后的后援队列长度,当rs的并发达到maxconn,就放到等待的队列
backup:设定当前server为备用服务器,相当于sorryserver,这里要求本台服务器要有http服务。需要健康检查后端都失败了才会启用
例子:server  sorryserver  172.18.50.63:9527  backup
.default_backend  <backend>,当没有被use_backend匹配时,使用默认的backend,用于frontend中
.disabled设置
标记主机为不可用,这个是临时的策略,如后端机器需要维护时,可以把这个机器设为disabled,就不会调度到对应的机器。
    例子
1
server  web7e 172.18.50.75:80 check  disabled



redir设置
redir  <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL,重定向到另一台机器上,注意网络要通
例子
1
server  web7e 172.18.50.75:80 check redir http://172.18.50.61:80



    测试
1
for i in {1..10};docurl -L 172.18.50.63;done



4.4  compression设置
.为指定的MIME类型启用压缩传输功能
compressionalgo <algorithm> ...:启用http协议的压缩机制,指明压缩算法gzip, deflate
compressiontype  <mime type> ...:指明压缩的MIMI类型
4.5  健康状态检测
.check
对当前server做健康状态检测,只用于四层检测
注意:httpchk,“smtpchk”, “mysql-check”,“pgsql-check” and “ssl-hello-chk” 用于定义应用层检测方法
addr:检测时使用的IP地址,可以检查同一机器上的不同地址
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3
         例子:
         server web1 172.18.50.65:80 check weight 2  addr 192.168.32.65  port 80  inter 3000 rise 2 fall 2
                   其中:  addr  192.168.32.65 port 80可以不是提供服务的ip和端口,只要和能确定后端服务的状态的ip就可以了
httpchk
.对后端服务器做http协议的健康状态检测:通常用于backend。工作原理是发http请求,获取到对应的页面,表示健康,所以后端服务器log会有相应的大量访问记录
option httpchk默认为:/OPTIONS HTTP/1.0
option httpchk  <uri>
option httpchk <method>  <uri>
option httpchk <method>  <uri>  <version>
定义基于http协议的7层健康状态检测机制
例子,   构造GET的检测报文例子如下
1
option httpchk GET /index.htmlHTTP/1.1\r\nhost:www.sunny.com



http-check expect [!] <match><pattern>                                          
http协议健康状态检测响应内容或指定响应码,希望得到的状态码
默认状态码200是正常的,以下改成得到404状态码时为正常,配置如下
1
2
option httpchk
http-checkexpect status 404



4.6  cookie配置
cookie <value>:为当前server指定cookie值,实现基于cookie的会话黏性
.cookie  <name> [ rewrite | insert | prefix ] [ indirect] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain>]* [ maxidle <idle> ] [ maxlife <life> ]
<name>:cookie名称,用于实现持久连接
rewrite:重写
insert:插入,把cookie信息插入到响应报文里
prefix:前缀
     nocache 表示cookie信息不缓存
配置示例
.基于cookie的session sticky的实现:
backend websrvs
cookie WEBSRV  insert  nocache
#WEBSRV是cookie的键,值是其他命令指定,如以下的srv1 和 srv2就是对应的值
1
server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie cksrv1



#调度到server1 那么cookie值就是cksrv1,这个就是对应客户拿到的cookie值
1
server  srv2 172.16.100.7:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie cksrv2



测试
在浏览器中测试,第一次在请求报文里没有cookie值,响应报文里都有cookie值.
响应报头有如下的内容,WEBSRV为cookie的键,cksrv1为cookie的值
Set-Cookie: WEBSRV=cksrv1; path=/
另外,curl命令访问时,默认不带cookie值,需要通过选项-b实现,命令如下
curl  -b WEBSRV=cksrv1172.18.50.63
4.7  工作模式
.mode  { tcp|http|health}
定义haproxy的工作模式,有三个:tcp|http|health,不支持UDP模式
tcp:基于layer4实现代理;可代理mysql, pgsql, ssh,ssl等协议,https时使用此模式
http:仅当代理协议为http时使用,centos实际默认模式
health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接,较少使用,可用于测试环境
TCP模式示例
默认是http模式, 如果是用frontend或者backend来定义,则两个配置段都要写入mode  tcp.
1
2
3
4
5
6
listen ssh
    bind :22222
    balance leastconn
    mode tcp
    server sshsrv1 172.16.100.6:22 check
    server sshsrv2 172.16.100.7:22 check



如果在centos6上基于tcp的调度,重启haproxy出现如下的报错,可以忽略,或者是把默认的两个选项option 为httplog和forwardfor注释掉即可,重启服务测试一下调度,已经可以正常调度。
Stopping haproxy:                                         [  OK  ]
Starting haproxy: [WARNING] 305/173945 (6553) : parsing[/etc/haproxy/haproxy.cfg:46] : 'option httplog' not usable with proxy 'ssh'(needs 'mode http'). Falling back to 'option tcplog'.[WARNING] 305/173945(6553) : config : 'option forwardfor' ignored for proxy 'ssh' as it requiresHTTP mode.[WARNING] 305/173945 (6553) : parsing [/etc/haproxy/haproxy.cfg:46] :'option httplog' not usable with proxy 'mysql' (needs 'mode http'). Fallingback to 'option tcplog'.[WARNING] 305/173945 (6553) : config : 'optionforwardfor' ignored for proxy 'mysql' as it requires HTTP mode.                      [ OK  ]
如果是ssh的调度。建议先更改ssh的服务为其他端口,或者直接绑定ssh服务在某一特定的ip上.另外,同一个ip上有不同的mac导致认为安全性验证失败,提示:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!,如61机器要ssh连接73机器,73为HA调度器,出现报错,此时,需要把61下/root/.ssh/known_host关于73上信息删掉,才可以再次被调度,这样造成的问题可能是同一台机器,如果调度器是轮询调度,而且权重都是1:1,如果只有一台机器进行ssh,那么该机器永远会被调度到同一台机器上,因为当该机器正常ssh连接的时候,为一次调度,要进行下一次ssh前,需要清空61上/root/.ssh/known_host关于73上信息,然后在进行下一次的ssh,否则下一次就会出现mac信息的错误。
4.8  错误页配置
设置在backend配置段
.errorfile  <code> <file> 自定义错误页
<code>:HTTPstatus code. 支持200,400, 403, 408, 500, 502, 503, 504.注意,只有指定的这几个code支持
<file>:错误页文件路径
.示例:
1
2
3
4
errorfile  400 /etc/haproxy/errorfiles/400badreq.http
errorfile  408 /dev/null # workaround Chrome pre-connectbug
errorfile  403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503/etc/haproxy/errorfiles/503sorry.http



errorloc
根据code执行相应跳转
格式
errorloc  <code>  <url>
例子
1
errorloc 503 http://wwww.sunny.com/



4.9  修改报文首部
在frontend配置段里添加
格式:reqadd  <string> [{if | unless} <cond>]
在请求报文尾部添加指定首部,可以用于排错,确定该请求是从哪台haproxy转发过来的
例子
HA上。注意写法,头部后面一定要有冒号
1
reqadd sunny-x-via:haproxy6c



RS上的http服务器上定义log格式
1
ogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\"  \"%{sunny-x-via}i\"" combined



在响应报文尾部添加指定首部,客户端得到的响应报文会添加上对应的报头,
格式:rspadd <string> [{if | unless}<cond>]
例子
1
rspadd  Server:Sunny-proxy6c



从请求报文中删除匹配正则表达式的首部,
1
2
.reqdel <search>  [{if | unless} <cond>]
.reqidel <search>  [{if | unless} <cond>] (ignore case) 小写字母i表示不分大小写



从响应报文中删除匹配正则表达式的首部
1
2
.rspdel  <search>  [{if | unless} <cond>]
.rspide  l<search>  [{if | unless} <cond>] (ignore case) 不分大小写



  其中i是指忽略大小写,如果这里先通过rspdel Server删掉首部,然后再rspadd  Server:Sunny-proxy6c添加首部,可以伪造首部Server的内容
4.10  连接超时
以下的时间设置要根据企业的业务实际情况设置,如游戏,一般设置时间长一点。
1
2
3
4
5
6
7
.timeout client  <timeout>:客户端最长空闲连接超时时长默认单位是毫秒
.timeout  server  <timeout>:后端服务器最长空闲连接超时时长
.timeout http-keep-alive  <timeout>:持久连接的持久时长
.timeout http-request<timeout>:一次完整的HTTP请求的最大等待时长
.timeout connect <timeout>:成功连接后端服务器的最大等待时长
.timeout client-fin <timeout>:客户端半连接的空闲时长,四次挥手只完成了前两次挥手
.timeout server-fin <timeout>:后端服务器半连接的空闲时长



运维网声明 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-406621-1-1.html 上篇帖子: Haproxy+keepalived做简单的高可用(主主模式) 下篇帖子: HAProxy 之 日志记录管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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