HAProxy配置详解
配置文件
haproxy.cfg主要有两部分组成:global和proxies配置段
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
- defaults:为frontend, backend, listen提供默认配置
- fronted:接收请求的前端虚拟节点,frontend可以增加规则直接指定具体使用后端的backend
- backend:后端服务集群的配置,真实服务器,一个backend对应一个或者多个实体服务器
- listen:同时拥有前端和后端,适用于一对一环境。fronted和backend的组合体,比如haproxy实例状态监控部分配置
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
时间格式配置说明:默认以毫秒为单位,但也可以使用其它的时间单位后缀。
us: 微秒(microseconds),即1/1000000秒;
ms: 毫秒(milliseconds),即1/1000秒;
s: 秒(seconds);
m: 分钟(minutes);
h:小时(hours);
d: 天(days);
配置参数
全局配置
通常主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关。
###################### 全局配置 ######################
global
log 127.0.0.1 local0 # 日志输出配置,日志都记录在本机,通过local0输出
# log 127.0.0.1 local0 info
maxconn 1500 # 默认最大连接数,需考虑ulimit-n限制
chroot /usr/local/haproxy # 改变当前工作目录
uid 5040 # 运行haproxy的用户(自定义)
gid 5040 # 运行haproxy的用户所在的组(自定义)
daemon # 以后台形式运行harpoxy
# nbproc 2 # 设置进程数量
pidfile /usr/local/haproxy/logs/haproxy.pid # 将所有进程的pid写入文件
# debug # haproxy 调试级别,建议只在开启单进程的时候调试
# quiet
- log
全局的日志配置,local0是日志输出设置,info表示日志级别(err,waning,info,debug); - maxconn
设定每个HAProxy进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n” - chroot
修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限; - daemon
让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用; - nbproc
指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式; - pidfile
将haproxy的进程写入pid文件。 - ulimit-n
设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项。 - stats
可开启一个unix socket管理接口。 - gid
以指定的GID运行haproxy,建议使用专用于运行haproxy的GID, 以免因权限问题带来风险。 - group
同gid,不过指定的组名。
默认配置
在此部分中设置的参数值,默认会自动引用到下面的frontend、backend、listen部分中,因此,某些参数属于公用的配置,只需要在defaults部分添加一次即可。而如果frontend、backend、listen部分也配置了与defaults部分一样的参数,Defaults部分参数对应的值自动被覆盖。
###################### 默认配置 ######################
defaults
log global
mode http # 模式:tcp|http|health,tcp是4层,http是7层,health只会返回OK
option httpclose # 每次请求完毕后主动关闭http通道
# option dontlognull # 不记录健康检查日志信息
option forwardfor # 如果后端服务器需要获得客户端真实ip,可从Http Header中获得客户端ip
option redispatch # 当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
# option abortonclose # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
retries 2 # 两次连接失败就认为是服务器不可用,也可以通过后面设置
balance static-rr # 支持static-rr,leastconn,first,uri等参数
# balance roundrobin # 设置默认负载均衡方式,轮询方式
# balance source # 设置默认负载均衡方式,保存session值,类似于nginx的ip_hash
# balnace leastconn # 设置默认负载均衡方式,最小连接数
timeout connect 3000 # 连接超时
timeout client 50000 # 客户端超时
timeout server 50000 # 服务器超时
# timeout check 2000 # 心跳检测超时
# timeout http-keep-alive 10s # 默认持久连接超时时间
# timeout http-request 10s # 默认http请求超时时间
# timeout queue 1m # 默认队列超时时间
- mode { tcp|http|health }
设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般 说来都是HTTP模式),否则将无法启动实例。- tcp
实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用; - http
实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝; - health
实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前来讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能
- tcp
- log global
设置日志继承全局配置段的设置。 - option httplog
表示开始打开记录http请求的日志功能。 - option dontlognull
如果产生了一个空连接,那这个空连接的日志将不会记录。 - option http-server-close
打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。 - option forwardfor except 127.0.0.0/8
如果上游服务器上的应用程序想记录客户端的真实IP地址,haproxy会把客户端的IP信息发送给上游服务器,在HTTP请求中添加”X-Forwarded-For”字段,但当是haproxy自身的健康检测机制去访问上游服务器时是不应该把这样的访问日志记录到日志中的,所以用except来排除127.0.0.0,即haproxy身。 - option redispatch
当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。 - retries 3
向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用。 - option abortonclose
当haproxy负载很高时,自动结束掉当前队列处理比较久的链接。 - timout http-request 10s
客户端发送http请求的超时时间。 - timeout queue 1m
当上游服务器在高负载响应haproxy时,会把haproxy发送来的请求放进一个队列中,timeout queue定义放入这个队列的超时时间。 - timeout connect 5s
haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。 - timeout client 1m
定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间。 - timeout server 1m
定义haproxy与上游服务器非活动连接的超时时间。 - timeout http-keep-alive 10s
设置新的http请求连接建立的最大超时时间,时间较短时可以尽快释放出资源,节约资源。 - timeout check 10s
健康检测的时间的最大超时时间。 - maxconn 3000
最大并发连接数。 - contimeout 5000
设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。 - clitimeout 3000
设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。 - srvtimeout 3000
设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。 - balance roundrobin
设置负载算法为:轮询算法
frontend前端配置
frontend是在haproxy 1.3版本以后才引入的一个组件,同时引入的还有backend组件。通过引入这些组件,在很大程度上简化了haproxy配置文件的复杂性。forntend可以根据ACL规则直接指定要使用的后端backend。
###################### frontend前端配置 ######################
frontend main
bind *:80 # 这里建议使用该方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
acl web hdr(host) -i www.abc.com # acl后面是规则名称,\-i为忽略大小写,后面跟的是要访问的域名,如果访问这个(域名,就触发web规则。
acl img hdr(host) -i img.abc.com # 如果访问img.abc.com这个域名,就触发img规则。
use_backend webserver if web # 如果上面定义的web规则被触发,就将请求分发到webserver这个作用域。
use_backend imgserver if img # 如果上面定义的img规则被触发,就将请求分发到imgserver这个作用域。
default_backend dynamic # 不满足则响应backend的默认页面
- frontend http_80_in
定义一个名为http_80_in的frontend。 - bind 0.0.0.0:80
定义haproxy前端部分监听的端口。 - mode http
定义为http模式。 - log global
继承global中log的定义。 - option forwardfor
使后端server获取到客户端的真实IP。 - default_backend
default_backend 在没有匹配的”use_backend”规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。在”frontend”和”backend”之间进行内容交换时,通常使用”use- backend”定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。
使用案例:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
backend后端配置
在HAProxy1.3版本之前,HAProxy的所有配置选项都在这个部分中设置。为了保持兼容性,haproxy新的版本依然保留了listen组件配置试。两种配置方式任选一中。
###################### backend后端配置 ######################
backend webserver
mode http
balance roundrobin # 负载轮询
option httpchk /index.html HTTP/1.0 # 健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
# cookie 1表示serverid为1,check inter 1500 是检测心跳频率
# rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
backend imgserver
mode http
option httpchk /index.php
balance roundrobin
server img01 192.168.137.101:80 check inter 2000 fall 3
server img02 192.168.137.102:80 check inter 2000 fall 3
backend dynamic
balance roundrobin
server test1 192.168.1.23:80 check maxconn 2000
server test2 192.168.1.24:80 check maxconn 2000
- cookie
表示充许向cookie插入SERVERID,每台服务器的SERVERID可以下面的server关键字中使用cookie关键字定义。 - option httpchk
此选项表示启用HTTP的服务状态检测功能。 HAProxy作为一个专业的负载均衡器,并且它支持对backend部分指定的后端服务节点的 健康检查,以保证在后端的backend中某个节点不能服务时,把从frontend端进来的客户端请求分配至backend中其他健康节点上,从而保证 整体服务的可用性。
option httpchk用法:- method
表示HTTP请求的方式,常用的有OPTIONS、GET、HEAD几种方式。
一般健康检查可以采用HEAD方式进行,而不是采用GET方式,这是因为HEAD方式没有数据返回,仅检查Response的HEAD是不是状态码200。因此,相对于GET,HEAD方式更快,更简单。 - uri
表示要检测的URL地址,通过执行此URL,可以获取后端服务器的运行状态,在正常情况下返回状态码200,返回其他状态码均为异常状态。 - version
指定心跳检测时的HTTP的版本号。
- method
- server
用来定义多台后端真实服务器,不能用于defaults和frontend部分,格式为:server name address:port param*- name
为后端真实服务器指定一个内部名称,随便这下义一个即可。 - address
后端真实服务器的iP地址或主机名。 - port
指定连接请求发往真实服务器时的目标端口,在未设定时,将使用客户端请求时的同一端口。 - param
为后端服务器设定的一系列参数,可用参数非常多,
- name
- check
表示启用对此后端服务器执行健康检查。 - inter
设置健康状态检查的时间间隔,单位为毫秒。 - rise
设置人故障状态转换至正常状态需要成功检查的次数,如 rise 2:表示2次检查正确就认为此服务器可用。 - fall
设置后端服务器从正常状态转换为不可用状态需要检查的次数,如 fall 3表示3 次检查失败就认为此服务器不可用。 - cookie
为指定的后端服务器设定cookie值,此外指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中,其目的在于实现持久连接的功能。 - cookie server1
表示web1的serverid为server1。 - weigth
设置后端真实服务器的权重,默认为1,最大值为256,设置为0表示不参与负载均衡。 - maxconn
设定每个backend中server进程可接受的最大并发连接数,此选项等同于linux命令选项”ulimit -n” - backup
设置后端真实服务器的备份服器,仅仅在后端所有真实服务器均不可用的情况下才启用。
listen配置
常常用于状态页面监控,以及后端server检查,是Fronted和backend的组合体
###################### 统计页面配置 ######################
listen stats
bind 0.0.0.0:1080 # 设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
mode http # http的7层模式
option httplog # 采用http日志格式
# log 127.0.0.1 local0 err # 错误日志记录
maxconn 10 # 默认的最大连接数
stats refresh 30s # 统计页面自动刷新时间
stats uri /stats # 统计页面url
stats realm YANGPIENA\ Haproxy # 统计页面密码框上提示文本
stats auth admin:admin # 设置监控页面的用户和密码:admin,可以设置多个用户名
stats auth admin1:admin1 # 设置监控页面的用户和密码:admin1
stats hide-version # 隐藏统计页面上HAProxy的版本信息
stats admin if TRUE # 设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)
errorfile配置
格式为: errorfile 错误代码code 错误代码文件路径
errorfile错误页面配置,在用户请求不存在的页面时,返回一个页面文件给客户端,而非由haproxy生成的错误代码;可用于所有段中。例如:
###################### 错误页面配置 ######################
errorfile 403 /usr/local/haproxy/errorfiles/403.http
errorfile 500 /usr/local/haproxy/errorfiles/500.http
errorfile 502 /usr/local/haproxy/errorfiles/502.http
errorfile 503 /usr/local/haproxy/errorfiles/503.http
errorfile 504 /usr/local/haproxy/errorfiles/504.http
一份完整的haproxy配置文件实例:
###################### 全局配置 ######################
global
log 127.0.0.1 local0 # 日志输出配置,所有日志记录在本机,通过local0输出
maxconn 3000 # 默认最大连接数,需考虑ulimit-n限制
daemon # 以后台形式运行harpoxy
uid 5040 # 运行haproxy的用户
gid 5040 # 运行haproxy的用户所在的组
chroot /usr/local/haproxy # 改变当前工作目录
pidfile /usr/local/haproxy/logs/haproxy.pid # 当前进程的pid文件
###################### 默认配置 ######################
defaults
log global
mode http # 模式:tcp|http|health,tcp是4层,http是7层,health只会返回OK
option httpclose # 每次请求完毕后主动关闭http通道
option forwardfor # 如果后端服务器需要获得客户端真实ip,可从Http Header中获得客户端ip
option redispatch # 当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
retries 3 # 3次连接失败就认为是服务器不可用
timeout connect 300000 # 连接超时
timeout client 500000 # 客户端超时
timeout server 500000 # 服务器超时
###################### 统计页面配置 ######################
listen stats # 设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
bind 0.0.0.0:8888 # 监听端口
maxconn 1 # 默认的最大连接数
option httplog # 采用http日志格式
stats enable # 启用状态监控
stats refresh 30s # 统计页面自动刷新时间
stats uri /stats # 统计页面url
stats realm YANGPIENA # 统计页面密码框上提示文本
stats auth admin:admin # 设置监控页面的用户和密码:admin,可以设置多个用户名(再增加一行即可)
stats admin if TRUE # 设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)
###################### 业务前端配置 ######################
frontend xx
bind 0.0.0.0:80
default_backend xxServers
###################### 业务后端配置 ######################
backend xxServers
balance source
server 50.41:80 10.1.50.41:80 weight 1 check inter 1500 rise 2 fall 3
server 50.42:80 10.1.50.42:80 weight 1 check inter 1500 rise 2 fall 3
server 108.6:8080 10.1.108.6:8080 weight 1 check inter 1500 rise 2 fall 3
server 218.95.162.130:88 218.95.162.130:88 weight 1 check inter 1500 rise 2 fall 3
###################### 错误页面配置 ######################
errorfile 403 /usr/local/haproxy/errorfiles/403.http
errorfile 500 /usr/local/haproxy/errorfiles/500.http
errorfile 502 /usr/local/haproxy/errorfiles/502.http
errorfile 503 /usr/local/haproxy/errorfiles/503.http
errorfile 504 /usr/local/haproxy/errorfiles/504.http