2017 10-31 haproxy的应用

一.HAProxy介绍

  • HAProxy: 是法国人Willy Tarreau开发的一个开源软件,是 一款应对客户端10000以上的同时连接的高性能的TCP和 HTTP负载均衡器。其功能是用来提供基于cookie的持久性, 基于内容的交换,过载保护的高级流量管制,自动故障切换 ,以正则表达式为基础的标题控制运行时间,基于Web的报 表,高级日志记录以帮助排除故障的应用或网络及其他功能
  • LB Cluster:
    四层:lvs, nginx(stream),haproxy(mode tcp)
    七层:http: nginx(http), haproxy(mode http), httpd

(1)HAProxy功能:

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

(2)HAProxy组成

程序环境:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段: 
global:全局配置段 进程及安全配置相关的参数 性能调整相关参数 Debug参数 
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥有前端和后端,适用于一对一环境
简单的配置练习:vim /etc/haproxy/haproxy.cfg


image.png

在客户端上使用curl 172.18.254.242来测试


image.png
  • 有关globe配置设置
    image.png

    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
  • log日志功能
    在globe中log对应的地址为本地地址,且记录在/var/log/haproxy.log文件中
    在/etc/rsyslog中设置


    image.png

    image.png

    在客户端上测试查看日志


    image.png

    也可以将本地地址改为远程地址,在远程上进行日志记录
    例如: log 192.168..136.134 local2
    并在134这个服务器端的日志配置文件中做相同操作
    设置完成后在客户端再进行测试查看日志记录
    image.png

    也就是说日志可以记录在本机也可以记录在远程服务器上

二.proxy配置段介绍

配置参数:
(1)bind:指定一个或多个前端侦听地址和端口


image.png

也可以监听多个端口或地址
bind :80, :8008
或者bind 172.18.254.22:80,172.254.243:80
(2)Listen设置:不区分前段后端,属于一一对应关系


image.png

将前端和后端结合在一起
(3)balance调度算法
balance:后端服务器组内的服务器调度算法

调度算法: 
1.roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支 持慢启动;每个后端backend中最多支持4095个server
server options: weight # 
2.static-rr:基于权重轮询,静态算法,不支持权重的运行时调整及慢 启动;后端主机数量无上限 
leastconn:加权最少连接,动态算法,最少连接的后端服务器优先分 配接收新连接,相同连接时轮询,推荐在较长会话的场景使用,例如 MySQL、LDAP等,不适合http 
3.first:根据服务器在列表中的位置,自上而下进行调度;前面服务器 的连接数达到上限,新请求才会分配给下一台服务 
4.source:源地址hash,新连接先按权重分配,后续连接按source分配 请求
5.uri: 对URI的左半部分或整个uri做hash计算,并除以服务器总权 重取模,以后派发至某挑出的服务器,适用于后端缓存服务器 <scheme>://<user>:<password>@<host>:<port>/<path> ;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag> 


image.png

在客户端测试:
image.png

6.url_param: 对用户请求的uri中的<params>部分中的参数的值作hash计算 ,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪 用户,以确保来自同一个用户的请求始终发往同一个Backend Server
7.hdr(<name>):对于每个http请求,此处由<name>指定的 http首部将会被取出做hash计算; 并由服务器总权重相除以 后派发至某挑出的服务器;无有效值的会被轮询调度 hdr(Cookie)
在客户端上vim /etc/hosts
image.png

通过访问Host的首部进行hash计算并被调度
image.png

8.rdp-cookie 远程桌面相关 
9.rdp-cookie(<name>)
(3)server配置
weight <weight>:权重,默认为1

maxconn <maxconn>:当前后端server的最大并发连接数
backlog <backlog>:当server的连接数达到上限后的后援队 列长度 backup:设定当前server为备用服务器Sorry Server


image.png

在haproxy服务器上将监听端口改为9527,将客户端全部停掉Http服务,此时sorryserver提供服务
(4)健康状态检测
check:对当前server做健康状态检测,只用于四层检测
注意:httpchk,“smtpchk”, “mysql-check”, “pgsqlcheck” and “ssl-hello-chk” 用于定义应用层检测方法
addr :检测时使用的IP地址
port :针对此端口进行检测
inter <delay>:检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服 务器为可用;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服 务器为不可用;默认为3 
image.png

在rs服务器上设置一个另外一个地址133的地址,检测机制是检查133地址而不是134的地址所以当133网址关掉后,就不会将往134的服务器上进行调度,结果连134的地址都不可用
disabled:标记为不可用
临时不可用,在实际工作中,当某个服务器需要维护或更新时,可以将改地址设为disabled,这样就不会往该服务器上调度
redir <prefix>:将发往此server的所有GET和HEAD类的请 求重定向至指定的URL
image.png

在客户端上curl -L 172.18.254.242只要访问rs2就会被调度到haproxy服务器上
image.png

(5)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:插入
prefix:前缀
image.png

在客户端curl -I 172.18.254.242
image.png

实现绑定,只会往rs1调度
curl -b SRV=srv2 172.18.254.242就会调度到rs2上
(5)统计接口启用相关的参数
stats enable
启用统计页;基于默认的参数启用stats page
  • stats uri : /haproxy?stats uri默认值
  • stats realm : HAProxy\ Statistics
  • stats auth : no authentication 
    stats uri <prefix> 自定义stats page uri,默认为 
    stats auth <user>:<passwd> 认证时的账号和密码,可使用多次  stats realm <realm> 认证时的realm 
    stats hide-version 隐藏版本
    image.png

    image.png

    演示示例:
    image.png

    显示结果:
    image.png

    (6)工作模式
    maxconn <conns>:为指定的frontend定义其最大并发连接 数;默认为3000 
    image.png

    image.png

    mode { tcp|http|health } 定义haproxy的工作模式
    tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议,https时使用此模式,默认模式
    http:仅当代理协议为http时使用,centos实际默认模式
    health:工作为健康状态检查的响应模式,当连接请求到 达时回应“OK”后即断开连接,较少使用
    (7)健康状态检测
    对后端服务器做http协议健康状态检测:
    通常用于bendend option httpchk 默认为:/ OPTIONS HTTP/1.0 option httpchk <uri>
    option httpchk <method> <uri>
    option httpchk <method> <uri> <version> 定义基于http协议的7层健康状态检测机制
    http-check expect [!] <match> <pattern> http协议健康状态检测响应内容或指定响应码
    image.png

    tail -f /var/log/httpd/access_log
    image.png

    当将某个rs服务器端的index.html删除,通过haproxy的代理服务器的检查,将不会再往该服务器上调度
    因为haproxy代理服务器默认访问的是rs服务器上的index.html页面
    image.png

    (8)forwardfor配置
    option forwardfor [ except <network> ] [ header <name> ] [ if-none ] 在由haproxy发往后端主机的请求报文中添加“X-ForwardedFor”首部,其值为前端客户端的地址;用于向后端主发送真实的客户 端IP
    [ except <network> ]:请求报请来自此处指定的网络时不予 添加此首部,如haproxy自身所在网络
    [ header <name> ]:使用自定义的首部名称,而非“XForwarded-For”
    [ if-none ] 如果没有首部才添加首部,如果有使用默认值 
    为指定的MIME类型启用压缩传输功能
    compression algo <algorithm> ...:启用http协议的压缩机 制,指明压缩算法gzip, deflate
    compression type <mime type> ...:指明压缩的MIMI类型
    实验:自定义首部信息
    在客户端httpd.conf文件中修改指定的默认日志记录格式,内容如下图
    image.png

    并将默认的访问日志格式改为haformat
    在haproxy服务器上将默认的forwardfor的首部信息进行修改,修改如图
    image.png

    在客户端进行访问观察日记的记录的格式
    或者在日志文件中修改为
    image.png

    显示结果如下
    image.png

    (9)错误页配置
    errorfile <code> <file> 自定义错误页
    <code>:HTTP status code.
    支持200, 400, 403, 408, 500, 502, 503, 504.
    image.png

    <file>:错误页文件路径 
    示例:
    errorfile 400 /etc/haproxy/errorfiles/400badreq.http
    errorfile 408 /dev/null # workaround Chrome preconnect bug errorfile 403 /etc/haproxy/errorfiles/403forbid.http
    errorfile 503 /etc/haproxy/errorfiles/503sorry.http 
    errorloc <code> <url>
    相当于errorloc302 <code> <url>,利用302重定向至指URL errorloc 503 http://www.magedu.com/error_pages/503.html
    image.png

    (10)修改报文首部
    在请求报文尾部添加指定首部 reqadd <string> [{if | unless} <cond>]
    image.png

    在响应报文尾部添加指定首部 rspadd <string> [{if | unless} <cond>]
    示例:rspadd X-Via:\ HAPorxy 
    从请求报文中删除匹配正则表达式的首部
    reqdel <search> [{if | unless} <cond>]
    reqidel <search> [{if | unless} <cond>] 不分大小写从响应报文中删除匹配正则表达式的首部
    rspdel <search> [{if | unless} <cond>]
    rspidel <search> [{if | unless} <cond>] 不分大小写 示例: rspidel server.*
    image.png

    image.png

    (11)ACL
    以实例举例来进行说明
    image.png

    拒绝该地址的访问
    image.png

    如果写成unless代表用||代表或
    image.png

    image.png

    image.png

    根据路径来拒绝访问
    image.png

    image.png

    阻止图片的访问,其他的不阻止
    image.png

    实验:实现简单的动静分离访问
    当访问静态页面时如图片或是js,css,.html等就只往rs2上调度,如果访问的是.php页面就往rs1调度
    步骤:
    vim /etc/haproxy/haproxy.cfg
    frontend http
    bind 172.18.254.242:80
    maxconn 5000
    acl staticfile path_end .jpg .js .css .html
    acl appfile path_end .php
    use_backend staticsrvs2 if staticfile
    use_backend appsrvs1 if appfile
    default_backend appsrvs1
    backend appsrvs1
    balance roundrobin
    server webserver1 192.168.136.134:80 check weight 1
    backend staticsrvs2
    balance roundrobin
    server webserver2 192.168.136.183:80 check weight 1 maxconn 5000
    测试结果如图:
    image.png

    只要访问.html和.jpg就往staticsrvs2上调度
    image.png

    image.png

    实现通过域名的访问调度机制(提取http协议请求报文)
    image.png

    在客户端测试
    image.png

    拒绝访问头部信息
    image.png

    image.png

    拒绝用户访问首部信息 curl -i命令被禁止
    image.png

    取反命令应用
    image.png

    通过curl命令访问拒绝,但是用过curl -I访问允许
    注意:
    image.png

    image.png

    (12)配置
    tcp-request connection {accept|reject} [{if | unless} <condition>]
    根据第4层条件对传入连接执行操作
    实验加以说明:通过tcp协议访问mysql数据页面
    vim /etc/haproxy/haproxy.cfg
    frontend mysql
    bind 172.18.254.242:3306
    mode tcp ——一定要写因为不再使用默认的httpd协议,所以要写明协议
    default_backend mysqlsrvs
    backend mysqlsrvs
    mode tcp
    server mysql1 192.168.136.134:3306
    server mysql2 192.168.136.183:3306
    在rs服务器端安装mysqld或是mariadb
    然后打开mysql,创建远程登录用户
    image.png

    image.png

    在客户端进行测试: mysql -uroot -pcentos -h172.18.254.242
    image.png

    image.png

    测试结果如图:实现轮询调度访问数据库
    image.png

    实现基于tcp协议的ssh命令的访问调度
    image.png

    vim /etcssh/sshd_config
    image.png

    在客户端测试 ssh 172.18.254.242
    (13)https协议
    支持ssl会话
    首先在haproxy的服务端上生成自签名证书
    cd /etc/pki/tls/certs
    make /etc/haproxy/haproxy.pem——将证书和私钥在一起生成
    vim /etc/haproxy/haproxy.cfg
    frontend http
    bind 172.18.254.242:80
    bind 172.18.254.242:443 ssl crt /etc/haproxy/haproxy.pem
    maxconn 5500
    default_backend appsrvs1
    backend appsrvs1
    balance roundrobin
    server webserver1 192.168.136.134:80 check weight 1
    server webserver2 192.168.136.183:80 check weight 1
    backend staticsrvs2
    balance roundrobin
    server webserver2 192.168.136.183:80 check weight 1 maxconn 5000
    在客户端测试
    image.png

    把80端口的请求重向定443 访问不加密的http协议时会自动跳转到https协议上
    bind 172.18.254.242:80 redirect scheme https if !{ ssl_fc }
    image.png

    客户端上进行测试
    image.png

    在后端服务器上修改日志格式,在haproxy服务器上设置首部添加信息,显示访问的端口信息
    image.png

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

推荐阅读更多精彩内容

  • 1 基于LVS-NAT的设计:实现nat模式的lvs实验 搭建环境:先将各主机的防火墙策略和selinux关闭,打...
    楠人帮阅读 1,111评论 0 0
  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,724评论 0 9
  • 1、HAProxy功能 HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性环境可以针对HTTP...
    张大志的博客阅读 862评论 0 0
  • 一.keepalived介绍 1.keepalived的功能 实现集群服务的高可用性(HA),在实际工作中当lvs...
    楠人帮阅读 546评论 0 1
  • 本文是《图解HTTP》读书笔记的第二篇,主要包括此书的第六章内容,因为第六章的内容较多,而且比较重要,所以单独写为...
    lijiankun24阅读 1,311评论 0 6