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

配置后测试登陆。

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

如有错误;恳请更正。

HAProxy:基础详解

时间: 2024-10-12 23:36:54

HAProxy:基础详解的相关文章

haproxy 基础详解 及 动静分离的实现

haproxy 介绍 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器 负载均衡调度器分类 工作在四层: # lvs 工作在七层: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 实现MySQL的读写中读的负载均衡 # ats (apache traffic server) # perlbal # pound

HAproxy指南之haproxy配置详解(理论篇)

一.haproxy配置文件详解 haproxy配置分为五部分,分别如下: 1 global:  (全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关) 2 default : (配置默认参数,这些参数可以被用到frontend,backend,Listen组件) 在此部分中设置的参数值,默认会自动引用到下面的frontend.backend.listen部分中,因引,某些参数属于公用的配置,只需要在defaults部分添加一次即可.而如果frontend.backend.l

Swift学习——Swift基础详解(四)

A:小儿编程很不好! B:多半是不爱学,从看英文版开始,让你爱上编程! Type Aliases    类型重定义(typedef) Swift中重定义类型的关键字是typealias,至于怎么用,应该不必多说了,看例子: typealias AudioSample = UInt16 //定义了一个类型名称AudioSample,代表UInt16类型 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 Boo

Swift学习——Swift基础详解(一)

注:由于基础部分在Swift Tour 中已经大体的说明了,所以在详解中不会达到100%的原文释义 Constants and Variables  常量和变量 常量和变量都需要声明名称和类型(作为程序员,这些基础也就不说了),常量一次赋值不能改变,变量的值可以改变 Declaring Constants and Variables   声明常量和变量 常量和变量在使用之前必须要声明,使用let关键字定义常量,var关键字定义变量 下面的例子可以用来定义用户登录的时候最大的尝试次数: let m

Swift学习——Swift基础详解(二)

上节说了没有营养的变量和常量,这玩意,都差不多,自己稍微看下就好了 Integers    整型 整数就是整数了,没有小数,整数有符号(+,-,0)或者无符号(0,+) Swift提供了8,16,32,64位的有符号和无符号的整数,命名使用C的方式,比如,8位无符号的整型UInt8,32位有符号的整型就是Int32 Integer Bounds    整型范围 可以使用min 和 max获取整数类型的最大值和最小值 let minValue = UInt8.min // minValue is

Swift学习——Swift基础详解(三)

小葵花课堂继续开讲 Numeric Literals    数字文本 数字文本有以下几种写法: A decimal number, with no prefix A binary number, with a 0b prefix An octal number, with a 0o prefix A hexadecimal number, with a 0x prefix 十进制数,无前缀:二进制数,0b前缀:八进制数,0o前缀:十六进制数,0x前缀 论数字17的N种表现形式: let deci

Swift学习——Swift基础详解(八)

Assertions    断言 可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况.然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行.这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因. Debugging with Assertions    使用断言进行调试 断言会在运行时判断一个逻辑条件是否为true.从字面意思来说,断言"断言"一个条件是否为真.你可以使用断言来保证在运行其他代

Swift学习——Swift基础详解(六)

Optionals    选配 选配(好像不是这么翻译的)适用于那些值可能为空的情况,一个选配有两种情况:存在值并且等于x,或者值不存在. 选配的概念在OC和C里面并没有,在OC中最接近的概念就是:OC中的返回值为对象的函数,当对象不存在的时候,可以返回nil,但是nil只能代表对象,不可以代表基础类型或者结构体和枚举类型.OC中使用NSNotFound表示值不存在.在Swift中,不需要使用其他的类型表示不存在的值. 举个例子: 在Swift中,String类型有一个方法叫做toInt,但是并

Android BroadcastReceiver基础详解一

-.BroadcastReceivcer概述 1.什么是广播 BroadcastReceiver是Android四大组件之一,本质是一种全局的监听器,用于监听系统全局的广播消息.因此它可以非常方便的实现不同组件之间的通信. 2.BroadcastReceiver的创建启动 BroadcastReceiver是用用于接受程序所放出的Broadcast Intent,与应用程序启动的Activity.Service相同.也只需要两步: ①.创建需要启动的Broadcast的Intent ②.创建一个