简述Haproxy常见的负载均衡调度算法及应用场景详解

96
任总
0.2 2018.09.29 17:05 字数 4336

一、haproxy简介

haproxy是一个纯粹的反代软件,与nginx不同的是,haproxy没有web服务功能

1、基于cookies做会话绑定
2、分发负载到多个主机,保持持久性
3、支持sorryserver
4、连上一个特定端口,做健康检测
5、在不影响已建立的连接情况下,停止新的连接请求,把这个主机标记down,停掉服务。
6、添加修改删除http首部
7、按需阻塞,基于ACL做访问控制
8、haproxy特性,可在图形接口操作

  • 版本及官方文档

haproxy的版本:1.4, 1.5, 1.6, 1.7
官方文档地址:https://cbonte.github.io/haproxy-dconv/

二、haproxy的安装配置

1、haproxy的安装

从centos6.4开始,haproxy已经收录的bast仓库中,所以我们直接使用yum安装即可。
首先同步时间

[root@haproxy-75 ~]# yum install haproxy -y
2、程序环境:

主程序:/usr/sbin/haproxy
主配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service

global:全局配置段
进程及安全配置相关的参数
defaults:为frontend, listen, backend提供默认配置;
fronted:前端,相当于nginx, server {}
backend:后端,相当于nginx, upstream {}
listen:同时拥前端和后端

3、简单的配置示例:
  • 启用日志功能配置:
[root@haproxy-75 ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception #基于udp日志
$ModLoad imudp   
$UDPServerRun 514
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local2.*                                                /var/log/haproxy.log #添加此行
[root@haproxy-75 ~]# systemctl restart rsyslog
[root@haproxy-75 ~]# ss -tnl
State       Recv-Q Send-Q Local Address:Port     #查看514端口是否启用          Peer Address:Port              
UNCONN      0      0           *:514                     *:*     

编辑配置文件:

[root@haproxy-75 ~]# vim /etc/haproxy/haproxy.cfg 

在这行以下,全部注释:.,$s@^[^#]@#&@g
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
在尾部添加:
frontend web  
bind *:80   #监听80端口
default_backend     websrvs  #调用后端web服务器组

backend websrvs      #定义后端web服务器组
balance roundrobin  #轮询
server srv1 192.168.1.73:80 check   #check表示检测监控状态
server srv2 192.168.1.74:80 check

[root@haproxy-75 ~]# systemctl start haproxy

客户端测试:

[root@nginx-73 ~]# for i in {1..10}; do curl http://192.168.1.75/; done
<h1>Backend Server2</h1>
<h1>Backend Server1</h1>
<h1>Backend Server2</h1>
<h1>Backend Server1</h1>
<h1>Backend Server2</h1>
<h1>Backend Server1</h1>
<h1>Backend Server2</h1>
<h1>Backend Server1</h1>
<h1>Backend Server2</h1>
<h1>Backend Server1</h1>

三、haproxy配置详解

配置段:

1、global:全局配置段

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

ca-bast:设定本地所有主机的ca相关认证和路径
chroot:以chroot方式运行proxy,虚拟根环境
cpu-map:把进程绑定到指定cpu上
crt-bast:
daemon:是否以守护进程运行,centos7不需要设定
gid:指明组名或组号码
uid:指明用户名或用户号码
log:把日志发送到那个日志服务器,并能够指明级别
log-send-hostname:记录日志时,是否记录用户请求时候的主机名
log-tag:日志标签
nbproc <number>:要启动的haproxy的进程数量;
ulimit-n <number>:每个haproxy进程可打开的最大文件数;

(2)性能调整相关参数

maxconn:最大并发连接数,设定每个haproxy进程能接受的最大并发数
总体的并发连接数:nbroc*maxconn
maxconnrate <number>:Sets the maximum per-process number of connections per second to <number>. 每个进程每秒种所能创建的最大连接数量;
maxcomprate:压缩格式响应用户请求
maxcompcpuusage:压缩功能最大占用cpu比例
maxsessrate:每进程每秒所创建的会话数量
maxsslconn:设定每个进程最大创建ssl连接数
noepoll:不使用epll
spread-checks:分时对后端服务器健康检测,提前或延后检测,减少带宽占用
tun.comp.maxlevel:最大压缩级别
用户列表
Debug参数

2、proxies:代理配置段

  • proxy的命名区分大小写,可重复调用

配置参数:

(1)bind关键词

bind:在前端定义一个或多个侦听地址或端口
格式:bind [<address>]:<port_range> [, ...] [param*]

示例:
listen http_proxy
bind :80,:443
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
(2)balance:后端服务器组内的服务器调度算法

格式:balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post]

算法:
  • roundrobin:轮询

  • server options: weight #加权
    动态算法:支持权重的运行时调整,支持慢启动;每个后端中最多支持4095个server;

  • static-rr:
    静态算法:不支持权重的运行时调整及慢启动;后端主机数量无上限;

  • leastconn:最小连接
    推荐使用在具有较长会话的场景中,例如MySQL、LDAP等;

  • first:优先调度到那台,并达到上限
    目的:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务;

示例:
[root@haproxy-75 ~]# vim /etc/haproxy/haproxy.cfg 
frontend web
bind *:80
default_backend     websrvs

backend websrvs
balance first           #使用first算法
server srv1 192.168.1.73:80 check  maxconn 3   #最大并发数为3
server srv2 192.168.1.74:80 check

  • source:源地址hash;
    除权取余法:基于静态属组的静态映射,缺点是后端主机变动会影响其他主机
    一致性哈希:动态的

  • uri:
    对URI的左半部分做hash计算,并由服务器总权重相除以后派发至某挑出的服务器;
    目的:根据请求同一页面绑定发送到同一台后端主机。

  • 格式:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    左半部分:/<path>;<params>
    整个uri:/<path>;<params>?<query>#<frag>

示例:
[root@haproxy-75 ~]# vim /etc/haproxy/haproxy.cfg 
frontend web
bind *:80
default_backend     websrvs

backend websrvs
balance uri        #使用uri算法
server srv1 192.168.1.73:80 check  maxconn 3
server srv2 192.168.1.74:80 check
hash-type consistent    #hash类型为consistent
[root@haproxy-75 ~]# systemctl restart haproxy

后端主机创建多个页面

后端主机1
[root@node1 ~]# cd /var/www/html
[root@node1 html]# for i in {1..10}; do echo "Test Page $i @BES1" > test$ihtml; done
后端主机2
[root@node2 ~]# cd /var/www/html
[root@node2 html]# for i in {1..10}; do echo "Test Page $i @BES2" > test$ihtml; done

客户端测试:

[root@ html]# for i in {1..10}; do curl http://192.168.1.75/test1.html; done
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
Test Page 1 US2
[root@ html]# for i in {1..10}; do curl http://192.168.1.75/test2.html; done
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2
Test Page 2 US2

  • url_param:对用户请求的uri听<params>部分中的参数的值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个Backend Server;

  • hdr(<name>):对于每个http请求,此处由<name>指定的http首部将会被取出做hash计算; 并由服务器总权重相除以后派发至某挑出的服务器;没有有效值的会被轮询调度;
    目的:使用同一浏览器,请求会发送到同一后端主机

示例:
[root@haproxy-75 ~]# vim /etc/haproxy/haproxy.cfg
 frontend web
bind *:80
default_backend     websrvs

backend websrvs
balance hdr (User-Agent) #使用hdr算法
server srv1 192.168.1.73:80 check  maxconn 3
server srv2 192.168.1.74:80 check
hash-type consistent
  • rdp-cookie:根据cookie,发送到后端同一台主机
    rdp-cookie(<name>)

(3)、hash-type:哈希算法

格式hash-type <method> <function> <modifier>
map-based:除权取余法,哈希数据结构是静态的数组;
consistent:一致性哈希,哈希数据结构是一个树;

<function> is the hash function to be used : 哈希函数
sdbm
djb2
wt6

(4)default_backend <backend> 默认后端

设定默认的backend,用于frontend中;

default-server [param*]
为backend中的各server设定默认选项;

(5)compression 压缩

   算法:algo
示例:
[root@haproxy-75 ~]# vim /etc/haproxy/haproxy.cfg
 frontend web  *:80
compression algo  gzip #使用压缩功能,算法是algo,格式为gzip
compression type text/html text/plain /application/xml application/javascript   #定义对那些类型压缩
default_backend     websrvs

backend websrvs
balance roundrobin #使用轮询算法
server srv1 192.168.1.73:80 check  maxconn 3
server srv2 192.168.1.74:80 check

测试:


已压缩
  • enabled和disable 启用和禁用后端那个主机

(6)server后端主机

  • server <name> <address>[:[port]] [param*]
    定义后端主机的各服务器及其选项;

格式:server <name> <address>[:port] [settings ...]
default-server [settings ...]

<name>:服务器在haproxy上的内部名称;出现在日志及警告信息;
<address>:服务器地址,支持使用主机名;
[:[port]]:端口映射;省略时,表示同bind中绑定的端口;
[param*]:参数
maxconn <maxconn>:当前server的最大并发连接数;
backlog <backlog>:当前server的连接数达到上限后的后援队列长度;

  • backup:设定当前server为备用服务器,只做备用服务器,一旦它探测到主服务器上线,其自动下线;
示例:

backend websrvs
balance roundrobin
server srv1 192.168.1.73:80 check           
server srv2 192.168.1.74:80 check  backup #设置此主机为sorry server,当主机1下线时候它上线。

  • check:对当前server做健康状态检测;
    周期性的向特定端口tcp探测

  • addr :检测时使用的IP地址;

  • port :针对此端口进行检测;

  • inter <delay>:连续两次检测之间的时间间隔,默认为2000ms;

  • rise <count>:连续多少次检测结果为“成功”才标记服务器为可用;默认为2;

  • fall <count>:连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;

注意:httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;

示例:

backend websrvs
balance roundrobin
option httpchk GET /test1.html HTTP/1.0 #向测试页做健康监测
server srv1 192.168.1.73:80 check  inter 3000ms rise 1 fall 2   #连续监测间隔时间3000毫秒 ,连续监测成功一次 表示成功,连续监测失败两次表示失败。  
server srv2 192.168.1.74:80 check  backup 

  • cookie <value>:为当前server指定其cookie值,用于实现基于cookie的会话黏性;
  • disabled:标记为不可用;
  • maxconn:最大并发连接数;
  • maxqueue:并发队列;
  • minconn:最少连接数;
  • on-error<mode>:后端服务故障时候行动策略;
    fastinter:快速探测机制
    fall-check:错误监测
    fail-check:快速故障监测
    sudden-death:告诉haproxy-server已经故障,并立即将故障下线
    mark-down:标记下线,主机不可用
  • on-marked-down :当标记为下线时候,关闭所有会话,并重新调度到其他服务器上
  • on-marked-up:标记上线,把到backup服务的会话,从新调度到此服务器上
  • redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指定的URL;
示例:

server srv1 192.168.1.73:80 check  inter 3000ms rise 1 fall 2  redir http://www.baidu.com/  #重定向到指定网址
server srv2 192.168.1.74:80 check  backup 

  • weight <weight>:权重,默认为1;
示例:

server srv1 192.168.1.73:80 check  inter 3000ms rise 1 fall 2  weight 2#权重为2
server srv2 192.168.1.74:80 check  weight 1 #权重为1

3、统计接口启用相关的参数:

(1)stats enable:

启用统计页;基于默认的参数启用stats page;

  • stats uri : /haproxy?stats
  • stats realm : "HAProxy Statistics"
  • stats auth : no authentication
  • stats scope : no restriction
 frontend web  *:80
stats enable
內建的状态页
  • stats auth <user>:<passwd>
    认证时的账号和密码,可使用多次;

  • stats realm <realm>
    认证时的realm;

  • stats uri <prefix>
    自定义stats page uri

  • stats refresh <delay>
    设定自动刷新时间间隔;

  • stats admin { if | unless } <cond>
    启用stats page中的管理功能

示例:
 frontend web  *:80
stats enable
stats uri /myproxy?admin #自定义信息页地址
stats realm "HAProxy Stats Page" #认证提示
stats auth admin:admin #认证时用的用户名和密码
stats admin if TRUE  #启用信息页管理功能,总是为真
登录认证

页面管理后端主机状态

为了安全我们避免使用默认端口,所以定义一个listen,直接通向后端一个信息页面。

配置示例:
frontend myweb *:80
      ..........
backend websrvs
     .........
listen stats
      bind *:9099
      stats enable
      stats uri /myproxy?admin #自定义信息页地址
      stats realm "HAProxy Stats Page" #认证提示
      stats auth admin:admin #认证时用的用户名和密码
      stats admin if TRUE  #启用信息页管理功能,总是为真

image.png

4、frontend配置段

(1)maxconn <conns>:

为指定的frontend定义其最大并发连接数;默认为2000;

(2)mode { tcp|http|health }

定义haproxy的工作模式;

  • tcp:基于layer4实现代理;可代理mysql, pgsql, ssh, ssl等协议;
  • http:仅当代理的协议为http时使用;
  • health:工作为健康状态检查的响应模式,当连接请求到达时回应“OK”后即断开连接;
示例:
listen sshsrvs
     mode tcp
     bind *:22322
     balance leastconn
     server sshsrv1 192.168.1.73 check
     server sshsrv2  192.168.1.74 check

(3)cookie

格式:cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
<name>:is the name of the cookie which will be monitored, modified or inserted in order to bring persistence.
rewirte:重写;
insert:插入;
prefix:前缀;

基于cookie的session sticky的实现:
backend websrvs
cookie WEBSRV insert nocache indirect
balance roundrobin
option httpchk
server srv1 192.168.73:80 weight 2 check rise 1 fall 2 maxconn 3000 cookie srv1  #根据cookie始终访问同一台对应服务器
server srv2 192.168.1.74:80 weight 1 check rise 1 fall 2 maxconn 3000 cookie srv2

(4)option forwardfor

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

在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值前端客户端的地址;用于向后端主发送真实的客户端IP;
[ except <network> ]:请求报请来自此处指定的网络时不予添加此首部;
[ header <name> ]:使用自定义的首部名称,而非“X-Forwarded-For”;

(5)、errorfile <code> <file>

错误页设置

<code>:is the HTTP status code. Currently, HAProxy is capable of generating codes 200, 400, 403, 408, 500, 502, 503, and 504.
<file>:designates a file containing the full HTTP response.

示例:
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 408 /dev/null  # workaround Chrome pre-connect bug
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http

errorloc <code> <url>
errorloc302 <code> <url>

errorfile 403 http://www.magedu.com/error_pages/403.html

(6)、reqadd <string> [{if | unless} <cond>]
向请求报文,添加首部

(7)rspadd <string> [{if | unless} <cond>]
向相应报文,添加首部

(8)删除请求报文关键字
reqdel <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>] (ignore case)
Delete all headers matching a regular expression in an HTTP request
(9)删除相应报文关键字
rspdel <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>] (ignore case)
Delete all headers matching a regular expression in an HTTP response
rspidel Server.*

示例:
frontend myweb *:80
.............
reqadd X-Proxy-By: \ HAProxy #添加请求自定义首部   
rspadd X-Via:\ HAPorxy    #添加相应自定义首部   
reqdel  ^Server:.*    #删除相应报文中的首字符为server关键字

5、log:日志系统

log global日志的全局配置
格式:log <address> [len <length>] <facility> [<level> [<minlevel>]]

注意:
默认发往本机的日志服务器;
(1) local2.* /var/log/local2.log
(2) ModLoad imudpUDPServerRun 514

log-format <string>:日志格式
tcp log-format
http log-format

6、httpchk

对后端服务器做http协议的健康状态检测:

格式:
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>

定义基于http协议的7层健康状态检测机制;

http-check expect [!] <match> <pattern>
进行HTTP健康检查考虑响应内容或特定状态代码,一般实际不建议使用过于严苛的匹配,占用资源。

7、连接超时时长:

  • timeout client <timeout>
    客户端默认非活动状态连接超时时长. 默认单位是毫秒;

  • timeout server <timeout>
    连接至服务器的超时时间,越长越好,增加连接的复用次数

  • timeout http-keep-alive <timeout>
    持久连接的持久时长;

  • timeout http-request <timeout>
    请求报文的超时时长

  • timeout connect <timeout>
    创建连接的超时时长

  • timeout client-fin <timeout>
    面向客户端tcp半连接的超时时长

  • timeout server-fin <timeout>
    面向服务器端tcp半连接的超时时长

三、访问控制相关配置

1、四层访问控制参数

  • (1)use_backend <backend> [{if | unless} <condition>]
    当符合指定的条件时使用特定的backend后端服务器;

*(2)block { if | unless } <condition>
在7层堵塞符合条件的请求

示例:
acl invalid_src src 192.168.1.7 #指定acl源地址
block if invalid_src      #如果符合源地址条件,将阻塞          
errorfile 403 /etc/fstab   #返回错误页
  • (3)http-request { allow | deny } [ { if | unless } <condition> ]
    基于7层请求响应的控制

  • (4)tcp-request connection {accept|reject} [{if | unless} <condition>]
    基于4层的请求响应的控制

示例:
listen ssh  
bind :22022
balance leastconn
acl invalid_src src 172.16.200.2  #acl源地址
tcp-request connection reject if invalid_src
mode tcp   #来自于acl源地址连接请求拒绝
server sshsrv1 172.16.100.6:22 check
server sshsrv2 172.16.100.7:22 check backup

2、ACL访问控制列表

问控制列表(ACL)的使用提供了一种灵活的解决方案,用于执行内容切换,并且通常基于从请求、响应或任何环境状态中提取的内容做出决策。
格式:acl <aclname> <criterion> [flags] [operator] [<value>] ...
<aclname>:
ACL 命名字必须要求大写、小写、-、_、.、:、

  • <value>的类型:

    • boolean-----布尔值
    • integer or integer range--------整数
    • IP address / network---------网络地址
    • string (exact, substring, suffix, prefix, subdir, domain)--------字符串匹配(精确匹配、子串、后缀、前缀、子目录、子域名)
    • regular expression-------正则表达式
    • hex block--------十六进制
  • <flags>标志
    -i :忽略字符大小写
    -m : 使用特定匹配方式
    -n : 使用dns反解
    -u : ACL不能重名
    -- : 结束标志位
    如果重名则按或执行,即满足其中任意一个即满足条件。

  • [operator]
    匹配整数值:eq等于、ge大于、gt大于等于、le小于、lt小于等于

匹配字符串:

  • exact match (-m str) : 精确匹配
  • substring match (-m sub) : 子字符串匹配
  • prefix match (-m beg) : 前缀匹配
  • suffix match (-m end) : 后缀匹配
  • subdir match (-m dir) : 路径子串匹配
  • domain match (-m dom) : 域名子串匹配

acl作为条件时的逻辑关系:

  • AND与
  • OR 或
  • "!"非

if invalid_src invalid_port
if invalid_src || invalid_port
if ! invalid_src invalid_port

<criterion> :匹配条件
dst : ip---------目标地址
dst_port : integer-------目标端口
src : ip---------源地址
src_port : integer--------源端口

示例1:
listen stats
.........
acl invalid_src  src  172.16.200.2
block if ! allowstats  #除了acl源地址主机能访问,其他都堵塞
或者
http-request allow if allowestats #对于acl源地址http请求允许访问
.......
示例2:
listen stats
.........
acl allowstats  src  172.16.200.2
acl all src 0.0.0.0/0.0.0.0除了acl源地址主机能访问,其他都堵塞
或者
http-request allow if allowestats #调用名字为allowstats的acl源地址可以通过访问
http-request deny if all #调用名字为all的acl,里面的源地址全部阻塞
.......

2、七层访问控制参数

(1)path 路径: string类型

这将提取请求的URL路径,该路径从第一条斜杠开始并在问号之前结束(没有主机部分)。
/path;<params>

path : 精确匹配
path_beg :前缀匹配
path_dir : 子路径匹配
path_dom :域名子串匹配
path_end : 后缀匹配
path_len : 字符串长度匹配
path_reg : 正则表达式匹配
path_sub : 子串匹配

示例:匹配这个目录下的图片
目录:/imgs/logos/logo.jpg
精确匹配:path /imgs/logos/logo.jpg
前缀匹配:path_beg /imgs
后缀匹配:path_end .jpg
子串匹配:path_sub logos
子路径匹配:path_dir logos/logo.jpg
正则表达式匹配:path_reg ^/imgs/.*\.jpg$

(2)url匹配 : string类型

这将提取请求中呈现的请求的URL。典型的用法是使用具有预取能力的缓存,以及需要聚合来自数据库的多个信息并将它们保存在缓存中的贮存区。

url : 精确匹配
url_beg : 前缀匹配
url_dir : 目录子串匹配
url_dom : 域匹配
url_end : 后缀匹配
url_len : 字符长度匹配
url_reg : 正则匹配
url_sub : 字符子串匹配

(3)请求报文的指定首部

req.hdr([<name>[,<occ>]]) : string
This extracts the last occurrence of header <name> in an HTTP request.
禁止爬虫,阻塞掉
hdr([<name>[,<occ>]]) : 精确匹配
hdr_beg([<name>[,<occ>]]) : 前缀匹配
hdr_dir([<name>[,<occ>]]) : 目录子串匹配
hdr_dom([<name>[,<occ>]]) : 域匹配
hdr_end([<name>[,<occ>]]) : 后缀匹配
hdr_len([<name>[,<occ>]]) : 字符长度匹配
hdr_reg([<name>[,<occ>]]) : 正则匹配
hdr_sub([<name>[,<occ>]]) : 子串匹配

示例:
acl bad_curl hdr_sub(User-Agent) -i curl
block if bad_curl

(4)status : integer

返回一个包含HTTP响应的HTTP状态代码的数。

(5)Pre-defined ACLs 內建ACL

FALSE 永远为假
HTTP 使用http协议
HTTP_1.0 http版本是 1.0
HTTP_1.1 http版本是 1.1
HTTP_CONTENT hdr_val(content-length) gt 0 match an existing content-length
HTTP_URL_ABS 绝对路径url_reg [/:]://
HTTP_URL_SLASH 相对路径 url_beg /
HTTP_URL_STAR url * match URL equal to "
"
LOCALHOST 本地主机src 127.0.0.1/8
METH_CONNECT method CONNECT match HTTP CONNECT method
METH_GET 用户请求的方法是get
METH_HEAD 用户请求的方法是head
METH_OPTIONS 用户请求的方法是options
METH_POST 用户请求的方法是post
METH_TRACE用户请求的方法是trace
RDP_COOKIE req_rdp_cookie_cnt gt 0 match presence of an RDP cookie
REQ_CONTENT req_len gt 0 match data in the request buffer
TRUE 永远为真
WAIT_END wait_end wait for end of content analysis

Nginx调度算法:ip_hash, hash, leastconn,
lvs调度算法:
rr/wrr/sh/dh, lc/wlc/sed/nq/lblc/lblcr

基于ACL的动静分离示例:

frontend  web *:80
acl url_static       path_beg       -i  /static /images /javascript /stylesheets
acl url_static       path_end       -i  .jpg .gif .png .css .js .html .txt .htm

use_backend staticsrvs          if url_static
default_backend             appsrvs

backend staticsrvs
balance     roundrobin
server      stcsrv1 172.16.100.6:80 check

backend appsrvs
balance     roundrobin
server  app1 172.16.100.7:80 check
server  app1 172.16.100.7:8080 check

listen stats
bind :9091
stats enable
stats auth admin:admin
stats admin if TRUE

3、配置HAProxy支持https协议:

(1)、支持ssl会话;

bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE

crt后的证书文件要求PEM格式,且同时包含证书和与之匹配的所有私钥;

cat  demo.crt demo.key > demo.pem #把两个文件合在一起
(2)、 把80端口的请求重向定443;
bind *:80
redirect scheme https if !{ ssl_fc }  #ssl_fc是內建的变量ssl前端连接

另一种配置:对非ssl的任何url的访问统统定向至https主机的主页上。

redirect location https://2.2.2.2/ if !{ ssl_fc }
(3)、 如何向后端传递用户请求的协议和端口
  • 改变向后端传递请求的首部,把目标端口添加上面
    http_request set-header X-Forwarded-Port %[dst_port]
  • 前端会话直接传递到后面去
    http_request add-header X-Forwared-Proto https if { ssl_fc }
HAProxy
Gupao