HAProxy 之 概念和配置介绍

本文索引

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

官方文档:https://cbonte.github.io/haproxy-dconv/

2  HAProxy功能

.HAProxy是基于TCP/HTTP反向代理服务器,尤其适合于高可用性环境

.可以针对HTTP请求添加cookie,进行路由后端服务器

.可平衡负载至后端服务器,并支持持久连接

.支持基于cookie进行调度

.支持所有主服务器故障切换至备用服务器

.支持专用端口实现监控服务

.支持不影响现有连接情况下停止接受新连接请求

.可以在双向添加,修改或删除HTTP报文首部

.支持基于pattern实现连接请求的访问控制

.通过特定的URI为授权用户提供详细的状态信息

.支持http反向代理

.支持动态程序的反向代理

.支持基于数据库的反向代理

HAProxy放置在如下的位置调度请求


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 :要启动的haproxy的进程数量,这个是和内核有关,单核的系统默认单进程,如果是两核,默认是两个,要求使用daemon模式,不建议设置太多数量,因为涉及到上下文

ulimit-n :每个haproxy进程可打开的最大文件数,系统自动会指定,不建议设置

daemon后端方式运行,建议使用

log:定义全局的syslog服务器;最多可以定义两个

log   [len] [max level [min level]]

address:rsyslog服务器地址

len:记录日志的长度,默认1024

.性能调整:

maxconn  :设定每个haproxy进程所能接受的最大并发连接数,一般3000比较合适,可以设置在defaults和frontend配置段里

maxconnrate :设置每个进程每秒种所能建立的最大连接数量

maxsessrate :设置每个进程每秒种所能建立的最大会话数量

会话和连接的区别是,一个连接可以包括多个会话。同时,一个连接里也可以没有会话

maxsslconn :每进程支持SSL的最大连接数量

spread-checks <0..50, inpercent>健康检测延迟时长比,建议2-5之间。一般不是同时发送,错开检测,把负载均摊在不同的时间里,放在给haproxy服务器造成负担,这里就是定义错开的时间,2表示2%.

4.2绑定监听端口配置

.bind:指定一个或多个前端侦听地址和端口,应用于frontend和listen

bind  []:  [, ...] [param*]

.示例:

listen http_proxy

bind  :80,:443 #绑定多个ip或端口,用逗号隔开,注意,绑定的端口不能和当前haproxy服务器的其他服务混用,如果和其他服务冲突,建议更改其他服务的默认端口

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区分前端和后端的好处是比较灵活,可以交叉调用,所以建议用前端和后端交叉写

写法一

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

写法二

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    [:[port]] [param*]

server  [:port]  [settings ...]

default-server  [settings ...]

为backend中的各server设定默认选项

:服务器在haproxy上的内部名称;出现在日志及警告信息

:服务器地址,支持使用主机名

[:[port]]:端口映射;省略时,表示同bind中绑定的端口

[param*]:参数,有以下三类:

weight:权重,默认为1

例子server web1 172.18.50.65:80 check weight2

maxconn:当前server的最大并发连接数,这里设置5000就很大。

backlog :当server的连接数达到上限后的后援队列长度,当rs的并发达到maxconn,就放到等待的队列

backup:设定当前server为备用服务器,相当于sorryserver,这里要求本台服务器要有http服务。需要健康检查后端都失败了才会启用

例子:server  sorryserver  172.18.50.63:9527  backup

.default_backend  ,当没有被use_backend匹配时,使用默认的backend,用于frontend中

.disabled设置

标记主机为不可用,这个是临时的策略,如后端机器需要维护时,可以把这个机器设为disabled,就不会调度到对应的机器。

例子

server  web7e 172.18.50.75:80 check  disabled

redir设置

redir  :将发往此server的所有GET和HEAD类的请求重定向至指定的URL,重定向到另一台机器上,注意网络要通

例子

server  web7e 172.18.50.75:80 check redir http://172.18.50.61:80

测试

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

4.4  compression设置

.为指定的MIME类型启用压缩传输功能

compressionalgo ...:启用http协议的压缩机制,指明压缩算法gzip, deflate

compressiontype   ...:指明压缩的MIMI类型

4.5  健康状态检测

.check

对当前server做健康状态检测,只用于四层检测

注意:httpchk,“smtpchk”, “mysql-check”,“pgsql-check” and “ssl-hello-chk”用于定义应用层检测方法

addr:检测时使用的IP地址,可以检查同一机器上的不同地址

port:针对此端口进行检测

inter :连续两次检测之间的时间间隔,默认为2000ms

rise :连续多少次检测结果为“成功”才标记服务器为可用;默认为2

fall :连续多少次检测结果为“失败”才标记服务器为不可用;默认为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 

option httpchk  

option httpchk    

定义基于http协议的7层健康状态检测机制

例子,构造GET的检测报文例子如下

option httpchk GET /index.htmlHTTP/1.1\r\nhost:www.sunny.com

http-check expect [!]

http协议健康状态检测响应内容或指定响应码,希望得到的状态码

默认状态码200是正常的,以下改成得到404状态码时为正常,配置如下

option httpchk

http-checkexpect status 404

4.6cookie配置

cookie :为当前server指定cookie值,实现基于cookie的会话黏性

.cookie   [ rewrite | insert | prefix ] [ indirect] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain ]* [ maxidle ] [ maxlife ]

:cookie名称,用于实现持久连接

rewrite:重写

insert:插入,把cookie信息插入到响应报文里

prefix:前缀

nocache表示cookie信息不缓存

配置示例

.基于cookie的session sticky的实现:

backend websrvs

cookie WEBSRV  insert  nocache

#WEBSRV是cookie的键,值是其他命令指定,如以下的srv1和srv2就是对应的值

server srv1 172.16.100.6:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie cksrv1

#调度到server1那么cookie值就是cksrv1,这个就是对应客户拿到的cookie值

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.

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  自定义错误页

:HTTPstatus code.支持200,400, 403, 408, 500, 502, 503, 504.注意,只有指定的这几个code支持

:错误页文件路径

.示例:

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   

例子

errorloc 503 http://wwww.sunny.com/

4.9修改报文首部

在frontend配置段里添加

格式:reqadd  [{if | unless} ]

在请求报文尾部添加指定首部,可以用于排错,确定该请求是从哪台haproxy转发过来的

例子

HA上。注意写法,头部后面一定要有冒号

reqadd sunny-x-via:haproxy6c

RS上的http服务器上定义log格式

ogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\"  \"%{sunny-x-via}i\"" combined

在响应报文尾部添加指定首部,客户端得到的响应报文会添加上对应的报头,

格式:rspadd  [{if | unless}]

例子

rspadd  Server:Sunny-proxy6c

从请求报文中删除匹配正则表达式的首部,

.reqdel   [{if | unless} ]

.reqidel   [{if | unless} ] (ignore case) 小写字母i表示不分大小写

从响应报文中删除匹配正则表达式的首部

.rspdel    [{if | unless} ]

.rspide  l  [{if | unless} ] (ignore case) 不分大小写

其中i是指忽略大小写,如果这里先通过rspdel Server删掉首部,然后再rspadd  Server:Sunny-proxy6c添加首部,可以伪造首部Server的内容

4.10连接超时

以下的时间设置要根据企业的业务实际情况设置,如游戏,一般设置时间长一点。

.timeout client  :客户端最长空闲连接超时时长默认单位是毫秒

.timeout  server  :后端服务器最长空闲连接超时时长

.timeout http-keep-alive  :持久连接的持久时长

.timeout http-request:一次完整的HTTP请求的最大等待时长

.timeout connect :成功连接后端服务器的最大等待时长

.timeout client-fin :客户端半连接的空闲时长,四次挥手只完成了前两次挥手

.timeout server-fin :后端服务器半连接的空闲时长

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 目录: HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的安装和运行 使用HAProxy搭...
    kelgon阅读 79,747评论 9 159
  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,786评论 0 9
  • 参考文档: 1.haproxy:http://www.haproxy.org/ 本文涉及haproxy的安装,并做...
    Netonline阅读 2,411评论 1 51
  • HAProxy简介HAProxy配置ACL配置TCP转发SSL转发 一、HAProxy简介: (一)HAProxy...
    哈喽别样阅读 1,519评论 0 0
  • Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能: 路由HTTP请求到后端服务器,基...
    uangianlap阅读 1,532评论 0 1