HAProxy简介

HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。


HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。 

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。


HAProxy安装

RHEL系,在CentOS6.4+以后,HAProxy就被收录进base源中

[root@bogon ~]# yum info haproxy
已加载插件:fastestmirror
Determining fastest mirrors
可安装的软件包
名称    :haproxy
架构    :x86_64
版本    :1.5.14
发布    :3.el7
大小    :833 k
源    :base
简介    : TCP/HTTP proxy and load balancer for high availability environments
网址    :http://www.haproxy.org/
协议    : GPLv2+
描述    : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
         : availability environments. Indeed, it can:
         :  - route HTTP requests depending on statically assigned cookies
         :  - spread load among several servers while assuring server persistence
         :    through the use of HTTP cookies
         :  - switch to backup servers in the event a main server fails
         :  - accept connections to special ports dedicated to service monitoring
         :  - stop accepting connections without breaking existing ones
         :  - add, modify, and delete HTTP headers in both directions
         :  - block requests matching particular patterns
         :  - report detailed status to authenticated users from a URI
         :    intercepted by the application

因此,直接安装即可

[root@bogon ~]# yum install haproxy -y


下面介绍一下基本用法

配置分为两段:

    global

        进程及安全配置相关的参数

        性能调整相关的参数

        Debug参数

    proxies:

        defaults:默认

        listen:监听

        frontend:前端

        backend:后端

示例:

    frontend main *:80

        default_backend websrvs


    backend websrvs

        balance roundrobin

server web1 172.18.100.68 check

        server web2 172.18.100.69 check


代理参数:

balance: 指明调度算法;

    动态:权重可动态调整

    静态:调整权重不会实时生效


    roundrobin: 轮询,动态算法,每个后端主机最多支持4128个连接;

    static-rr: 轮询,静态算法,每个后端主机支持的数量无上限;

    leastconn: 根据后端主机的负载数量进行调度;仅适用长连接的会话;动态;

    source: 源地址哈希

    hash-type:

        map-based:取模法;静态;

        consistent:一致性哈希法;动态;

    uri:

     hash-type

        map-based:

        consistent:

    url_param: 根据url中的指定的参数的值进行调度;把值做hash计算,并除以总权重;

    hash-type

        map-based:

        consistent:

hdr(<name>):根据请求报文中指定的header(如use_agent, referer, hostname)进行调度;把指定的header的值做hash计算;

    hash-type

    map-based:

    consistent:


bind:

    只能用于frontend, listen; 

mode: 

    HAProxy的工作模式;默认为tcp;

    tcp, http, health


log:


maxconn:


default_backend: 

    为frontend指明使用的默认后端;


use_backend: 条件式后端调用;


server:


server <name> <addr>[:port] [param*]

    backup: 设定当前server为backup server;

    check: 健康状态检测;

        inter <delay>:检测时间间隔;单位为ms, 默认为2000; 

        fall: up --> down, soft state, soft state, hard state; 

        rise:down --> up, 

    cookie <value>:

    maxconn: 此服务接受的并发连接的最大数量;

    maxqueue: 请求队列的最大长度;

    observe: 根据流量判断后端server的健康状态;

    weight: 指定权重,默认为1,最大为256;0表示不被调度;

    redir <prefix>: 重定向;所有发往此服务器的请求均以302响应;


后端http服务时的健康状态的检测方法:

    option httpchk


基于浏览器cookie实现session sticky:

    backend websrvs

    balance     roundrobin

    cookie SERVERID insert nocache indirect

    server web1 172.18.1.68:80 check weight 1 cookie websrv1

    server web2 172.18.1.69:80 check weight 3 cookie websrv2


    要点:

        (1) 每个server有自己惟一的cookie标识;

    (2) 在backend中定义为用户请求调度完成后操纵其cookie


启用stats:

    listen statistics 

    bind *:9090

    stats enable

    stats hide-version

    #stats scope .

    stats uri /haproxyadmin?stats

    stats realm "HAPorxy\ Statistics"

    stats auth admin:mageedu

    stats admin if TRUE


    向日志中记录额外信息:

        capture request header

        capture response header


    当mode为http时,记录丰富的日志信息:

        option httplog


错误页面重定向:

    errorfile: 使用haproxy主机本地文件进行响应;

    errorloc, errorloc302: 使用指定的url进行响应,响应状态码为302;不适用于GET以外的其它请求方法;

    errorloc303:返回303状态码;


访问控制:

    http_request

    tcp_request


添加请求或响应报文首部:

    reqadd

    rspadd


ACL

作用:haproxy ACL具有很强大的功能,能够定义三到七层的规则。ACL的作用,就是为了匹配一些特别的请求,然后对其进行修改或者分发到不同的服务器组中

    定义,及调用;

格式: acl [flags] [operator] [] .


一个例子,将以.php结尾的发往另一台主机,从而实现动静分离

frontend main
    bind *:80
    acl url_static path_end -i .php
    use_backend webphp if url_static
    default_backend websrv
backend webphp
    balance roundrobin
    server srvphp 172.18.1.131:80 check
backend websrv
    balance roundrobin
    server srv1 172.18.1.130:80 check
listen stats *:9001
    stats enable
    stats uri /haadmin?stats



一个实例:

一台主机安装HAProxy(172.18.1.113),反代用户请求至172.18.1.130和172.18.1.131主机上,并实现负载均衡和健康监测功能,并提供一个状态页

安装HAProxy

编辑配置文件

listen websrv
    balance roundrobin
    server srv1 172.18.1.130:80 check
    server srv2 172.18.1.131:80 check

listen stats *:9001
    stats enable
    stats uri /haadmin?stats

分别给httpd服务器启动服务并提供测试页


用curl命令请求,可以实现负载均衡的效果

[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-2</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-2</h1>


查看状态页

wKiom1dFUxKSp3xYAAEUzhY2SUQ322.png



完善,实现动静分离,172.18.1.130提供静态页面服务,172.18.1.131提供动态页面服务

frontend main
    bind *:80
    acl url_static path_end -i .php
    use_backend webphp if url_static
    default_backend websrv

backend webphp
    balance roundrobin
    server srvphp 172.18.1.131:80 check

backend websrv
    balance roundrobin
    server srv1 172.18.1.130:80 check

listen stats *:9001
    stats enable
    stats uri /haadmin?stats


测试

[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>
[root@bogon haproxy]# curl 172.18.1.113
<h1>RS-1</h1>


测试php信息

wKioL1dFVWHz3YFxAAGqvMXn--U595.png


wKiom1dFVJijC8uEAAC1uXe7XL4227.png