二、HAProxy 配置文件
haproxy配置参数的来源:
- 通过命令行参数(具有最高优先级,会覆盖配置文件中的配置)
- 通过global section 用于设置进程级别的参数
- proxy section 可以通过:defaults,listen,frontend,backend
配置文件的语法:
每行以一个关键字开始,后接一个或多个参数,参数与参数之间以空格分割,注释行以#开头。
1、global
用于设定全局参数,属于进程级别的配置,通常与操作系统配置有关
常见配置:
-
log:全局日志配置。eg:log 127.0.0.1 local0 info(表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为info)
-
log-send-hostname []
-
log-tag
log用法参考:Haproxy中的Log的相关配置详解 -
maxconn:设定每个haproxy进程的最大并发连接数
-
user/group : 设置运行haproxy进程的用户和组,也可使用uid/gid代替。
-
daemon: 设置haproxy进程进入后台运行,(推荐运行模式)
-
nbproc:设置haproxy启动时刻创建的进程数,此参数要求将haproxy运行模式设置为daemon,默认情况只会创建一个进程(推荐)。
-
pidfile:制定haproxy进程的pid文件,启动进程的用户必须具有访问此文件的权限。
-
chroot :修改haproxy的工作目录到指定的目录,并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意要确保指定的目录为空目录且任何用户均不能有写权限。(如果开启外部脚本健康检查,外部检查的external-check path 以及脚本文件都应该chroot的权限范围内)
-
cpu-map :将进程绑定到特定的cpu上,好处是防止多进程对cpu的抢占,第一个参数是进程序号,第二个参数是cpu序号(eg : cpu-map 1 0 \ cpu-map all 0 \ cpu-map odd 0 \ cpu=map even 1)
-
deviceatlas-json-file
-
deviceatlas-log-level
-
deviceatlas-separator
-
deviceatlas-properties-cookie
这四个和deviceatlas相关的设置,配置这四个需要安装相应的模块:
make … USE_DEVICEATLAS=1 DEVICEATLAS_SRC=<…>
关于deviceatlas 的介绍参考:https://deviceatlas.com/products/overview -
external-check:启用外部脚本进行健康检查,
-
option external-check:在defaults\listen\backend均可设置,采用外部脚本执行健康检查,这里和option httpchk GET /uri 的用法一个意思
-
external-check path
:运行外部检查时使用的path环境变量值 -
external-check command 运行外部检查的执行脚本文件,执行中脚本文件将会接受4个参数,同时可以直接使用环境变量:
参数:<proxy_address> <proxy_port> <server_address> <server_port>
变量:
HAPROXY_PROXY_ID
HAPROXY_PROXY_NAME
HAPROXY_PROXY_ADDR
HAPROXY_PROXY_PORT
HAPROXY_SERVER_ADDR
HAPROXY_SERVER_CURCONN //服务器connects数
HAPROXY_SERVER_ID
HAPROXY_SERVER_MAXCONN //haproxy的最大链接数
HAPROXY_SERVER_NAME
HAPROXY_SERVER_PORT
PATH //设置的external-check path
Tips 1: 外部检查的脚本,必须已 0 状态退出,否则会认为检查失败。这个对于高级的haproxy应用特别有用。 -
lua-load :执行一个lua脚本,但在安装时需要指定USE_LUA=1
-
setenv :设置环境变量,如果存在会覆盖
-
presetenv :设置环境变量,如果存在不会覆盖
-
resetenv []:移除指定的环境变量
-
unsetenv []:移除制定的环境变量
-
server-state-base 指定前面的所有服务器状态前面的目录前缀不以’/'开头的文件名。
-
server-state-file 指定包含服务器状态的文件的路径。 如果路径开始用斜杠(’/’),它被认为是绝对的,否则被考虑相对于使用“server-state-base”(如果设置)指定的目录当前目录。
-
load-server-stae-from-file {global|local|none}
-
server-state-file-name []
-
ulimit-n :设置每个进程的最大文件描述符的数量,因为haproxy会自动计算,所以不建议设置
-
unix-bind [prefix ] [mode] [user][uid][group][gid]
-
node :当前服务器存在多个进程,或启动多个实例,配置才生效
-
description
: 当前实例描述 -
51degrees-data-file 51Degrees数据文件的路径提供设备检测服务。该文件应该被解压缩并由HAProxy使用相关权限访问。
-
51degrees-property-name-list [ …] 要从数据集加载的51Degrees属性名称的列表。 完整列表的名称可在51Degrees网站上获得:
-
51degrees-property-separator 将追加到响应头中的每个属性值的char包含51Degrees结果。 如果未设置将被设置为’,’。
-
51degrees-cache-size 将51Degrees转换器缓存的大小设置为条目。 这个是提醒先前设备检测及其结果的LRU缓存。默认情况下,禁用此缓存。
51degrees的相关设置,相关的信息可以参考:https://51degrees.com/51degrees.com/blog/51degrees-and-haproxy-technologies-bring-device-detection-to-haproxy-community-3
-wurfl-data-file WURFL数据文件的路径提供设备检测服务。该文件应该由具有相关权限的HAProxy访问。请注意,此选项仅在编译haproxy时可用USE_WURFL = 1。
-
wurfl-information-list []* WURFL功能,虚拟功能,属性的空格分隔列表我们计划在注入头中使用的名称。 完整的功能列表和虚拟功能名称可在Scientiamobile网站上获得
-
wurfl-information-list-separator 将用于在包含的响应标头中分隔值的charWURFL结果。 如果未设置,默认情况下将使用逗号(’,’)。
-
wurfl-patch-file [] WURFL补丁文件路径列表。 请注意,修补程序在启动期间加载因此在chroot之前。
-
wurfl-engine-mode { accuracy | performance }
-
wurfl-cache-size [,] 设置WURFL缓存策略。 这里是Useragent缓存大小,内部设备缓存大小 这里有三种可能性: - “0”:不使用缓存。- :使用单个LRU缓存,大小以元素表示。 - ,:使用Double LRU缓存,两种尺寸都在元素中。 这是性能最高的选项。
-
wurfl-useragent-priority { plain | sideloaded_browser } 告诉WURFL是否应优先使用普通用户代理(‘plain’)通过默认的侧边浏览器用户代理(‘sideloaded_browser’)。
wurfl的相关知识点,可到网上自行查阅。在安装的时候需要使用 USE_WURFL=1
可参考:http://blog.csdn.net/njchenyi/article/details/1905841 -
master-worker [no-exit-on-failure]:
master-worker mode,它等同于命令行 “-W” 参数,这个模式将会启动一个master用于监控“workers”。使用这种模式,你可以直接通过发送SIGUSR2信号给master来重启haproxy。当使用多进程和后台启动时,建议使用该模式。 -
spread-cheaks <0…50,in percent>
健康检查的相关设置,参考:Haproxy中几种健康检查的使用 -
option splice-auto
-
no option splice-auto
-
option splice-request
-
no option splice-request
-
option splice-response
-
no option splice-response
-
nogetaddrinfo
-
noreuseport
-
tune.ssl.force-private-cache 此布尔值禁用所有进程之间的SSL会话缓存共享。 通常不会使用它,因为客户打入随机过程会导致许多重新协商。
-
tune.ssl.lifetime 设置缓存的SSL会话可能保持有效的时间。此时间以秒为单位,默认为300(5分钟)。
-
tune.ssl.maxrecord 设置一次传递到SSL_write()的最大字节数。 默认值0表示没有限制。 通过SSL/TLS,一旦收到完整记录,客户端就可以对数据进行解密。
-
tune.ssl.default-dh-param 设置在DHE密钥交换的情况下用于生成临时/临时Diffie-Hellman密钥的Diffie-Hellman参数的最大大小。默认为1024.
-
tune.ssl.ssl-ctx-cache-size 将用于存储生成的证书的缓存的大小设置为条目。 这是一个LRU缓存。默认缓存大小设置为1000个条目。
-
tune.recv_enough
-
tune.sndbuf.client
-
tune.ssl.cachesize 在多个块中设置全局SSL会话高速缓存的大小。
-
tune.sndbuf.server
socket的接受/发送缓存大小。默认是0,表示自动调整。 -
tune.vars.global-max-size
-
tune.vars.proc-max-size
-
tune.vars.reqres-max-size
-
tune.vars.sess-max-size
-
tune.vars.txn-max-size 管理变量系统使用的最大内存量。“global”限制了所有范围的可用内存总量。“proc”限制进程范围的内存,“sess”限制会话范围的内存,为事务范围限制“txn”,“reqres”限制每个请求或响应处理的内存
变量系统的相关设置。
- tune.zlib.memlevel 在每个会话的zlib初始化中设置memLevel参数。 它定义为内部压缩状态分配多少内存。 值为1使用最小内存,但缓慢并降低压缩比,9值使用最大内存以达到最佳速度。 可以是1到9之间的值。默认值为8。
- tune.zlib.windowsize (历史缓冲区的大小)设置为每个会话的zlib初始化参数。 此参数的较大值会导致更好的压缩,而牺牲内存使用率。 可以是8到15之间的值。默认值为15。
zlib的参数设置。 - ca-base
分配一个默认目录以从相对路径与“ca-file”或“crl-file”指令一起使用时获取SSL CA证书和CRL。 以“ca-file”和“crl-file”中指定的绝对位置为准,忽略“ca-base”。 - crt-base
分配一个默认目录以从相对路径与“crtfile”指令一起使用时获取SSL证书。 以“crtfile”为基准指定的绝对位置,忽略“crt-base”。 - ssl-default-bind-ciphers 此设置仅在内置OpenSSL的支持时可用描述密码算法列表的默认字符串(“密码套件”)这是在SSL/TLS握手期间为所有“绑定”行协商的不要明确定义它们。
- ssl-default-bind-options [] … 此设置仅在内置OpenSSL的支持时可用默认的ssl选项强制对所有的“绑定”行。
example:
global
ssl-default-bind-options ssl-min-ver TSLv1.0 no-tls-tickets
- ssl-default-server-ciphers 此设置仅在支持OpenSSL时可用设置描述密码算法列表的默认字符串在与服务器的SSL/TLS握手期间协商。
- ssl-default-server-options []…此设置仅在内置OpenSSL的支持时可用在所有“服务器”行上强制使用默认的ssl-options。
- ssl-dh-param-file 此设置仅在内置OpenSSL的支持时可用在SSL/TLS握手期间使用的默认DH参数使用短暂的Diffie-Hellman(DHE)密钥交换,该值最少为2048
- ssl-server-verify [none|required] 服务器端的SSL验证的默认行为。 如果指定为“none”,服务器证书未验证。 默认值为“required”,除非强制使用cmdline选项’-dV’。
- stats socket [address:port|
] [param*] 将UNIX套接字绑定到 或TCPv4 / v6地址到<address:port>。与此socket的连接将返回各种统计信息输出,甚至返回允许发出一些命令来更改一些运行时设置。 - stats timeout <timeout, in milliseconds> stats socket上的默认超时设置为10秒。 有可能的使用“stats timeout”更改此值。 该值必须传入毫秒,或者由{us,ms,s,m,h,d}之间的时间单位后缀。
- stats maxconn 默认情况下,stats套接字限制为10个并发连接。它是可以用“stats maxconn”来改变这个值。
性能优化相关配置:
- busy-polling
这个参数提供了一个解决方案去让处理器从睡眠状态转变 为pollers。适用于低延时要求的请求。默认关闭 - max-spread-checks
这个参数是用于强制第一次和最后一次检查之间的延迟上限,即使服务器的检查间隔较大。 - maxconn
设置每个进程最大连接数,当到大这个值后,将停止接受连接。 - maxconnrate
设置每个进程每秒钟最大连接数
Tips 1:maxconnrate限制的优先级高于maxconn - maxcomprate
限制每秒钟的压缩数据量的大小(kb)当在会话期间,如果达到该限制值,那么系统将降低tune.comp.maxlevel。如果在会话开始的时,已经达到该限制,则系统完全不压缩该会话。 - maxcompcpuusage
限制压缩算法占用CPU的百分比,默认100,设置降低该值,来防止因为压缩的算法,而导致高延迟。 - maxpipes
限制进程每秒中管道的数,默认是maxconn / 4,因为一个 pipes包括2个文件描述符,所以该值的设置将会影响ulimit-n. - maxsslconn
将并发SSL连接的最大每进程数设置为<数字>。默认情况下,没有SSL特定的限制,这意味着全局maxconn设置将适用于所有连接。设置此限制避免使用openssl使用太多的内存 - maxsslrate
将每秒SSL会话的最大每进程数设置为。当达到此限制时,SSL侦听器将停止接受连接。 它可以用来限制全局SSL CPU使用率,而不管每个前端容量。 - maxsessrate
限制进程每秒钟处理session的数量,如果到达该限制,则不再接受新的链接。 - maxzlibmem
设置zlib可用的每个进程的最大RAM容量(兆字节)。当达到最大数量时,未来的会话将不会压缩因为RAM不可用。 当设置为0时,没有限制。默认值为0.该值在UNIX套接字上以字节为单位 - noepoll
禁用epoll,等同于命令行的 -de,linux - nokqueue
禁用kqueue,等于命令行的 -dk,bsd - noevports
noevports - nopoll:禁用poll,等同于命令行 -dp
- nosplice 用在Linux上的套接字之间使用内核tcp拼接。 它是相当于命令行参数“-dS”。
- nogetaddrinfo 禁用使用getaddrinfo进行名称解析。 相当于命令行参数“-dG”。
- noreuseport: 禁止使用SO_REUSEPORT相当于命令行参数“-dR”。
- profiling.tasks { auto | on | off }
cpu profiling 在报告时间的花费和每个请求之间的影响很方便。开启此功能将使整个效率降低1%,所以建议让它保持默认值auto,这样只在问题产生的时候生效。 - ssl-engine [algo ]
设置openssl engine,这个声明语句可多次使用,engine:RSA,DSA,DH,EC,RAND,CIPHERS,DIFESTS,PKEY,PKEY_CRYPTO,PKEY_ASN1 - ssl-mode-async
向ssl 上下文中添加ssl-mode-async ,它将会启用异步TLS I/O操作。 - tune.buffers.limit
设置每个进程可能分配的缓冲区数量的硬限制,默认值是0,表示不限制 - tune.buffers.reserve
默认值是2
设置预先分配并保留供仅供使用的缓冲区数在内存不足的情况下导致内存分配失败,如果不是haproxy的核心开发者,不建议修改这2个值。 - tune.bufsize
单位字节,默认是16384,不建议修改,将缓冲区大小设置为此大小(以字节为单位)。 较低的值允许更多会话共存在相同数量的RAM中,更高的值允许一些应用程序使用非常大的Cookie工作。 - tune.chksize
单位字节,默认是16384,将检查缓冲区大小设置为此大小(以字节为单位)。 更高的价值可能有所帮助在非常大的页面中查找字符串或正则表达式模式,但这样做可能意味着更多的内存和CPU使用率。 - tune.comp.maxlevel
设置session的压缩级别,默认1,选值1-6,压缩级别越高CPU的使用率越高,但同时传输的数据越小。 - tune.fail-alloc
-
- tune.http.cookielen
限制cookie的长度,默认63字节,不建议修改
- tune.http.cookielen
- tune.http.logurilen
设置日志中请求uri的最大长度,默认1024 - tune.http.maxhdr
请求头的数量,默认是101 -
- tune.idletimer
设置haproxy将认为空缓冲区的持续时间可能与空闲流相关联。默认为1000
- tune.idletimer
- tune.listener.multi-queue { on | off }
- tune.lua.forced-yield
该指令强制Lua引擎执行每个的收益执行指令 这允许中断长脚本并允许HAProxy调度程序来处理其他任务 - tune.lua.maxmem
设置Lua可用的每个进程的最大RAM容量(兆字节)。 通过默认为零,这意味着无限制。设置限制很重要确保脚本中的错误不会导致系统耗尽内存。 - tune.lua.session-timeout
这是Lua会话的执行超时。 这对于防止无限循环或花费太多时间在Lua。默认超时时间是4s - tune.lua.task-timeout
目的与“tune.lua.session-timeout”相同,但是这个超时是致力于任务 - tune.lua.service-timeout
这是Lua服务的执行超时。 默认是4秒 - tune.maxaccept
默认是64,设置为-1表示完全禁用,通常不需要设置该值。设置进程在切换到其他工作之前在一行中可以接受的连续连接的最大数量。 - tune.maxpollevents
进程调用poll系统的数量,默认200 - tune.maxrewrite
将保留的缓冲区空间设置为此字节大小。 保留空间用于标题重写或附加。 插槽上的第一次读取将不会超过bufsize-maxrewrite。 - tune.pattern.cache-size
将模式查找缓存的大小设置为条目。这是一个提醒先前查找及其结果的LRU缓存。,不建议修改。 - tune.pipesize
将内核管道缓冲区大小设置为此大小(以字节为单位)。 默认情况下,管道是系统的默认大小,不建议修改。 - tune.rcvbuf.client
- tune.rcvbuf.server
强制客户端或服务器端的内核套接字接收缓冲区大小为指定值(以字节为单位)。此值适用于所有TCP/HTTP前端和后端。通常不会设置,默认大小(0)允许内核根据可用内存量自动调整该值。