官方参考文档:http://cbonte.github.io/haproxy-dconv/1.7/configuration.html

HAProxy 配置文件相关格式

HAProxy 的配置主要涉及 3 个部分

  • 命令行中的参数(优先级最高)。
  • global 部分,用于设置进程范围的参数。
  • proxy 部分。包含以下几个模块:
    1、defaults:为 frontend、backend、listen 部分设置默认参数。相当于 nginx 中的 http 模块。
    2、frontend:定义接受客户端连接的监听地址。相当于 nginx 中的 server 模块。
    3、backend:定义一组后端服务器。相当于 nginx 中的 upstream 模块。
    4、listen:定义了一个完整的代理,即包含 frontend 和 backend 的配置。一般都使用 listen 配置。

配置文件中的时间格式:
us : 微秒。1us = 1/1000000s
ms : 毫秒。1ms = 1/1000s。这是默认值。
s : 秒。1s = 1000ms
h : 时。1h = 60m = 3600s = 3600000ms
d : 天。1d = 24h = 1440m = 86400s = 86400000ms

HAProxy 负载平衡的算法

roundrobin 动态轮询算法,每个后端最多可支持 4095 个。动态算法支持慢启动和动态调整权重。

static-rr 静态轮询算法。后端可支持无限个服务器。

leastconn 最小连接算法。适用于会话时间很长的地方(例如:LDAP,SQL,TSE等);不适用于使用短会话的协议(例如:HTTP)。

first 根据服务器在列表中的位置,自上而下进行调度,但只有当第一台服务器的连接数达到上限时,新请求才会分配给下一台服务器器。

source 基于请求源 IP 的算法,相当于nginx中的 ip_hash 算法。对请求的源 IP 进行 hash 运算,然后将结果与后端服务器的权重总数相除后转发至某台匹配服务器。默认情况下,此算法为静态算法;可以指定 hash-type 进行更改。

uri 与 source 算法类似,只是对部分或整体(whole 参数) URI 进行 hash 运算。默认情况下,此算法为静态算法;可以指定 hash-type 进行更改。

uri_param 根据 URL 路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。默认情况下,此算法为静态算法;可以指定 hash-type 进行更改。

hdr(<name>) 根据 HTTP header 转发,括号中的标头名称不区分大小写,如果不存在标头或标头不包含任何值,则改用 roundrobin 算法。默认情况下,此算法为静态算法;可以指定 hash-type 进行更改。

rdp-cookierdp-cookie(<name>) 根据 cookie 转发,括号中的 cookie 名称不区分大小写,如果找不到 cookie,则改用 roundrobin 算法。默认情况下,此算法为静态算法;可以指定 hash-type 进行更改。

global 部分常用配置

示例:

global
    log         127.0.0.1 local2  info

    chroot      /var/lib/haproxy
    pidfile     /usr/local/haproxy/temp/haproxy.pid
    maxconn     40960
    user        haproxy
    group       haproxy
    daemon
    nbproc      2
    cpu-map     1 0
    cpu-map     2 1

    #后端节点少时,没必要使用。
    #spread-checks     5

    stats socket /usr/local/haproxy/temp/haproxy.sock1  level admin mode 600 process 1
    stats socket /usr/local/haproxy/temp/haproxy.sock2  level admin mode 600 process 2

log 定义全局 syslog 服务器,最多可以定义两个。它们将接收启动和退出的日志,以及配置为 “log global” 的代理的所有日志。格式如下:

log <address> [len <length>] [format <format>] <facility> [max level [min level]]

<address> : 定义日志发往的位置,可以是 ipv4 或者 ipv6 加端口号(UDP),不指定端口时使用 514(syslog的端口)。也可以是 socket 地址。
<length> : 是可选的最大行长度。默认值1024,通常适用于所有情况标准用法。
<format> : 是日志格式。默认值即可。
<facility> : 必须是 24 个标准 syslog 工具之一。
<leve> : 定义日志级别。已知八个级别:emerg、alert、crit、err、warning、notice、info、debug。

chroot 更改 haproxy 的工作根目录。即锁定 haproxy 进程的目录,可提高安全级别。

pidfile 指定 pid 文件位置。

maxconn 每个进程的最大并发连接数。

user or uid 指定运行用户名或 UID。

group or gid 指定运行组名字或 GID。

daemon 以守护进程的方式运行 haproxy。

nbproc 指定在 daemon 模式下运行 haproxy 的进程数。

cpu-map 绑定进程至 CPU。格式如下:

cpu-map <"all"|"odd"|"even"|process_num> <cpu-set>...

第一个参数是要绑定的进程号,第二个参数是要绑定至哪个 CPU 集。

spread-checks 避免在同一时间内向所有后端节点进行健康检查。官方推荐值为 2-5。

stats socket 将 socket 绑定到指定 <path> 或 ip:port 上。连接到此 socket 可以统计输出,甚至允许发出一些命令来更改某些运行时设置。

注意: stats socket 在多进程模式(nbproc>1)下无法按预期工作,应使用 "bind process" 全局强制进程绑定,或使用 "process" 对每个 socket 进程绑定。最好的选择是使用 "process" 设置。

格式如下:

stats socket [<address:port>|<path>] [param*]

[param*] 的常用参数如下:
level:与 stats socket 一起使用。仅用于限制可以在 socket 上发出的命令。包含三个值:user(最小权限,只能用于统计)、operato(默认级别,只允许非敏感更改)、admin(最高权限)。
mode:设置 socket 的访问权限。
process:绑定 socket 至哪个进程或进程列表。

proxy 部分常用配置

示例:

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  http-keep-alive
    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 120s
    timeout check           10s
    
    #errorfile  503  /usr/local/haproxy/errorfiles/503.http
    errorloc   503   ""

#---------------------------------------------------------------------
# web test page
#---------------------------------------------------------------------
listen WebTest
    log         global
    bind        192.168.10.143:80,192.168.10.143:8000
    balance     roundrobin
    server  web1  192.168.10.143:8080  weight 1  check  inter 3s  fall 2  rise 5
    server  web2  192.168.10.143:8090  weight 1  check  inter 3s  fall 2  rise 5
    #server  php1  192.168.10.143:80  weight 1  check addr 10.0.10.143 port 9000 inter 3s  fall 2  rise 5

#---------------------------------------------------------------------
# mongodb test 
#---------------------------------------------------------------------
listen MysqlTest
    mode        tcp
    option      tcplog
    bind        192.168.10.143:3306
    balance     roundrobin
    server  mysql1  192.168.10.137:3306  weight 1  check  inter 3s  fall 2  rise 5
    server  mysql2  192.168.10.138:3306  weight 1  check  inter 3s  fall 2  rise 5

#---------------------------------------------------------------------
# HAProxy status page
#---------------------------------------------------------------------
listen HAProxyPage
    bind-process  1
    bind          192.168.10.143:8888
    stats         enable
    stats         hide-version
    stats         refresh           30s
    stats         uri               /haproxy-status
    stats         auth              admin:123456
    stats         realm             "haproxy status page of wpftest"

mode 设置实例的运行模式或协议。

log global 继承 global 部分配置的日志格式。

option tcplog 默认情况下,日志仅包含源地址和目标地址以及实例名称。启用 tcplog 可使日志包括但不限于连接计时器、会话状态、前端、后端和服务器名称等。此选项对于 TCP 代理很有用;对于 HTTP 代理,最好使用 option httplog

option httplog 启用 HTTP 请求、会话状态和计时器的日志记录。

option dontlognull 禁止记录不传输任何数据的日志。

option http-server-close 在服务器端启用 http 连接关闭模式,同时保持在客户端支持 http-keep-alive 和 pipelining 。这在客户端提供了最低的延迟,在服务器端提供了最快的会话重用,以节省服务器资源。

option http-keep-alive 在客户端和服务器端启用 http-keep-alive 模式。与客户端的会话保持。

option forwardfor 将 HTTP 标头 “X-Forwarded-For” 添加到发送到服务器的所有请求中。格式如下:

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

except <network> : 与 <network> 匹配的源禁用此选项。最常见的是用于专用网络或 127.0.0.1。
header <name> : 用于指定其他 “X-Forwarded-For” 的 header 名称。
if-none : 仅在不存在标头的情况下才添加。这仅应在完全受信任的环境中使用,因为如果到达 haproxy 的标头在最终用户的控制之下,则这可能会导致安全问题。

option redispatch 在连接失败的情况下重新分发会话。需要将 retries 设置为非零值。

retries 连接失败后在服务器上执行的重试次数,默认为 3。

timeout http-request 设置等待完整HTTP请求所允许的最长时间。可以保护 HAProxy 免受 Slowloris 之类的攻击。

timeout queue 达到 maxconn 时,在队列中等待连接的最长时间。超时返回 503。

timeout connect 定义 haproxy 将客户端请求转发至后端服务器所等待的超时时长。通过指定略高于 3 秒的倍数的超时来覆盖一个或多个 TCP 数据包丢失是一个好习惯。

timeout client 客户端非活动状态的超时时长。==通过指定略高于 3 秒的倍数的超时来覆盖一个或多个TCP数据包丢失是一个好习惯。==在 TCP 模式下,强烈建议 timeout clienttimeout server 保持相等,以避免调试复杂的情况。

timeout server 客户端与服务器端建立连接后,等待服务器端的超时时长。通过指定略高于 3 秒的倍数的超时来覆盖一个或多个TCP数据包丢失是一个好习惯。

timeout http-keep-alive 设置等待新 HTTP 请求出现的最长时间。即保持连接的超时时长。

timeout check 健康状态检查的超时时间,仅在已经建立连接之后。

errorfile <code> <file> 在用户请求不存在的页面时,返回指定文件中的内容。
<code> : 状态码。一般只会涉及到 503。比如:监听端口为 80,访问路径为test;当不加 test 访问是,就是 503 错误。
<file> : 指定一个包含完整 HTTP 响应的文件。建议文件的后缀是 “.http” ,防止与 HTML 错误页面混淆,并使用绝对路径。

errorloc <code> <url> 在用户请求不存在的页面时,重定向至某 URL 的信息。

listen 部分

bind 定义一个或多个侦听地址和端口。格式如下:

bind [<address>]:<port_range> [, ...] [param*]

balance 定义要在后端中使用的负载平衡算法。格式如下:

balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post]

<algorithm> : 指定负载平衡算法。
<arguments> : 是一些算法可能需要的可选参数列表。
Examples :

balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only

server 声明后端服务器。格式如下:

server <name> <address>[:[port]] [param*]

<name> : 是分配给此服务器的内部名称,该名称将出现在日志和警报中。
<address>[:[port]] : 支持 ipv4 和 ipv6。
[param*] 相关参数:

  • check : 启用健康检查。可使用 addr or port 指定其他 IP or port 进行健康检查。
  • backup : 指定备份服务器。
  • ca-file <cafile> : 指定 ca 文件。
  • crl-file <crlfile> : 指定 crl 文件。
  • disabled : 指定关闭的服务器。
  • fall <count> : 指定连续不成功的健康检查的最大次数,达到这个次数,服务器将被视为关闭。默认为 3 次。
  • rise <count> : 指定连续成功的健康检查的最大次数,达到这个次数,服务器将被视为正常。默认为 2 次。
  • inter <delay> : 两次连续健康检查的间隔,默认为 2 秒。
  • weight <weight> : 权重,默认为 1。

option tcpka 使用选项 “tcpka” 可以在连接的客户端和服务器端上发出TCP保持活动探测。

option httpchk 启用 HTTP 协议以检查服务器运行状况。

option mysql-check 使用 MySQL 运行状况检查进行服务器测试。

haproxy 状态页面相关

stats enable 启用 haproxy 状态页面。

注意:代理 haproxy_status,在多进程模式下,状态将只分配给当前请求的进程。所以,我们一般使用 "bind-process" 将 haproxy 状态页面绑定到固定的进程上。

stats auth <user>:<passwd> 为统计报告启用认证功能(用户:密码)。

stats realm <realm> 为统计报告认证功能的弹框设置 banner。

stats uri <prefix> 为统计报告定义访问路径。

stats hide-version 隐藏统计报告版本信息。

stats refresh <delay> 为统计报告页面设置自动刷新时间。

stats admin 如果认证通过,则启用统计管理级别。管理员级别允许从 Web 界面启用/禁用服务器。默认情况下,出于安全原因,统计信息页面为只读。