一、haproxy相关参数

(一)负载均衡算法

roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;

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

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

source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端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类的首部时仅计算域名部分。


(二)mode

mode { tcp|http|health }

设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。

tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用;

http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;

health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前业讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能;


(三)maxconn

设定一个前端的最大并发连接数,因此,其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。


(四)cookie

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


(五)weight

权重,默认为1,最大值为256,0表示不参与负载均衡;

option forwardfor

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。

<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。

<name>:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。

if-none:仅在此首部不存在时才将其添加至请求报文问道中。

HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。


(六)ACL

用法:

acl  名称  方法  -i (忽略大小写)  [匹配的路径或文件]

acl方法

  hdr_beg(host)  #精确匹配主机

  hdr_reg(host)  #正则匹配主机

  path_beg   #匹配路径

  path_end   #匹配路径结尾

实例

acl bbs       hdr_reg(host) -i ^(bbs.test.com|forum.test.com)  #使用正则匹配 

acl bbs_path  path_beg -i /bbs#url路径

acl youxi     path_beg -i /youxi               

acl static    path_end -i .html .css .js      #url 结尾文件 

acl php       path_end -i .php 

acl jsp       path_end -i .jsp .do 


use_backend bbs_pool if bbs or bbs_path       #注意 "or"  

use_backend youxi_pool if youxi 

use_backend static_pool if static  

use_backend php_pool if php

use_backend jsp_pool if jsp

redirect prefix http://www.baidu.com code 301 if youxi  #跳转到百度,并返回301代码

default_backend www.test.com 

default_backend   #没有满足条件的时候使用默认的后端服务器


(七)健康检查

1.基于tcp端口

server app 192.168.100.115:80 cookie 1 check port 80 inter 5000 rise 3 fall 3 weight 1

1) check port 80 表示对80端口进行健康检查,也可以直接写成check。

2) inter 5000 fail 3 表示每5秒检查一次,一共检查5次。如果有问题就会摘掉出问题的机器。

3) 如果结尾不加"inter 5000 fail 3",则默认情况每2秒检查一次,一共检查3次。如果有问题就会摘掉出问题的机器。

4) 相关参数

  -inter:2000 不加该参数,正常情况默认每两秒检查一次。

  -rise :2 不加该参数,在real server宕机后恢复前,检查2次OK,认为其复活,并加入集群组中来。

  -fail :3 意思是不加该参数,检查3次后,认为real server宕机,剔除集群组。

  -port :default server port 不加该参数,默认就是端口检查。

2.基于http

访问某个指定的页面

option httpchk HEAD /check.html HTTP/1.0 #或option httpchk GET /check.html

server app 192.168.100.115:80 cookie 1 inter 5000 rise 3 fall 3 weight 1

3.基于某个域名

option httpchk HEAD /check.html HTTP/1.0\r\nHost:www.sina.com

server app 192.168.100.115:80 cookie 1 inter 5000 rise 3 fall 3 weight 1

4.其他服务的健康检查

option ldap-check

    Use LDAPv3 health checks for server testing

option mysql-check [ user <username> ]

    Use MySQL health checks for server testing

option smtpchk <hello> <domain>

    Use SMTP health checks for server testing