官方参考文档: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-cookie
rdp-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 client
与 timeout 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 界面启用/禁用服务器。默认情况下,出于安全原因,统计信息页面为只读。