首页 > 代码库 > HAProxy:基础详解

HAProxy:基础详解

一、简介

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

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

二、配置文件格式

配置文件中的参数具体参考:http://cbonte.github.io/haproxy-dconv/configuration-1.4.html

配置文件格式:

全局参数:

global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the ‘-r‘ option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2            #定义日志的,需要在syslog中开启
    chroot      /var/lib/haproxy            #指定haproxy工作目录,能提高安全性
    pidfile     /var/run/haproxy.pid        #pid文件文职
    maxconn     40000                       #最大并发连接数
    user        haproxy                     #指定用户运行haproxy
    group       haproxy
    daemon                                  #以守护进程方式工作于后台
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats     #

代理相关配置主要分为四段:

  • defaults <name>:用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。

defaults
    mode                    http            #指定协议
    log                     global          #指定日志是从全局继承
    option                  httplog         #开启日志记录http请求等信息
    option                  dontlognull     #启用或禁用日志记录空连接
    option http-server-close  #在支持保持连接的情况下;一旦用户的保持连接超时;是否允许服务器发起关闭.
    option forwardfor       except 127.0.0.0/8 #允许在request 中加入X-Forwarded-For header 发往server
    option                  redispatch      #基于cookie的会话保持时;一旦upstream server宕机时;将此server的会话重新定向到其他的upstream server;
    retries                 3               #重试次数
    timeout http-request    10s             #关闭客户端一次性请求的时长
    timeout queue           1m              #在队列中等待时间
    timeout connect         10s             #定义haproxy将用户请求转发后端upstream server时的超时时长
    timeout client          1m              #客户端非活动连接的超时时长
    timeout server          1m              #等待服务器端非活动连接的超时时长
    timeout http-keep-alive 10s             #设置保持连接模式的超时时长
    timeout check           10s             #检查请求建立后;服务器端没有响应的超时时长
    maxconn                 3000            #每个server默认最大连接数
  • frontend <name>:用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:5000    #定义前端的监听地址和端口
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#定义访问控制列表,上述含义是以后面参数开头path的且不区分大小写为url_static列表
    acl url_static       path_end       -i .jpg .gif .png .css .js
#同上
    use_backend static          if url_static
#如果匹配到url_static列表,则代理至backend定义的static server
    default_backend             app
#否则,默认到app server
  • backend <name>:用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。

backend static    #定义后端server
    balance     roundrobin    算法rr
    server      static 127.0.0.1:4331 check    #check代表健康检测
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check
  • listen <name>:通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。

三、配置文件中部分关键字

1、acl访问控制列表

acl <aclname> <criterion> [flags] [operator] <value> ...

  • <aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

  • <criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];

  • [flags]:目前haproxy的acl支持的标志位有3个:

    -i:不区分<value>中模式字符的大小写;

    -f:从指定的文件中加载模式;

    --:标志符的强制结束标记,在模式中的字符串像标记符时使用;

  • <value>:acl测试条件支持的值有以下四类:

    - integers or integer ranges:整数或整数范围:如1024:65535表示从1024至65535;且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;

    - strings:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“--”标志位;

    - regular expressions:正则表达式:其机制类同字符串匹配;

    - IP addresses and networks:IP地址及网络地址;

常用的测试标准:

  • be_sess_rate(backend) <integer>:用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。

  • fe_sess_rate(frontend) <integer>:用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。

  • hdr(header) <string>:用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。

  • method <string>:测试HTTP请求报文中使用的方法。

  • path_beg <string>:用于测试请求的URL是否以<string>指定的模式开头。

  • path_end <string>:用于测试请求的URL是否以<string>指定的模式结尾。

  • hdr_beg <string>:用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。

  • hdr_end <string>:用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。

2、balance格式:

balance <algorithm> [ <arguments> ]

balance url_param <param> [check_post [<max_wait>]]

定义负载均衡算法,可用于“defaults”、“listen”和“backend”。<algorithm>用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或需要将一个连接重新派发至另一个服务器时。

调度算法:

  • roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整生效。

  • static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制。

  • leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重。

  • source:sh算法,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;

  • uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;

  • url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;

  • hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.magedu.com来说,仅计算magedu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;

  • rdp-cookie(name)/rdp-cookie:为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 ‘req_rdp_cookie()‘一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。

3、mode { tcp|http|health }:设定启动的实例的协议类型。

4、errorfile <code> <file>:在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。

5、server <name> <address>[:port] [param*]:为后端声明一个server,因此,不能用于defaults和frontend区段。

<name>:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;

[param*]:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数;

参数说明:

  • backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;

  • check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定:

    inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;

    rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;

    fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;

  • cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;

  • maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;

  • maxqueue <maxqueue>:设定请求队列的最大长度;

  • observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

  • redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;

  • weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡

6、haproxy的状态信息stats

  • stats enable:默认设置下启用状态信息页面;

  • stats hide-version:启用统计报告并隐藏HAProxy版本报告,不能用于“frontend”区段。

  • stats realm <realm>:统计页面密码框上提示文本,不能用于“frontend”区段。

  • stats refresh <delay>:启用统计页面的自动刷新功能。

  • stats scope { <name> | "." }:启用统计报告并限定报告的区段,不能用于“frontend”区段

    <name>:可以是一个“listen”、“frontend”或“backend”区段的名称,而“.”则表示stats scope语句所定义的当前区段。

  • stats auth <user>:<passwd>:启用带认证的统计报告功能并授权一个用户帐号,其不能用于“frontend”区段。

  • stats admin { if | unless } <cond>:在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器

配置实例:

backend web
  server websrv1 192.168.0.111:80
  stats enable
  stats hide-version
  stats scope   .
  stats uri     /.admin?stats
  stats realm   Haproxy\ Statistics
  stats auth    administrator:password
  stats auth    master:password
  stats admin if TRUE

wKiom1Nh5dbz88o0AAN1gnaWX6E963.jpg

配置后测试登陆。

haproxy的配置文件格式及一些基本的参数以详细说明;具体的可用根据给定的官方文档做参照。





如有错误;恳请更正。

本文出自 “Soul” 博客,请务必保留此出处http://chenpipi.blog.51cto.com/8563610/1405553