2017 10-31 haproxy的应用

作者: 楠人帮 | 来源:发表于2017-11-02 15:08 被阅读0次

    一.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

    相关文章

      网友评论

        本文标题:2017 10-31 haproxy的应用

        本文链接:https://www.haomeiwen.com/subject/avkipxtx.html