HAProxy 的 ACLs 详解

编译自:

using ACLs and pattern extraction

文档版本:HAProxy version 1.4.27

目录:

  • 整数匹配
  • 字符串匹配
  • 正则匹配
  • IPv4地址匹配
  • 可用的测试区域
    • 4层及以下的匹配
    • 4层匹配
    • 7层匹配
    • 预定义的 ACLs
    • 结合条件判断使用 ACLs
    • 模式提取
  • 动静分离示例(不属于原文,马哥课程给出的示例)

使用 ACLs,可以基于请求和响应的任何部分,进行服务内容的切换。总的原则如下:

  • 定义测试准则
  • 根据测试结果执行一定的动作,包括对请求进行拒绝,或者选择一个 backend

acl 关键字用于定义一条新的测试准则,或者对一条已经存在的测试准则进行重新定义:

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

<criterion>:
指定对请求或者响应的某个部分进行测试

[flags]:
对测试进行调整

-i: 此 flag 后续的 patterns 进行模式匹配时忽略大小写,之前的 patterns 不受影响

例如:
acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst  test

    exact-ua.lst 中的 pattern 对大小写敏感
    generic-ua.lst 中的 pattern 忽略大小写
    test 字符串忽略大小写


-f: 从文件中加载 pattern
    
    可使用多个 -f 选项指定多个文件。
    如果一个 pattern 的解析错误,1.4 版无法准确定位到错误的 pattern,只能大概知道 ACL
    有一个解析错误。
    文件中的 patterns 可能被加载到二叉树中,因此查找速度很快。

--: 强制终止 flags。当有字符串看起来与 flags 类似时可以使用 -- 显式地终止 flags。

[operator]:

某些准则支持使用操作符

<value>:

指定测试准则所支持的类型,多个 <value> 以空格分隔
    
支持的 <value> 类型包括:

- 整数、整数范围
- 字符串
- 正则表达式
- IP地址、网络地址

注,ACL名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。my_acl 和 My_Acl 是两个不同的 ACLs。

对 ACLs 的数量没有限制,它们只占用少量内存。

7.1 整数匹配


整数匹配的规则:
1. 允许范围匹配
例如:
1024:65535
1024:
0:1023
:1023

2. 支持对版本号进行检测:1.2
3. 允许使用比较运算符,与 bash 类似:
    eq: 等于
    ge: 大于等于
    gt: 大于
    le: 小于等于
    小于: 小于

    示例:

        acl negative-length hdr_val(content-length) lt 0 (内容长度小于0)
        
        acl sslv3 req_ssl_ver 3:3.1 (SSL 版本为 3.0~3.1 之间)

    
4. 只对正数进行匹配

7.2 字符串匹配


这是指准确的字符串匹配,有一些规则如下:

  1. \ 可对空格等特殊字符进行转义,转为普通字符

  2. -i string,表示忽略大小写

  3. 匹配特殊字符串如 -i, --,

    方法一:字符串前面加上 --,这时 flag 终止标志

     -- -i
     -- --
    

    方法二:把特殊字符串放第二个位置

     str1 -i
     str1 --
    

7.3 正则匹配


基本规则同上

7.4 IPv4地址匹配


匹配某个IP地址:
192.168.0.110
www.guli.com(支持使用主机名,但不推荐这样做,因为对配置来讲,会造成阅读和调试上的困难)
如果使用主机名,需确保 /etc/hosts 中有对应的解析条目,不要依赖 DNS 解析。

匹配某个网络:
192.168.0.0/24

7.5 可用的测试区域


7.5.1 四层及以下的匹配


这是第一部分的测试区域,不需要对请求或响应的内容进行分析。其中包含 TCP/IP 地址和端口,以及一些与流量无关的内部信息。

always_false

这个永远不会匹配。所有的 values 和 flags 被忽略。可在调整配置时使用。

always_true

这个永远匹配。所有的 values 和 flags 被忽略。可在调整配置时使用。

avg_queue <integer>
avg_queue(backend) <integer>

某个指定 backend 的等待队列长度的平均数,如果在指定范围内,返回 ture。

返回值为:某个 backend 的等待连接总数 / 该 backend 活动的后端服务器总数。

根据该值,可大致判断一个新的连接需要等待多久才会被处理。

其主要使用场景是,当某个新的用户确定只能得到降级的服务,返回一个 sorry page 给该用户。

应注意的是,当 backend 中没有活动的服务器了,我们会把等待队列的连接数x2,作为测量值。这是一个公平的预测,因为我们期望有一台服务器能快速归位。但这种情况下,更好的方法是将流量转发给另一个后端。

be_conn <integer>
be_conn(backend) <integer>

返回指定 backend 中当前已建立的连接数(possibly including the connection being evaluated),如果在指定范围内,返回 ture。

如果没有特别指定是那个 backend,则表示使用当前的 backend。

可用于这样的场景,如果被测试的 backend 中连接数已经满负荷,将其流量转发给另一个 backend。

be_id <integer>

返回 backend 的 id。可在 frontend 中使用,用于检测是被哪一个 backend 所调用。

be_sess_rate <integer>
be_sess_rate(backend) <integer>

返回“会话创建速率”:new sessions/s,如果在指定范围内,返回 true。

使用场景:

1. 当此值过高时,可将其流量转发给其他 backend。
2. 限制“abuse of service”,比如:prevent sucking of an online dictionary;

示例:

# Redirect to an error page if the dictionary is requested too often
backend dynamic
    mode http
    acl being_scanned be_sess_rate gt 100
    redirect location /denied.html if being_scanned
    
当“会话创建速率” 高于 100 session/s,将请求重定向至一个 denied 页面。

connslots <integer>
connslots(backend) <integer>

connslots = backend 服务器剩余的可容纳的连接数 + backend 的等待队列中剩余的可容纳的连接数,在指定范围内时返回 true。

简单来说,就是衡量一个 backend 当前还能接收多少新建连接。基于这个值,可以做更好的负载均衡。一般配合 fe_conn(frontend 当前已经接收的连接数) 一起做判断。

dst <ip_address>

返回当前客户端所连接的本地的 IPv4 地址。It can be used to
switch to a different backend for some alternative addresses.

dst_conn <integer>

返回一个socket 上已经建立的连接数(including the one being evaluated)。如果当前接收的连接数已经到达满负荷,可用于在 hard-blocking 之前返回 sorry 页面;或者,使用某个指定的 backend 接收新的请求。

我们可以使用它对不同的监听地址设置不同的限制。

dst_port <integer>

返回当前客户端所连接的本地的端口地址。It can be used to switch
to a different backend for some alternative ports.

fe_conn <integer>
fe_conn(frontend) <integer>

返回某个 frontend 中已经建立的连接数(possibly including the connection being evaluated),如果在指定范围内,返回 true。

如果未指定是哪个 frontend,使用当前的 frontend。

如果所关联的 backend 接收的连接数被认为已经到达满负荷,可用于在 hard-blocking 之前返回 sorry 页面;或者,使用某个指定的 backend 接收新的请求。

fe_id <integer>

返回 frontend 的 id。在 backend 中可使用它判断自己是被哪个 frontend 所调用。

fe_sess_rate <integer>
fe_sess_rate(frontend) <integer>

返回 frontend 的 “新建会话速率”。单位为:新建会话数/秒。如果在指定范围内,返回 true。

一般使用场景:限制新建连接的速率为一个可接受的范围内。在第一时间防止服务滥用。防止 ddos 攻击等。

结合 4层 ACLs,可强制让一个客户端等待少许时间,等待新建会话率降至合理范围内。

示例:

# This frontend limits incoming mails to 10/s with a max of 100
# concurrent connections. We accept any connection below 10/s, and
# force excess clients to wait for 100 ms. Since clients are limited to
# 100 max, there cannot be more than 10 incoming mails per second.
frontend mail
    bind :25
    mode tcp
    maxconn 100
    acl too_fast fe_sess_rate ge 10
    tcp-request inspect-delay 100ms
    tcp-request content accept if ! too_fast
    tcp-request content accept if WAIT_END

限制接收邮件速率为 10/s
最大并发连接数为 100
新建会话速率限制为:< 10/s。如果超过此限制,强制客户端等待 100ms。
因为并发客户端数量被限制为 100,所以新邮件速率不可能大于 10/s

nbsrv <integer>
nbsrv(backend) <integer>

返回当前 backend 或某个指定的 backend 的可用服务器数。当可用服务器数过低时,可切换到其他 backend。

一般和 monitor fail 配合使用。

queue <integer>
queue(backend) <integer>

返回当前 backend 或某个指定的 backend 的等待队列中的连接数。

当队列长度超过警戒值,一般意味着遇到访问高峰,或者大量的服务器失效。一种可行的措施是拒绝新的用户,并且维持旧的连接。

so_id <integer>

返回 socket 的 id。

用于 frontend,当有多个 bind 关键字时,也就是监听了多个地址时,是有用的。

src <ip_address>

返回客户端的 IPv4 地址。

一般用于对某些资源进行访问限制,比如统计数据资源。

src_port <integer>

返回客户端的 TCP source port。用处较少。

srv_id <integer>

返回 server 的 id。

可用于 frontend 和 backend

srv_is_up(<server>)
srv_is_up(<backend>/<server>)

当指定 backend 或当前 backend 中的 server 正在运行,返回 true,否则返回 false。

不接受参数。

当健康检查报告了一个外部状态时(eg: a geographical site's availability),采取一定的动作。

7.5.2 四层匹配


第二部分的测试区域,基于缓存中找到的数据,它们在分析的过程可能就会发生变化。

要求有数据被缓存,常用于 “TCP 请求内容检查”:

tcp-request content accept [{if | unless} <condition>]

根据是否满足测试条件,判断接收还是拒绝一个连接。

req_len <integer>

如果在 request buffer 中的数据长度匹配了指定的范围,返回 true。

如果 buffer is changing,那么就不会返回 false。在一个会话刚开始的时候,req_len eq 0 是肯定匹配的。

对于 req_len ge 大于0的整数,会等待数据进入 buffer,如果 haproxy 确定没有数据进来时,才会返回 false。

用于 “TCP 请求内容检查”

req_proto_http

如果在 请求buffer 中的数据看起来像是 HTTP 或者能被当做 HTTP 进行正确解析,返回 true。

通过 “TCP 请求内容检查” 的规则,可用于调度 HTTP 流量和 HTTPS 流量到不同的端口地址。

req_rdp_cookie <string>
req_rdp_cookie(name) <string>

远程桌面协议相关

req_rdp_cookie_cnt <integer>
req_rdp_cookie_cnt(name) <integer>

远程桌面协议相关

req_ssl_ver <decimal>

如果在请求缓存中的数据,看起来像 SSL 协议数据,而且协议版本在指定的范围内,返回 ture。

支持 SSLv2 hello messages 和 SSLv3 messages。

此测试意在进行严格限制,尽量避免被轻易地欺骗。

In particular, it waits for as many bytes as announced in the
message header if this header looks valid (bound to the buffer size)

注意,TLSv1 协议将被称为 SSL version 3.1。

用于 “TCP 请求内容检查”

wait_end

等待分析周期结束,返回 true。

一般与内容分析联合使用,避免过早返回一个错误的结论。

也可用于延迟某些动作,比如拒绝某些指定的IP地址的动作。

因为它要么停止规则检查,要么立即返回 true,所以建议在一条规则的最后使用这个 acl。

注意,默认的 ACL "WAIT_END" 总是可用的,不需要预先声明。

本测试用于 “TCP 请求内容检查”

示例:

# delay every incoming request by 2 seconds
tcp-request inspect-delay 2s
tcp-request content accept if WAIT_END

# don't immediately tell bad guys they are rejected
tcp-request inspect-delay 10s
acl goodguys src 10.0.0.0/24
acl badguys  src 10.0.1.0/24
tcp-request content accept if goodguys
tcp-request content reject if badguys WAIT_END
tcp-request content reject

7.5.3 七层匹配


第三部分的测试区域,是七层测试。要求对 HTTP 请求进行完全的解析之后进行。

因为请求和响应都被建立了索引,所以虽然相比四层匹配要求更多的 CPU 资源,但也不会太多。

hdr <string>
hdr(header) <string>

hdr* 匹配所有 headers,hdr*(header) 匹配指定的 header,注意括号里面不能有空格。

指定首部时,其名称不区分大小写;

The header matching complies with RFC2616, and treats all values delimited by commas as separate headers.

对于响应首部,使用 shdr();

示例,检查是否设置了 "connection: close" :

hdr(Connection) -i close

hdr_beg <string>
hdr_beg(header) <string>

任何一个 header 的值是以 string 起始的,返回 true

对于响应首部,使用 shdr_beg();

hdr_cnt <integer>
hdr_cnt(header) <integer>

如果指定的 header 出现的次数在指定范围内,或匹配指定的值,返回 true;

一行 header 语句如果包含多个值,将被多次计数;

用于检查指定 header 的是否存在,是否被滥用;

通过拒绝含有多个指定 header 的请求,可阻挡 request smuggling attacks;

对于响应首部,使用 shdr_cnt();

hdr_dir <string>
hdr_dir(header) <string>

用于文件名或目录名匹配,当某个 header 包含被 / 分隔的 string,返回 true;

可与 Referer 联合使用;

对于响应首部,使用 shdr_dir();

hdr_dom <string>
hdr_dom(header) <string>

用于域名匹配,可与 Host header 一起使用;当某个 header 包含被 . 分隔的 string,返回 true;

对于响应首部,使用 shdr_dom();

hdr_end <string>
hdr_end(header) <string>

当任何一个 header 的值是以 string 结束的,返回 true

对于响应首部,使用 shdr_end();

hdr_ip <ip_address>
hdr_ip(header) <ip_address>

当某个 header 的值包含匹配 <ip_address> 的值,返回 true;

通常与 X-Forwarded-For or X-Client-IP 一起使用;

对于响应首部,使用 shdr_ip();

hdr_len <integer>
hdr_len(<header>) <integer>

至少有一个 header 的 length 与指定的值或者范围匹配时,返回 true;

对于响应首部,使用 shdr_len();

hdr_reg <regex>
hdr_reg(header) <regex>

有一个 header 与正则表达式匹配时,返回 true,可在任何时候使用;

注意,正则匹配比其他匹配更慢;

对于响应首部,使用 shdr_reg();

hdr_sub <string>
hdr_sub(header) <string>

有一个 header 包含其中一个 string 时,返回 true;

对于响应首部,使用 shdr_sub();

hdr_val <integer>
hdr_val(header) <integer>

有一个 header 起始的数字,与指定值或范围匹配;可用于限制 content-length,只接受合理长度的请求;

对于响应首部,使用 shdr_val();

http_auth(userlist)
http_auth_group(userlist) <group> [<group>]*

从客户端收到的认证信息与 userlist 中记录的匹配时,返回 true;

目前只支持 http basic auth;

http_first_req

如果处理的请求是连接的第一个请求,返回 true;

method <string>

用于检查 HTTP 请求的方法,匹配时,返回 true;

path <string>

请求中的 path 部分(以 / 起始,到 ? 为止的部分),与某个 string 相等时,返回 true;

可用于匹配某个文件,比如:/favicon.ico

path_beg <string>

当 path 以某个 string 为起始,返回 true;可用于发送某些目录名到 alternative backend;

path_dir <string>

当 path 中包含以 / 分隔的 string 时,返回 true;可用于匹配文件名或目录名;

path_dom <string>

当 path 中包含以 . 分隔的 string 时,返回 true;可用于域名匹配;

path_end <string>

当 path 以某个 string 为结束时,返回 true;可用于控制文件扩展名;

path_len <integer>

当 path 的长度与指定值或范围匹配时,返回 true;可用于检测 abusive requests;

path_reg <regex>

当 path 与正则表达式匹配时,返回 true;

path_sub <string>

当 path 包含某个 string 时,返回 true;可用于检测 path 中的指定模式,比如 “../”;

req_ver <string>

用于检查 HTTP 请求的版本,比如 1.0;

status <integer>

用于检查 HTTP response 的状态码,比如 302;

可根据状态码做一定的动作,比如,如果 response 的状态码不是 3xx,则删除 Location header;

url <string>

应用于请求中的整个 URL;真正的用处是匹配 *,已有一个预定义的 ACL: HTTP_URL_STAR;

url_beg <string>

当 URL 以某个 string 起始时,返回 true;可用于检查是否以 / 或者某个协议的 scheme 起始;

url_dir <string>

如果 URL 中包含以 / 分隔的 string,返回 true;用于文件名和目录名匹配;

url_dom <string>

如果 URL 中包含以 . 分隔的 string,返回 true;用于域名匹配;

url_end <string>

当 URL 以某个 string 结束时,返回 true;用处很少;

url_ip <ip_address>

用于检查 HTTP 请求中,绝对 URI 中所指定的 IP 地址;可用于根据 IP 地址做资源的访问限制;

跟 http_proxy 一起用时可发挥作用;

url_len <integer>

当 URL 的长度与指定值或范围匹配时,返回 true;可用于检测 abusive requests;

url_port <integer>

用于检查 HTTP 请求中,绝对 URI 中所指定的 PORT 地址;可用于根据 PORT 地址做资源的访问限制;

跟 http_proxy 一起用时可发挥作用;

注意,如果请求中没有指定端口,则表示端口为 80;

url_reg <regex>

当 URL 与正则表达式匹配时,返回 true;

url_sub <string>

当 URL 包含某个 string 时,返回 true;可用于检查 query string 中的某些 pattern;

7.5.4 预定义的 ACLs


预定义的 ACLs 不需要声明,可以直接使用。它们的命名都是大写字母。

ACL name                Equivalent to                   Usage

FALSE                   always_false                    never match
HTTP                    req_proto_http                  match if protocol is valid HTTP
HTTP_1.0                req_ver 1.0                     match HTTP version 1.0
HTTP_1.1                req_ver 1.1                     match HTTP version 1.1
HTTP_CONTENT            hdr_val(content-length) gt 0    match an existing content-length
HTTP_URL_ABS            url_reg ^[^/:]*://              match absolute URL with scheme
HTTP_URL_SLASH          url_beg /                       match URL beginning with "/"
HTTP_URL_STAR           url *                           match URL equal to "*"
LOCALHOST               src 127.0.0.1/8                 match connection from local host
METH_CONNECT            method CONNECT                  match HTTP CONNECT method
METH_GET                method GET HEAD                 match HTTP GET or HEAD method
METH_HEAD               method HEAD                     match HTTP HEAD method
METH_OPTIONS            method OPTIONS                  match HTTP OPTIONS method
METH_POST               method POST                     match HTTP POST method
METH_TRACE              method TRACE                    match HTTP TRACE method
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                    always_true                     always match
WAIT_END                wait_end                        wait for end of content analysis

7.5.5 使用 ACLs 构造 conditions


有些 actions 只在满足了有效的条件时才能执行;条件是 ACLs 的逻辑组合;

有三个可用的逻辑运算符:

  • AND(隐含的)
  • OR(显式地,使用 or 或者 || 运算符)
  • Negtion(!)

一个条件的构成:

[!]acl1 [!]acl2 ... [!]acln  { or [!]acl1 [!]acl2 ... [!]acln } ...

actions 配合条件:

actions if/unless conditons

例如,构造一个条件,希望阻挡满足条件 HTTP 请求,满足如下条件之一时,拒绝该请求:

不是 OPTIONS 请求,但 URL 为 *;
是 POST 请求,但没有 content-length 首部;
是 GET or HEAD 请求,但 content-length > 0;
请求 method,是除了 GET/HEAD/POST/OPTIONS 的请求;

规则是:

acl missing_cl hdr_cnt(Content-length) eq 0
block if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl
block if METH_GET HTTP_CONTENT
block unless METH_GET or METH_POST or METH_OPTIONS

例2.
建立 url_static 测试,当 path 以 /static、/images、/img、/css 起始,或者以 .gif、.png、.jpg、.css、.js 结尾,返回 true;
建立 host_www 测试,当请求的 Host 首部字段以 www 起始,返回 true,忽略大小写;
建立 host_static 测试,当请求的 Host 首部字段以 img. video. download. ftp. 之一为起始,返回 true,忽略大小写;

满足 host_static 测试,或者 host_www AND url_static 测试的请求,转发给 static backend;
只满足 host_www 测试的请求,转发 www backend;

acl url_static  path_beg         /static /images /img /css
acl url_static  path_end         .gif .png .jpg .css .js
acl host_www    hdr_beg(host) -i www
acl host_static hdr_beg(host) -i img. video. download. ftp.

# now use backend "static" for all static-only hosts, and for static urls
# of host "www". Use backend "www" for the rest.
use_backend static if host_static or host_www url_static
use_backend www    if host_www

HAProxy 支持使用匿名的 ACLs;不需要事先声明;它们必须被 { ACLs } 括起来,注意空格;例如:

The following rule :

   acl missing_cl hdr_cnt(Content-length) eq 0
   block if METH_POST missing_cl

Can also be written that way :

   block if METH_POST { hdr_cnt(Content-length) eq 0 }

一般而言,不建议使用匿名的 ACL,因为更容易出现错误;

只有对于简单 ACLs,比如匹配一个 src IP地址,这时使用匿名更容易阅读:

With named ACLs :

     acl site_dead nbsrv(dynamic) lt 2
     acl site_dead nbsrv(static)  lt 2
     monitor fail  if site_dead

With anonymous ACLs :

     monitor fail if { nbsrv(dynamic) lt 2 } || { nbsrv(static) lt 2 }

7.5.6 模式提取


The stickiness features relies on pattern extraction in the request and
response. Sometimes the data needs to be converted first before being stored,
for instance converted from ASCII to IP or upper case to lower case.

All these operations of data extraction and conversion are defined as
"pattern extraction rules". A pattern rule always has the same format. It
begins with a single pattern fetch word, potentially followed by a list of
arguments within parenthesis then an optional list of transformations. As
much as possible, the pattern fetch functions use the same name as their
equivalent used in ACLs.

The list of currently supported pattern fetch functions is the following :

src This is the source IPv4 address of the client of the session.
It is of type IP and only works with such tables.

dst This is the destination IPv4 address of the session on the
client side, which is the address the client connected to.
It can be useful when running in transparent mode. It is of
type IP and only works with such tables.

dst_port This is the destination TCP port of the session on the client
side, which is the port the client connected to. This might be
used when running in transparent mode or when assigning dynamic
ports to some clients for a whole application session. It is of
type integer and only works with such tables.

hdr(name) This extracts the last occurrence of header <name> in an HTTP
request and converts it to an IP address. This IP address is
then used to match the table. A typical use is with the
x-forwarded-for header.

The currently available list of transformations include :

lower Convert a string pattern to lower case. This can only be placed
after a string pattern fetch function or after a conversion
function returning a string type. The result is of type string.

upper Convert a string pattern to upper case. This can only be placed
after a string pattern fetch function or after a conversion
function returning a string type. The result is of type string.

ipmask(mask) Apply a mask to an IPv4 address, and use the result for lookups
and storage. This can be used to make all hosts within a
certain mask to share the same table entries and as such use
the same server. The mask can be passed in dotted form (eg:
255.255.255.0) or in CIDR form (eg: 24).

动静分离示例


动静分离示例:

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 30000

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin?stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE


frontend http-in
    bind *:80
    mode http
    log global
    option httpclose
    option logasap
    option dontlognull
    capture request  header Host len 20
    capture request  header Referer len 60
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .jpeg .gif .png .css .js

    use_backend static_servers          if url_static
    default_backend dynamic_servers

backend static_servers
    balance roundrobin
    server imgsrv1 172.16.200.7:80 check maxconn 6000
    server imgsrv2 172.16.200.8:80 check maxconn 6000

backend dynamic_servers
    cookie srv insert nocache
    balance roundrobin
    server websrv1 172.16.200.7:80 check maxconn 1000 cookie websrv1
    server websrv2 172.16.200.8:80 check maxconn 1000 cookie websrv2
    server websrv3 172.16.200.9:80 check maxconn 1000 cookie websrv3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,786评论 0 9
  • 1、HAProxy简介 HAProxy 是一款高性能TCP/HTTP 反向代理负载均衡服务器,具有如下功能: 根据...
    贰零壹柒_fc10阅读 2,008评论 0 0
  • Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能: 路由HTTP请求到后端服务器,基...
    uangianlap阅读 1,532评论 0 1
  • 本文编译自:users-guide 本节讲述如何使用 VCL 编写处理 HTTP 流量的策略。 Varnish 的...
    C86guli阅读 3,130评论 0 1