Haproxy(一)环境搭建和参数记录
一晃做运维好多年了,这些年来一说负载均衡,反向代理最常提到的就是lvs,nginx,haproxy,虽然haproxy现在听到的越来越少,不过确实也是一款不错的软件。前面已经对nginx反向代理进行了记录,虽然已经好几年不用haproxy了,但是还是想做下记录,可能写的不够深刻。
一、Haproxy介绍
1.1 简介
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
官网地址:http://www.haproxy.com/
下载地址:http://www.haproxy.org/download
文档教程:http://www.haproxy.com/support/faq/
1.2 haproxy的安装
yum安装:
# yum install haproxy -y #现在yum源的rpm包才到1.5版本
源码安装:
#yum install psmisc openssl openssl-devel install libnl* libnfnetlink-devel pcre pcre-devel -y
# wget www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz
# tar zxf haproxy-1.7.8.tar.gz
# cd haproxy-1.7.8
# make TARGET=linux26 ARCH=x86_64 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_PCRE_JIT=1
#必须要指定的linux26就是执行的内核版本号是2.6,x86_64指定架构为x86架构,注:如果是Centos7.2的版本就要:# make TARGET=linux31 ARCH=x86_64
# make install PREFIX=/usr/local/haproxy-1.7.8 #将程序安装到指定的位置,其实指定也没用,只是多放一个位置而已里面也没多少东西。
# ln -s /usr/local/haproxy-1.7.8 /usr/local/haproxy
# cp examples/haproxy.init /etc/init.d/haproxy
# chmod +x /etc/init.d/haproxy
# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
# haproxy -v
# haproxy -vv #可以查看详细信息,看看有什么问题没有
1.3 man帮助
# man haproxy
概要:
haproxy -f <configuration file|dir> [-L <name>] [-n maxconn] [-N maxconn] [-C <dir>] [-v|-vv] [-d] [-D] [-q] [-V] [-c] [-p <pidfile>] [-dk] [-ds] [-de] [-dp] [-db] [-dM[<byte>]] [-m <megs>] [{-sf|-st} pidlist...]
描述:
HAProxy是一种特别适合高可用性环境的TCP/HTTP反向代理。的确,它可以:
- 根据静态分配的Cookie路由HTTP请求; - 在确保服务器的同时,在多个服务器之间传播负载 - 通过使用HTTP cookies持久化; - 主机出现故障时切换到备份服务器; - 接受专用服务专用端口的连接 - 监测;详细的健康状态检测,web接口中有关于对上游服务器的健康检测状态,并提供了一定的管理功能; - 停止接受连接而不破坏现有的连接; - 两种方式添加/修改/删除HTTP头; - 匹配特定模式的块请求; - 根据客户端到正确的应用服务器 - 应用程式Cookie识别 - 将身份验证的用户的详细状态报告为HTML页面 - 从应用程序截取的URI。
选项:
-f <configuration file|dir> #指定配置文件或目录路径。 如果参数是一个目录,则它包含的文件(只有文件)以词法顺序添加(使用LC_COLLATE = C); 只有添加了“.cfg”扩展名的非隐藏文件。 -L <name> #设置本地实例的对等体名称。 -n <maxconn> #设置同时连接总数的上限。 -N <maxconn> #设置每个监听器同时连接数的上限。 -C <dir> #在加载任何文件之前,将目录更改为<dir>。 -v #显示haproxy的版本 -vv #显示HAProxy的版本和所有构建选项。 -d #在启用调试模式的前台启动。 当代理在此模式下运行时,它会将每个连接,断开连接,时间戳和HTTP头转储到stdout。 这不应该在初始化脚本中使用,因为它将阻止系统启动。 -D #以守护进程模式启动。 -Ds #在systemd守护进程模式下启动,将进程保持在前台。 -q #禁用输出消息。 -V #即使指定了-q或“quiet”,也会在输出上显示消息。 启动过程中会显示有关轮询器和配置文件的信息。 -c #只有在没有发现错误的情况下才会检查配置文件并退出代码0,如果发现语法错误,则退出代码1。 -p <pidfile> #请求进程以守护程序模式将其每个子项的代码写入该文件。 -dk #禁用使用kqueue。kqueue仅适用于BSD系统。 -ds #禁止使用speculativeepoll。epoll仅在Linux 2.6和某些定制的Linux 2.4系统上可用。 -de #禁止使用speculative epoll。epoll仅在Linux 2.6和某些定制的Linux 2.4系统上可用。 -dp #禁止使用epoll。epoll仅在Linux 2.6和某些定制的Linux 2.4系统上可用。 -dp #禁止使用poll。 可以使用选择select。 -db #禁用背景模式(停留在前台,有助于调试)。 -dM[<byte>] #使用给定的<byte>初始化所有分配的内存区域。 这样可以更容易地检测未初始化的内存访问造成的错误,而不用一次触摸所有分配的内存。 如果未指定<byte>,则默认为0x50(ASCII'P')。 -m <megs> #将内存使用限制强制为最大兆字节(兆字节)。 -sf <pidlist> #在启动后,在pidlist中发送FINISH信号给pid。收到此信号的进程将等待所有会话在退出之前完成。此选项必须最后指定,后跟任意数量的PID。 从技术上讲,SIGTTOU和SIGUSR1都被发送。 -st <pidlist> #在启动后,在pidlist中发送TERMINATE信号给pid。 收到该信号的过程将立即终止,关闭所有活动会话。 必须先指定此选项,然后再指定任意数量的PID。 从技术上讲,SIGTTOU和SIGTERM被发送。
信号(SIGNALS):
- SIGUSR1 #告知守护进程停止所有代理,并在所有会话关闭后退出。 它通常被称为“软停止”信号。 - SIGTTOU #告诉守护进程停止监听所有套接字。 由-sf和-st内部使用。 - SIGTTIN #告知守护程序在SIGTTOU之后重新监听所有套接字。热重新配置时出现问题时内部使用。 - SIGINT and SIGTERM #这两个信号都可以用来快速停止守护进程。 - SIGHUP #将所有代理和服务器的状态转储到日志中。 主要用于故障排除目的。 - SIGQUIT #转储关于stderr上的内存池的信息。 主要用于调试目的。 - SIGPIPE #在没有MSG_NOSIGNAL的系统上,该信号被截取和忽略。
更详细的,在安装包的下面:doc/configuration.txt #这个文件详细了记录了haproxy的配置
博文来自:www.51niux.com
二、 简单配置Haproxy和简单测试
2.1 配置haproxy并启动
# useradd haproxy -u 500 -s /sbin/nologin -M
# mkdir /etc/haproxy
# vim /etc/haproxy/haproxy.cfg
global #全局配置 log 127.0.0.1 local0 info #日志输出配置,所有日志都记录在本机,通过local0输出,日志级别是info。注意:info级的日志会打印 HAProxy 处理的每一条请求,会占用很大的磁盘空间,在生产环境中,建议将日志级别调整为notice。 log 127.0.0.1 local1 warning #将 warn 级(及以上)的日志推送到 rsyslog的local1 接口 chroot /usr/local/haproxy/data/haproxy user haproxy #运行用户 group haproxy #运行用户组 daemon #以后台形式运行haproxy nbproc 1 #设置进程数量 pidfile /usr/local/haproxy/var/run/haproxy.pid #haproxy进程PID文件 ulimit-n 819200 #ulimit的数量限制 maxconn 4000 #最大的连接数,需考虑ulimit-n限制,默认值是2000. defaults #默认配置 log global #所有 frontend 都默认使用 global 中的日志配置。 mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK option httplog #日志类别,采用httplog option dontlognull #不记录健康检查日志信息 option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 timeout connect 5000 #连接超时 timeout client 50000 #客户端超时 timeout server 50000 #服务器超时 listen admin_stats #统计页面配置 bind 0.0.0.0:1080 mode http option httplog maxconn 10 #默认的最大连接数 stats refresh 30s #统计页面自动刷新时间 stats uri /haproxy?stats #统计页面url stats realm Haproxy Manager #统计页面密码框上提示文本 stats auth admin:51niux.com #设置监控页面的用户和密码,可以设置多个用户名,就是多行的形式 stats hide-version #隐藏统计页面上HAProxy的版本信息 stats admin if TRUE #设置手工启动/禁用后端服务器 listen my_first_haproxy bind 0.0.0.0:80 mode http balance roundrobin #设置默认负载均衡方式,轮询方式 option httpclose #设置每次请求完毕后自动关闭http通道 option forwardfor #如果后端服务器需要获得客户端的真实ip,需要配置此参数,可以从http header中获取客户端的IP,或者写成这种形式option forwardfor header X-Forwarded-For cookie SERVERID insert indirect timeout server 15s timeout connect 15s server web01 172.17.1.12:80 check port 80 inter 5000 rise 3 fall 5 #这是检测80端口,检测频率是5000毫秒,检测3次正常就认为机器又可用了,失败5次认为此服务器就不可用了 server web02 172.17.1.13:80 check port 80 inter 5000 rise 3 fall 5 #我这两个后端服务器是不能出网的,可见haproxy走的是反向代理的形式,请求还会经过haproxy服务器转发给客户端。
# mkdir /usr/local/haproxy/data/haproxy -p
# chown haproxy:haproxy /usr/local/haproxy/data/haproxy
# /etc/init.d/haproxy start #如果启动有问题,# tail -f /var/log/messages 看看日志提示你什么。是配置那个地方写的有问题
#当然也能用这种启动方式:/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c
2.2 简单测试
访问status状态页:
访问url: http://192.168.1.36:1080/haproxy?stats
#输入账号admin,密码51niux.com
#从上图就是status状态页
测试反向代理效果:
访问url:http://192.168.1.36/1.txt
#在后端两个nginx服务器上面都写了一个1.txt,里面的内容是各自的IP,用来标识。
#用CTRL+F5强制刷新几次,看是否能实现页面的内容改变。
2.3 配置Haproxy的日志
安装完haproxy后,默认情况下,HAProxy为了节省读写IO所消耗的性能,默认情况下没有日志输出,如果在搭建之初想记录下日志的话,可以像下面这样搞。
配置/etc/rsyslog.conf:
$ModLoad imudp #注释去掉 $UDPServerRun 514 #注释去掉,在514端口监听UDP local0.* /var/log/haproxy.log ##local0接口对应的日志输出文件 local1.* /var/log/haproxy_warn.log #local1接口对应的日志输出文件
配置/etc/sysconfig/rsyslog修改rsyslog的启动参数:
# vim /etc/sysconfig/rsyslog #配置rsyslog的主配置文件,开启远程日志
SYSLOGD_OPTIONS="-c 2 -r -m 0" #-c 2 使用兼容模式,默认是-c 5; -r 开启远程日志; -m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能。
重启rsyslog并测试:
# service rsyslog restart
# tail -f /var/log/haproxy.log #日志产生了
Sep 25 15:55:18 localhost haproxy[6266]: Proxy admin_stats started. Sep 25 15:55:18 localhost haproxy[6266]: Proxy my_first_haproxy started. Sep 25 15:55:27 localhost haproxy[6267]: 192.168.2.127:52259 [25/Sep/2017:15:55:27.354] admin_stats admin_stats/<STATS> 0/0/0/0/0 200 19271 - - LR-- 3/3/0/0/0 0/0 "GET /haproxy?stats HTTP/1.1" Sep 25 15:55:27 localhost haproxy[6267]: 192.168.2.127:52259 [25/Sep/2017:15:55:27.496] admin_stats admin_stats/<STATS> 0/0/0/0/0 200 19391 - - LR-- 3/3/0/0/0 0/0 "GET /haproxy?stats HTTP/1.1"
#用 logrotate 进行日志切分就不记录了,因为一般也不会记录haproxy的日志信息,如果要记录记得做好日志切分。
博文来自:www.51niux.com
三、doc/configuration.txt文件里面的知识学习
3.1 快速提醒有关HTTP
当haproxy以HTTP模式运行时,请求和响应都是完全分析和索引,从而可以建立匹配标准几乎在内容中找到的东西。
HTTP事务模型
HTTP协议是事务驱动的。 这意味着每个请求都会导致只有一个回应。 传统上,建立了TCP连接从客户端到服务器,请求由客户端发送连接,服务器响应并且连接被关闭。一个新的请求将涉及一个新的连接,在这种模式下,称为“HTTP close”模式,连接数量一样多因为有HTTP事务。 由于连接关闭由服务器响应后,客户端不需要知道内容长度。
由于协议的交易性质,有可能改进以避免关闭两个后续事务之间的连接。 在这种模式下但是,服务器必须指出每个内容的长度响应,以便客户端不会无限期地等待。 为此,一个特别的头使用:“Content-length”。 此模式称为“keep-alive”模式,它的优点是减少了事务间的延迟,减少了处理服务器端所需的电源。 一般比关闭模式好,但并不总是因为客户端经常限制其并发连接一个较小的值
通信的最后一个改进是流水线模式。 它仍然使用保持keep-alive,但客户端不等待第一个响应发送第二个请求 这对于获取大量的构图图像非常有用。这显然对网络性能有很大的好处在后续请求之间消除延迟。 许多HTTP代理没有
正确支持流水线,因为无法将响应关联HTTP中的相应请求。 因此,这是强制性的服务器以与接收到的请求完全相同的顺序进行回复。
默认情况下,HAProxy关于持久性在keep-alive模式下运行连接:对于每个连接,它处理每个请求和响应,以及使连接在响应结束的两端之间空闲开始一个新的请求。
HAProxy支持5种连接方式:
keep alive #所有请求和响应都被处理(默认) tunnel #只有第一个请求和响应被处理,所有其他的都转发,没有分析。 passive close #隧道与“连接:关闭”双向增加 server close #响应后关闭面向服务器的连接。 forced close #连接在响应结束后主动关闭。
HTTP请求
请求例子:GET /serv/login.php?lang=en&profile=2 HTTP/1.1
URI本身可以有几种形式:
相对URL #如,/serv/login.php?lang=en&profile=2,它是一个没有主机部分的完整URL。 这通常是什么由服务器接收,反向代理和透明代理。 绝对URL #如,, 这通常是代理接收的,但是支持HTTP / 1.1的服务器也必须接受这个表格。 一个* #此表单只接受与选项相关联方法,不可中继。 它用于查询下一跳能力。 一个地址 #如,192.168.0.12:80,这与CONNECT方法一起使用,该方法用于通过HTTP代理建立TCP隧道,通常用于HTTPS,但有时也用于其他协议。
HTTP响应
HTTP响应看起来非常像HTTP请求。 两者都称为HTTP消息。
第1行是“响应行”。 它总是由3个字段组成:
- a version tag : HTTP/1.1 - a status code : 200 - a reason : OK
状态码始终为3位数。 第一位数字表示一般状态:
- 1xx =要跳过的信息消息(例如:100,101) - 2xx = OK,内容如下(例如:200,206) - 3xx = OK,没有内容跟随(例如:302,304) - 4xx =由客户端引起的错误(例如:401,403,404) - 5xx =服务器引起的错误(例如:500,502,503)
Haproxy本身可能会发出以下状态代码:
200 #访问统计页面 301 #执行重定向时 302 #执行重定向时 303 #执行重定向时 307 #执行重定向时 308 #执行重定向时 400 #是无效或太大的请求 401 #当需要进行身份验证(执行时)访问stats页面) 403 #当“块”ACL或“reqdeny”过滤器禁止请求时 408 #请求超时在请求完成之前触发当haproxy遇到不可恢复的内部错误,如内存分配失败,永远不会发生 502 #当服务器返回空,无效或不完整的响应时,或者当“rspdeny”过滤器阻止响应。 503 #没有服务器可用来处理请求或响应监视与“监视器故障”条件匹配的请求 504 #响应超时在服务器响应之前触发
#响应标头与请求标头完全一样,因此HAProxy使用两者的解析功能相同。
3.2 配置HAProxy
配置文件格式
HAProxy的配置过程涉及3个主要参数来源:
1.命令行的参数始终优先 2.global #“全局”部分,其设置过程范围的参数 3.defaults #可以采取"listen","frontend" and "backend"的代理部分。
引用和转义
HAProxy的配置引入了类似的引用和转义系统许多编程语言。 配置文件支持3种类型:转义反斜杠,双引号弱引号,强引用单引号。
通过反斜杠('\')前面的特殊字符来实现转义:
\ #标记一个空格并将其与分隔符区分开来 \# #标记一个哈希,并将其与注释区分开来 \\ #使用反斜杠 \' #使用单引号和区别于强引用 \“ #使用双引号,将其与弱引用区分开来
弱引号通过使用双引号("")来实现。弱引用阻止解释:
#空格作为参数分隔符 ' #单引号作为强引用分隔符 # #hash作为注释开始
环境变量
HAProxy的配置支持环境变量。 这些变量仅在双引号内解释。 在配置解析期间扩展变量。 变量名称前面必须有$和可选地用括号{}括起来,与Bourne shell中所做的一样。 变量名称可以包含字母数字字符或字符下划线(“_”),但不能以数字开头。
例:
bind "fd@${FD_APP1}" log "${LOCAL_SYSLOG}:514" local0 notice #发送到本地服务器 user "$HAPROXY_USER"
时间格式
一些参数涉及表示时间的值,例如超时。 这些值通常以毫秒表示(除非明确说明否则可以用任何其他单位来表示数值。 重要的是要考虑这一点,因为它不会重复为每个关键字 支持的单位有:
us #微秒,1微秒= 1/1000000秒 ms #毫秒,1毫秒= 1/1000秒。 这是默认值。 s #秒,1s=1000ms m #分钟,1m = 60s = 60000ms h #小时,1h = 60m = 3600s = 3600000ms d #天, 1d = 24h = 1440m = 86400s = 86400000ms
3.3 全局参数
“global”部分支持以下关键字:
流程管理和安全:
ca-base <dir> #分配一个默认目录以从相对路径与“ca-file”或“crl-file”指令一起使用时获取SSL CA证书和CRL。 以“ca-file”和“crl-file”中指定的绝对位置为准,忽略“ca-base”。 chroot <jail dir> #将当前目录更改为<jail dir>,并在删除权限之前执行chroot()。 这将增加安全级别,以防未知的漏洞被利用,因为这将使攻击者很难利用系统。 此过程仅在超级用户权限启动时才有效。 重要的是确保<jail_dir>是空的,不可写的任何人。 cpu-map <"all"|"odd"|"even"|process_num> <cpu-set>... #在Linux 2.6及更高版本上,可以将进程绑定到特定的CPU组。 这意味着该进程永远不会在其他CPU上运行。 “cpu-map”指令指定进程集的CPU集。 crt-base <dir> #分配一个默认目录以从相对路径与“crtfile”指令一起使用时获取SSL证书。 以“crtfile”为基准指定的绝对位置,忽略“crt-base”。 daemon #后台运行 deviceatlas-json-file <path> #设置要由API加载的DeviceAtlas JSON数据文件的路径。该路径必须是有效的JSON数据文件,并可由Haproxy进程访问。 deviceatlas-log-level <value> #设置API返回的信息级别。 此指令是可选的,如果未设置,则默认设置为0。 deviceatlas-separator <char> #设置API属性结果的字符分隔符。 此指令是可选的,设置为| 默认情况下如果没有设置。 deviceatlas-properties-cookie <name> #如果在请求期间使用了DeviceAtlas客户端组件,则设置用于检测的客户端cookie的名称。 此指令是可选的,如果未设置,则默认设置为DAPROPS。 external-check #允许使用外部代理来执行运行状况检查。默认情况下,这是一个安全防范措施。 gid <number> #将进程的组ID更改为<number>。 hard-stop-after <time> #定义允许执行清洁软停止的最长时间。time的单位是毫秒。 当通过接收到软停止时,实例将保持活动SIGUSR1信号。 group <group name> #以什么组运行程序 log <address> [len <length>] [format <format>] <facility> [max level [min level]] #添加全局syslog服务器。最多可以定义两个全局服务器。他们将收到启动和退出的日志以及代理的所有日志。 log-send-hostname [<string>] #设置syslog头中的主机名字段。 如果可选的“string”参数设置标题设置为字符串内容,否则使用主机名的系统。 通常使用,如果没有通过一个中继日志中间syslog服务器或简单地自定义打印的主机名日志。 log-tag <string> #将syslog头中的标记字段设置为此字符串。它默认为从命令行启动的程序名称,通常是“haproxy”。有时,区分多个进程可能是有用的运行在同一台主机上。 lua-load <file> #该全局伪指令加载并执行一个Lua文件。 这个指令可以多次使用 nbproc <number> #在守护进程时创建<number>进程。 这需要“守护进程”模式。 默认情况下,只创建一个进程,这是推荐的模式的操作。 pidfile <pidfile> #将所有守护程序的pid写入文件<pidfile>。 此选项相当于“-p”命令行参数。 presetenv <name> <value> #将环境变量<name>设置为值<value>。 如果变量存在的话没有被覆盖 更改立即生效,以便下一行在配置文件中看到新值。 resetenv [<name> ...] #删除除参数中指定的所有环境变量外的所有环境变量。 stats bind-process [ all | odd | even | <number 1-64>[-<number 1-64>] ] ... #将统计数据套接字限制为一组特定的进程数。 server-state-base <directory> #指定前面的所有服务器状态前面的目录前缀不以'/'开头的文件名。 server-state-file <file> #指定包含服务器状态的文件的路径。 如果路径开始用斜杠('/'),它被认为是绝对的,否则被考虑相对于使用“server-state-base”(如果设置)指定的目录当前目录。 setenv <name> <value> #将环境变量<name>设置为值<value>。 如果变量存在的话被覆盖 更改立即生效,以便下一行配置文件会看到新值。 ssl-default-bind-ciphers <ciphers> #此设置仅在内置OpenSSL的支持时可用描述密码算法列表的默认字符串(“密码套件”)这是在SSL/TLS握手期间为所有“绑定”行协商的不要明确定义它们。 ssl-default-bind-options [<option>]... #此设置仅在内置OpenSSL的支持时可用默认的ssl选项强制对所有的“绑定”行。 ssl-default-server-ciphers <ciphers> #此设置仅在支持OpenSSL时可用设置描述密码算法列表的默认字符串在与服务器的SSL/TLS握手期间协商。 ssl-default-server-options [<option>]... #此设置仅在内置OpenSSL的支持时可用在所有“服务器”行上强制使用默认的ssl-options。 ssl-dh-param-file <file> #此设置仅在内置OpenSSL的支持时可用在SSL/TLS握手期间使用的默认DH参数使用短暂的Diffie-Hellman(DHE)密钥交换 ssl-server-verify [none|required] #服务器端的SSL验证的默认行为。 如果指定为“none”,服务器证书未验证。 默认值为“required”,除非强制使用cmdline选项'-dV'。 stats socket [<address:port>|<path>] [param*] #将UNIX套接字绑定到<path>或TCPv4 / v6地址到<address:port>。与此socket的连接将返回各种统计信息输出,甚至返回允许发出一些命令来更改一些运行时设置。 stats timeout <timeout, in milliseconds> #stats socket上的默认超时设置为10秒。 有可能的使用“stats timeout”更改此值。 该值必须传入毫秒,或者由{us,ms,s,m,h,d}之间的时间单位后缀。 stats maxconn <connections> #默认情况下,stats套接字限制为10个并发连接。它是可以用“stats maxconn”来改变这个值。 uid <number> #将进程的用户ID更改为<number>。 ulimit-n <number> #将每个进程文件描述符的最大数目设置为<number>。 通过默认,它是自动计算的,所以建议不要使用它选项。 unix-bind [ prefix <prefix> ] [ mode <mode> ] [ user <user> ] [ uid <uid> ] [ group <group> ] [ gid <gid> ] #将通用设置修复为在“bind”语句中声明的UNIX侦听套接字。 unsetenv [<name> ...] #删除参数中指定的环境变量。 user <user name> #运行程序的用户名 node <name> #只允许使用字母,数字,连字符和下划线,就像DNS名称一样。此语句在HA配置中有用,其中两个或多个进程或服务器共享相同的IP地址。 description <text> #添加一个描述实例的文本。 51degrees-data-file <file path> #51Degrees数据文件的路径提供设备检测服务。该文件应该被解压缩并由HAProxy使用相关权限访问。 51degrees-property-name-list [<string> ...] #要从数据集加载的51Degrees属性名称的列表。 完整列表的名称可在51Degrees网站上获得: 51degrees-property-separator <char> #将追加到响应头中的每个属性值的char包含51Degrees结果。 如果未设置将被设置为','。 51degrees-cache-size <number> #将51Degrees转换器缓存的大小设置为<number>条目。 这个是提醒先前设备检测及其结果的LRU缓存。默认情况下,禁用此缓存。 wurfl-data-file <file path> #WURFL数据文件的路径提供设备检测服务。该文件应该由具有相关权限的HAProxy访问。请注意,此选项仅在编译haproxy时可用USE_WURFL = 1。 wurfl-information-list [<capability>]* #WURFL功能,虚拟功能,属性的空格分隔列表我们计划在注入头中使用的名称。 完整的功能列表和虚拟功能名称可在Scientiamobile网站上获得 wurfl-information-list-separator <char> #将用于在包含的响应标头中分隔值的charWURFL结果。 如果未设置,默认情况下将使用逗号(',')。 wurfl-patch-file [<file path>] #WURFL补丁文件路径列表。 请注意,修补程序在启动期间加载因此在chroot之前。 wurfl-engine-mode { accuracy | performance } #设置WURFL引擎目标。 wurfl-cache-size <U>[,<D>] #设置WURFL缓存策略。 这里<U>是Useragent缓存大小,内部设备缓存大小<D> 这里有三种可能性: - “0”:不使用缓存。- <U>:使用单个LRU缓存,大小以元素表示。 - <U>,<D>:使用Double LRU缓存,两种尺寸都在元素中。 这是性能最高的选项。 wurfl-useragent-priority { plain | sideloaded_browser } #告诉WURFL是否应优先使用普通用户代理('plain')通过默认的侧边浏览器用户代理('sideloaded_browser')。
性能调优:
max-spread-checks <delay in milliseconds> # 这个参数是用于强制第一次和最后一次检查之间的延迟上限,即使服务器的检查间隔较大。 maxconn <number> #将并发连接的最大每进程数设置为<number>。 它相当于命令行参数“-n”。 代理商将不再接受达到此限制的连接。“ulimit-n”参数是根据此值自动调整。 maxconnrate <number> #将每个进程的每个进程的最大连接数设置为<number>。当达到此限制时,代理将停止接受连接。 maxcomprate <number> #将每个进程的最大输入压缩率设置为<number>千字节每秒。 对于每个会话,如果达到最大值,则进行压缩水平将在会议期间减少。 如果达到最大值会话开始时,会话根本不会压缩。 如果最大没有达到,压缩水平将提高到最高tune.comp.maxlevel。 值为零意味着没有限制,这是默认值。 maxcompcpuusage <number> #设置HAProxy在停止压缩之前可以达到的最大CPU使用率用于新请求或降低当前请求的压缩级别。值100禁用限制。 默认值为100 maxpipes <number> #将每个管道的最大数量设置为<number>。 目前,管道仅用于基于内核的tcp拼接。 由于管道包含两个文件描述符,“ulimit-n”值将相应增加。 默认值是maxconn/4。 maxsessrate <number> #将每个进程的最大每秒会话数设置为<number>。当达到此限制时,代理将停止接受连接。 maxsslconn <number> #将并发SSL连接的最大每进程数设置为<数字>。默认情况下,没有SSL特定的限制,这意味着全局maxconn设置将适用于所有连接。设置此限制避免使用openssl使用太多的内存 maxsslrate <number> #将每秒SSL会话的最大每进程数设置为<number>。当达到此限制时,SSL侦听器将停止接受连接。 它可以用来限制全局SSL CPU使用率,而不管每个前端容量。 maxzlibmem <number> #设置zlib可用的每个进程的最大RAM容量(兆字节)。当达到最大数量时,未来的会话将不会压缩因为RAM不可用。 当设置为0时,没有限制。默认值为0.该值在UNIX套接字上以字节为单位 noepoll #禁用在Linux上使用“epoll”事件轮询系统。 它是相当于命令行参数“-de”。 nokqueue #禁用在BSD上使用“kqueue”事件轮询系统。 它是相当于命令行参数“-dk”。 nopoll #禁止使用“投票”事件轮询系统。 相当于命令行参数“-dp”。 所使用的下一个轮询系统将是“选择. nosplice #禁用在Linux上的套接字之间使用内核tcp拼接。 它是相当于命令行参数“-dS”。 nogetaddrinfo #禁用使用getaddrinfo进行名称解析。 相当于命令行参数“-dG”。 noreuseport #禁止使用SO_REUSEPORT相当于命令行参数“-dR”。 spread-checks <0..50, in percent> #有时避免发送代理和健康检查服务器的确切时间间隔,该默认值保持为0。 tune.buffers.limit <number> #设置每个进程可能分配的缓冲区数量的硬限制。默认值为零,这意味着无限制。 tune.buffers.reserve <number> #设置预先分配并保留供仅供使用的缓冲区数在内存不足的情况下导致内存分配失败。该最小值为2,也是默认值。 tune.bufsize <number> #将缓冲区大小设置为此大小(以字节为单位)。 较低的值允许更多会话共存在相同数量的RAM中,更高的值允许一些应用程序使用非常大的Cookie工作。 默认值为16384和可以在构建时更改。 tune.chksize <number> #将检查缓冲区大小设置为此大小(以字节为单位)。 更高的价值可能有所帮助在非常大的页面中查找字符串或正则表达式模式,但这样做可能意味着更多的内存和CPU使用率。 默认值为16384 tune.comp.maxlevel <number> #设置最大压缩级别。 压缩级别影响CPU压缩期间的使用。 此值会影响压缩期间的CPU使用率。每个使用压缩的会话使用压缩算法初始化这个值。 默认值为1。 tune.http.cookielen <number> #设置捕获的Cookie的最大长度。 tune.http.maxhdr <number> #设置请求中的最大标头数。默认为101. tune.idletimer <timeout> #设置haproxy将认为空缓冲区的持续时间可能与空闲流相关联。默认为1000 tune.lua.forced-yield <number> #该指令强制Lua引擎执行每个<number>的收益执行指令 这允许中断长脚本并允许HAProxy调度程序来处理其他任务 tune.lua.maxmem #设置Lua可用的每个进程的最大RAM容量(兆字节)。 通过默认为零,这意味着无限制。设置限制很重要确保脚本中的错误不会导致系统耗尽记忆。 tune.lua.session-timeout <timeout> #这是Lua会话的执行超时。 这对于防止无限循环或花费太多时间在Lua。默认超时时间是4s。 tune.lua.task-timeout <timeout> #目的与“tune.lua.session-timeout”相同,但是这个超时是致力于任务。 tune.lua.service-timeout <timeout> #这是Lua服务的执行超时。 默认是4秒 tune.maxaccept <number> #设置进程在切换到其他工作之前在一行中可以接受的连续连接的最大数量。该值默认为64. tune.maxpollevents <number> #设置在调用轮询系统时可以一次处理的最大事件量。 tune.maxrewrite <number> #将保留的缓冲区空间设置为此字节大小。 保留空间用于标题重写或附加。 插槽上的第一次读取将不会超过bufsize-maxrewrite。 tune.pattern.cache-size <number> #将模式查找缓存的大小设置为<number>条目。这是一个提醒先前查找及其结果的LRU缓存。 tune.pipesize <number> #将内核管道缓冲区大小设置为此大小(以字节为单位)。 默认情况下,管道是系统的默认大小。 tune.rcvbuf.client <number> tune.rcvbuf.server <number> #强制客户端或服务器端的内核套接字接收缓冲区大小为指定值(以字节为单位)。此值适用于所有TCP/HTTP前端和后端。通常不会设置,默认大小(0)允许内核根据可用内存量自动调整该值。 tune.ssl.cachesize <number> #在多个块中设置全局SSL会话高速缓存的大小。 tune.ssl.force-private-cache #此布尔值禁用所有进程之间的SSL会话缓存共享。 通常不会使用它,因为客户打入随机过程会导致许多重新协商。 tune.ssl.lifetime <timeout> #设置缓存的SSL会话可能保持有效的时间。此时间以秒为单位,默认为300(5分钟)。 tune.ssl.maxrecord <number> #设置一次传递到SSL_write()的最大字节数。 默认值0表示没有限制。 通过SSL/TLS,一旦收到完整记录,客户端就可以对数据进行解密。 tune.ssl.default-dh-param <number> #设置在DHE密钥交换的情况下用于生成临时/临时Diffie-Hellman密钥的Diffie-Hellman参数的最大大小。默认为1024. tune.ssl.ssl-ctx-cache-size <number> #将用于存储生成的证书的缓存的大小设置为<number>条目。 这是一个LRU缓存。默认缓存大小设置为1000个条目。 tune.vars.global-max-size <size> tune.vars.proc-max-size <size> tune.vars.reqres-max-size <size> tune.vars.sess-max-size <size> tune.vars.txn-max-size <size> #管理变量系统使用的最大内存量。“global”限制了所有范围的可用内存总量。“proc”限制进程范围的内存,“sess”限制会话范围的内存,为事务范围限制“txn”,“reqres”限制每个请求或响应处理的内存。 tune.zlib.memlevel <number> #在每个会话的zlib初始化中设置memLevel参数。 它定义为内部压缩状态分配多少内存。 值为1使用最小内存,但缓慢并降低压缩比,9值使用最大内存以达到最佳速度。 可以是1到9之间的值。默认值为8。 tune.zlib.windowsize <number> #(历史缓冲区的大小)设置为每个会话的zlib初始化参数。 此参数的较大值会导致更好的压缩,而牺牲内存使用率。 可以是8到15之间的值。默认值为15。
调试:
debug #启用调试模式, 它相当于命令行参数“-d”。 它不应该在生产配置中使用,因为它可能会阻止完整系统启动。 quiet #启动期间不显示任何消息。 它相当于命令行参数“-q”。
用户列表:
可以控制对前端/后端/监听部分的访问http统计信息只允许经过身份验证和授权的用户。 为此,需要创建至少一个用户列表并定义用户。
userlist <listname> #创建名为<listname>的新用户列表。 许多独立的用户列表可以用于存储独立客户的认证和授权数据。 group <groupname> [users <user>,<user>,(...)] #将组<groupname>添加到当前用户列表。 也可以通过使用以“users”关键字进行的名称的逗号分隔列表将用户附加到此组。 user <username> [password|insecure-password <password>] [groups <group>,<group>,(...)] #将用户<username>添加到当前用户列表。 可以使用安全(加密)和不安全(未加密)密码。使用crypt函数对加密密码进行评估,这取决于系统的功能,支持不同的算法。
Peers:
可以以多主机方式通过TCP连接在几个haproxy实例之间的条形表中传播任何数据类型的条目。
peers <peersect> #创建一个名为<peersect>的新对等体列表。 disabled #禁用对等部分。 enable #这将重新启用先前禁用的禁用对等节。 peer <peername> <ip>:<port> #定义对等部分中的对等体。
Mailers:
当服务器状态发生变化时,可以发送电子邮件警报。如果配置的电子邮件警报发送到配置的每个邮件程序在邮件部分。 使用SMTP将电子邮件发送给邮件服务器。
mailers <mailersect> #创建一个名为<mailersect>的新邮件列表。 它是由一个或多个代理引用的独立部分。 mailer <mailername> <ip>:<port> #在邮件区段内定义邮件程序。 timeout mail <time> #定义可用于发送邮件/连接的时间并发送到邮件服务器。如果未定义,默认值为10秒。为了允许在初始TCP握手期间发送至少两个SYN-ACK数据包,建议将此值保持在4秒以上。 例子: mailers mymailers timeout mail 20s mailer smtp1 192.168.0.1:587
3.4 代理设置
代理配置可以位于一组部分中:
- defaults [<name>] - frontend <name> - backend <name> - listen <name> “defaults”部分设置以下所有其他部分的默认参数其声明这些默认参数由下一个“默认值”重置部分。 “frontend”部分描述了一组接受客户端的侦听套接字连接。 “backend”部分描述代理将要连接的一组服务器转发传入连接。 “listen”部分定义了一个完整的代理,其前端和后端部分组合在一个部分。它对于仅TCP流量通常是有用的。 ACL名称是区分大小写,这意味着“www”和“WWW”是两种不同的代理。
现在,支持两种主要的代理模式:“tcp”,也称为第4层,“http”也称为第7层。在第4层模式下,HAProxy简单地在双方之间转发双向流量。 在第7层模式下,HAProxy分析协议,并可以通过允许,阻止,切换,添加,修改或删除请求或响应中的任意内容,基于任意条件与之进行交互。
Proxy keywords matrix:
按字母排序的关键字:
acl <aclname> <criterion> [flags] [operator] <value> ... #声明或完成访问列表。 appsession <cookie> len <length> timeout <holdtime> [request-learn] [prefix] [mode <path-parameters|query-string>] #定义现有应用程序cookie上的会话粘性。 backlog <conns> # 为了防止SYN Flood攻击,一个解决方案是增加系统的SYN积压大小。 balance <algorithm> [ <arguments> ] #定义后端使用的负载均衡算法。参数:<algorithm>是用于在进行负载平衡时选择服务器的算法。 balance url_param <param> [check_post] #<arguments>是一些可选参数,可能需要一些算法。现在只有“url_param”和“uri”支持可选参数。当没有设置其他算法,模式和选项时,后端的负载均衡算法设置为roundrobin。 该算法只能为每个后端设置一次。 bind [<address>]:<port_range> [, ...] [param*] bind /<path> [, ...] [param*] #在前端定义一个或多个监听地址和/或端口。 bind-process [ all | odd | even | <number 1-64>[-<number 1-64>] ] #将实例的可见性限制为某组进程号。 capture cookie <name> len <length> #在请求和响应中捕获并记录一个cookie。 capture request header <name> len <length> #捕获并记录指定的请求头的最后一次发生。 capture response header <name> len <length> #捕获并记录指定响应头的最后一次。 clitimeout <timeout> (deprecated) #在客户端设置最大不活动时间。 compression algo <algorithm> ... #algo之后是支持的压缩算法列表。 compression type <mime type> ... #type后面是要压缩的MIME类型的列表。 compression offload #卸载使得haproxy仅作为压缩卸载器工作,这三句话是启动HTTP压缩 contimeout <timeout> (deprecated) #设置等待连接尝试服务器成功的最长时间。 cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ] #在后台启用基于Cookie的持久性。 declare capture [ request | response ] len <length> # default-server [param*] #更改后台服务器的默认选项 default_backend <backend> #指定没有匹配“use_backend”规则时要使用的后端。 description <string> #描述 disabled #禁用代理,前端或后端。 dispatch <address>:<port> #设置默认服务器地址 enabled #启用代理,前端或后端。 errorfile <code> <file> #返回文件内容,而不是由HAProxy生成的错误 errorloc <code> <url> #将HTTP重定向返回到URL,而不是由HAProxy生成的错误 errorloc302 <code> <url> errorloc303 <code> <url> email-alert from <emailaddr> #声明从电子邮件地址在电子邮件警报的信封和标题中使用。 这是发送电子邮件警报的地址。 email-alert level <level> #声明将发送电子邮件警报的消息的最大日志级别。 这作为发送电子邮件警报的过滤器。 email-alert mailers <mailersect> #声明在发送电子邮件警报时使用的邮件程序 email-alert myhostname <hostname> #声明在与邮寄员通信时要使用的主机名地址。 email-alert to <emailaddr> #在信封中声明收件人地址,并在电子邮件提醒的标题中进行处理。 这是发送电子邮件警报的地址。 force-persist { if | unless } <condition> #当满足“if”条件时,或者除非符合“除非”条件,否则强制持久性被启用。 filter <name> [param*] #在附加到代理的过滤器列表中添加过滤器<name>。 fullconn <conns> #指定的后端负载服务器的minconn最小连接,和maxconn最大连接 grace <time> #在软停止后,维持一段时间的代理操作 hash-balance-factor <factor> #指定一致性散列hash负载,将<factor>设置为0(默认值)将禁用此功能。 hash-type <method> <function> <modifier> #指定用于将哈希映射到服务器的方法 http-check disable-on-404 #在HTTP/404响应健康检查时启用维护模式 http-check expect [!] <match> <pattern> #使HTTP健康检查考虑回应内容或特定状态代码 http-check send-state #启用使用HTTP健康检查发送状态标题 http-request { allow | tarpit | auth [realm <realm>] | redirect <rule> | deny [deny_status <status>] | add-header <name> <fmt> | set-header <name> <fmt> | capture <sample> [ len <length> | id <id> ] | del-header <name> | set-nice <nice> | set-log-level <level> | replace-header <name> <match-regex> <replace-fmt> | replace-value <name> <match-regex> <replace-fmt> | set-method <fmt> | set-path <fmt> | set-query <fmt> | set-uri <fmt> | set-tos <tos> | set-mark <mark> | add-acl(<file name>) <key fmt> | del-acl(<file name>) <key fmt> | del-map(<file name>) <key fmt> | set-map(<file name>) <key fmt> <value fmt> | set-var(<var name>) <expr> | unset-var(<var name>) | { track-sc0 | track-sc1 | track-sc2 } <key> [table <table>] | sc-inc-gpc0(<sc-id>) | sc-set-gpt0(<sc-id>) <int> | silent-drop | } [ { if | unless } <condition> ] #第7层请求的访问控制 http-response { allow | deny | add-header <name> <fmt> | set-nice <nice> | capture <sample> id <id> | redirect <rule> | set-header <name> <fmt> | del-header <name> | replace-header <name> <regex-match> <replace-fmt> | replace-value <name> <regex-match> <replace-fmt> | set-status <status> [reason <str>] | set-log-level <level> | set-mark <mark> | set-tos <tos> | add-acl(<file name>) <key fmt> | del-acl(<file name>) <key fmt> | del-map(<file name>) <key fmt> | set-map(<file name>) <key fmt> <value fmt> | set-var(<var-name>) <expr> | unset-var(<var-name>) | { track-sc0 | track-sc1 | track-sc2 } <key> [table <table>] | sc-inc-gpc0(<sc-id>) | sc-set-gpt0(<sc-id>) <int> | silent-drop | } [ { if | unless } <condition> ] #第7层响应的访问控制 http-reuse { never | safe | aggressive | always } #声明请求之间可以共享闲置的HTTP连接 http-send-name-header [<header>] #将服务器名称添加到请求。使用由<header>给出的标题字符串 ignore-persist { if | unless } <condition> #声明忽略持久性的条件 load-server-state-from-file { global | local | none } #允许无缝重新加载HAProxy log global log <address> [len <length>] <facility> [<level> [<minlevel>]] #启用事件和流量的每个实例记录。 no log log-format <string> #指定用于流量日志的日志格式字符串 log-format-sd <string> #指定RFC5424结构化数据日志格式字符串 log-tag <string> #指定要用于所有传出日志的日志标记 max-keep-alive-queue <value> #设置维护保持连接的最大服务器队列大小 maxconn <conns> #设置最大的连接数,默认是2000 mode { tcp|http|health } #设置实例的运行模式或协议,tcp模式,http模式,health健康模式 monitor fail { if | unless } <condition> #添加条件以报告监视器HTTP请求的失败。 monitor-net <source> #声明一个限于监视请求的源网络 monitor-uri <uri> #拦截外部组件的监视请求使用的URI option abortonclose no option abortonclose #启用或禁用在队列中提前挂起中止请求。 option accept-invalid-http-request no option accept-invalid-http-request #启用或禁用轻松解析HTTP请求 option accept-invalid-http-response no option accept-invalid-http-response #启用或禁用缓解HTTP响应解析 option allbackups no option allbackups #一次使用所有备份服务器,或仅使用第一个备份服务器 option checkcache no option checkcache #分析所有服务器响应,并使用可缓存的Cookie阻止响应 option clitcpka no option clitcpka #启用或禁用在客户端发送TCP Keepalive报文 option contstats #启用连续流量统计更新 option dontlog-normal no option dontlog-normal #启用或禁用日志记录正常,成功的连接 option dontlognull no option dontlognull #启用或禁用日志记录的空连接 option forceclose no option forceclose #响应传输后启用或禁用活动连接关闭。 option forwardfor [ except <network> ] [ header <name> ] [ if-none ] #允许将X-Forwarded-For头插入发送到服务器的请求 option http-buffer-request no option http-buffer-request #启用或禁用等待整个HTTP请求正文,然后继续 option http-ignore-probes no option http-ignore-probes #启用或禁用日志记录的空连接和请求超时 option http-keep-alive no option http-keep-alive #启用或禁用从客户端到服务器的HTTP保持活动 option http-no-delay no option http-no-delay #指示系统支持HTTP中的低性能交互延迟 option http-pretend-keepalive no option http-pretend-keepalive #定义haproxy是否会向服务器通告keepalive option http-server-close no option http-server-close #在服务器端启用或禁用HTTP连接 option http-tunnel no option http-tunnel #禁用或启用第一次请求后的HTTP连接处理 option http-use-proxy-header no option http-use-proxy-header #使用非标准代理连接头代替连接 option httpchk option httpchk <uri> option httpchk <method> <uri> option httpchk <method> <uri> <version> #启用HTTP协议检查服务器的运行状况 option httpclose no option httpclose #启用或禁用被动HTTP连接关闭 option httplog [ clf ] #启用HTTP请求记录,会话状态和计时器 option http_proxy no option http_proxy #启用或禁用普通HTTP代理模式 option independent-streams no option independent-streams #启用或禁用两个方向的独立超时处理 option ldap-check #使用LDAPv3运行状况检查进行服务器测试 option external-check #使用外部进程进行服务器健康检查 option log-health-checks no option log-health-checks #启用或禁用日志记录健康检查状态更新 option log-separate-errors no option log-separate-errors #为非完全成功的连接更改日志级别 option logasap no option logasap #启用或禁用HTTP请求的早期记录 option mysql-check [ user <username> [ post-41 ] ] #使用MySQL健康检查进行服务器测试 option nolinger no option nolinger #关闭后启用或禁用即时会话资源清理 option originalto [ except <network> ] [ header <name> ] #启用将X-Original-To标头插入发送到服务器的请求 option persist no option persist #在下载服务器上启用或禁用强制持久性 option pgsql-check [ user <username> ] #使用PostgreSQL运行状况检查进行服务器测试 option prefer-last-server no option prefer-last-server #允许多个负载均衡请求保留在同一台服务器上 option redispatch option redispatch <interval> no option redispatch #在连接失败的情况下启用或禁用会话重新分配 option redis-check #使用redis健康检查进行服务器测试 option smtpchk option smtpchk <hello> <domain> #使用SMTP健康检查进行服务器测试 option socket-stats no option socket-stats #启用或禁用为每个套接字收集和提供单独的统计信息。 option splice-auto no option splice-auto #在两个方向上启用或禁用套接字上的自动内核加速 option splice-request no option splice-request #启用或禁用套接字上的自动内核加速请求 option splice-response no option splice-response #在套接字上启用或禁用自动内核加速以进行响应 option spop-check #使用SPOP健康检查进行服务器测试 option srvtcpka no option srvtcpka #启用或禁用在服务器端发送TCP Keepalive报文 option ssl-hello-chk #使用SSLv3客户端hello运行状况检查进行服务器测试 option tcp-check #使用tcp-check send/expect序列进行健康检查 option tcp-smart-accept no option tcp-smart-accept #在接受序列期间启用或禁用一个ACK数据包的保存 option tcp-smart-connect no option tcp-smart-connect #在连接序列期间启用或禁用一个ACK数据包的保存 option tcpka #启用或禁用双方发送TCP Keepalive报文 option tcplog #启用具有会话状态和定时器的TCP连接的高级日志记录 option transparent no option transparent #启用客户端透明代理 external-check command <command> #执行外部检查时可执行 persist rdp-cookie persist rdp-cookie(<name>) #启用基于RDP的基于cookie的持久性 rate-limit sessions <rate> #对前端每秒接受的新会话数设置限制 redisp (deprecated) redispatch (deprecated) #在连接失败的情况下启用或禁用会话重新分配 reqadd <string> [{if | unless} <cond>] #在HTTP请求的末尾添加一个标题 reqallow <search> [{if | unless} <cond>] reqiallow <search> [{if | unless} <cond>] (ignore case) #如果行匹配正则表达式,则绝对允许HTTP请求 reqdel <search> [{if | unless} <cond>] reqidel <search> [{if | unless} <cond>] (ignore case) #删除与HTTP请求中的正则表达式匹配的所有头 reqdeny <search> [{if | unless} <cond>] reqideny <search> [{if | unless} <cond>] (ignore case) #如果行匹配正则表达式,则拒绝HTTP请求 reqpass <search> [{if | unless} <cond>] reqipass <search> [{if | unless} <cond>] (ignore case) #忽略在下一个规则中匹配正则表达式的任何HTTP请求行 reqrep <search> <string> [{if | unless} <cond>] reqirep <search> <string> [{if | unless} <cond>] (ignore case) #用HTTP请求行中的字符串替换正则表达式 reqtarpit <search> [{if | unless} <cond>] reqitarpit <search> [{if | unless} <cond>] (ignore case) #阻止包含与正则表达式匹配的行的HTTP请求 retries <value> #设置在连接失败后在服务器上执行的重试次数 rspadd <string> [{if | unless} <cond>] #在HTTP响应结束时添加一个标题 rspdel <search> [{if | unless} <cond>] rspidel <search> [{if | unless} <cond>] (ignore case) #删除与HTTP响应中的正则表达式匹配的所有头 rspdeny <search> [{if | unless} <cond>] rspideny <search> [{if | unless} <cond>] (ignore case) #如果行与正则表达式匹配,则阻止HTTP响应 rsprep <search> <string> [{if | unless} <cond>] rspirep <search> <string> [{if | unless} <cond>] (ignore case) #用HTTP响应行中的字符串替换正则表达式 server <name> <address>[:[port]] [param*] #在后端声明服务器 server-state-file-name [<file>] #将服务器状态文件设置为读取,加载并应用于可用的服务器这个后端。 source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | hdr_ip(<hdr>[,<occ>]) } ] source <addr>[:<port>] [interface <name>] #设置传出连接的源地址 srvtimeout <timeout> (deprecated) #在服务器端设置最大不活动时间。 stats admin { if | unless } <cond> #如果/除非条件匹配,则启用统计信息管理级别 stats auth <user>:<passwd> #通过验证启用统计信息,并授予对帐户的访问权限 stats enable #启用默认设置的统计报告 stats hide-version #启用统计信息并隐藏HAProxy版本报告 stats http-request { allow | deny | auth [realm <realm>] } [ { if | unless } <condition> ] #统计访问控制 stats realm <realm> #启用统计和设置认证领域 stats refresh <delay> # 启用自动刷新的统计信息 stats scope { <name> | "." } #启用统计信息并限制访问范围 stats show-desc [ <desc> ] #启用统计信息页面上的描述报告。 stats show-legends #启用在统计信息页面上报告其他信息 stats show-node [ <name> ] #启用在统计页面上报告主机名。 stats uri <prefix> #启用统计信息并定义URI前缀以访问它们 stick match <pattern> [table <table>] [{if | unless} <cond>] #定义请求模式匹配条件以将用户粘贴到服务器 stick on <pattern> [table <table>] [{if | unless} <condition>] #定义请求模式以将用户与服务器相关联 stick store-request <pattern> [table <table>] [{if | unless} <condition>] #定义用于在粘性表中创建条目的请求模式 stick-table type {ip | integer | string [len <length>] | binary [len <length>]} size <size> [expire <expire>] [nopurge] [peers <peersect>] [store <data_type>]* #配置当前部分的粘性表 stick store-response <pattern> [table <table>] [{if | unless} <condition>] #定义用于在粘性表中创建条目的响应模式 tcp-check connect [params*] #在tcp检查规则集中,需要“连接”启动时也是必须的具有“连接”规则的规则集目的是确保管理员知道在做什么 tcp-check expect [!] <match> <pattern> #在通用健康检查期间指定要收集和分析的数据 tcp-check send <data> #在通用运行状况检查期间指定要作为问题发送的字符串 tcp-check send-binary <hexastring> #在原始tcp运行状况检查期间,指定要作为二进制问题发送的十六进制数字字符串 tcp-request connection <action> [{if | unless} <condition>] #根据第4层条件对传入连接执行操作 tcp-request content <action> [{if | unless} <condition>] #根据第4-7层条件对新会话执行操作 tcp-request inspect-delay <timeout> #在内容检查期间设置等待数据的最长允许时间 tcp-response content <action> [{if | unless} <condition>] #根据第4-7层条件对会话响应执行操作 tcp-request session <action> [{if | unless} <condition>] #根据第5层条件对已验证的会话执行操作 tcp-response inspect-delay <timeout> #在内容检查期间设置等待响应的最长允许时间 timeout check <timeout> #设置其他检查超时,但只有在建立连接之后。 timeout client <timeout> timeout clitimeout <timeout> (deprecated) #在客户端设置最大不活动时间。 timeout client-fin <timeout> #在客户端设置不活动超时以进行半封闭连接。 timeout connect <timeout> timeout contimeout <timeout> (deprecated) #设置等待连接尝试服务器成功的最长时间。 timeout http-keep-alive <timeout> #设置等待新的HTTP请求出现的最长允许时间 timeout http-request <timeout> #设置等待完整HTTP请求的最长允许时间 timeout queue <timeout> #设置队列中等待连接插槽空闲的最长时间 timeout server <timeout> timeout srvtimeout <timeout> (deprecated) #在服务器端设置最大不活动时间。 timeout server-fin <timeout> #在服务器端设置不活动超时以进行半封闭连接。 timeout tarpit <timeout> #设置保持加密连接的持续时间 timeout tunnel <timeout> #在客户端和服务器端为隧道设置最大不活动时间。 transparent (deprecated) #启用客户端透明代理 unique-id-format <string> #为每个请求生成唯一的ID。 unique-id-header <name> #在HTTP请求中添加唯一的ID标头。 use_backend <backend> [{if | unless} <condition>] #如果/除非基于ACL的条件匹配,请切换到特定的后端。 use-server <server> if <condition> use-server <server> unless <condition> #如果/除非基于ACL的条件匹配,则仅使用特定的服务器。
负载均衡的算法:
roundrobin #动态加权轮询算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机;
static-rr #静态轮询算法,不支持权重的运行时调整和慢启动机制,但后端主机数量无限制;
leastconn #连接数量最少的服务器接收连接。推荐在较长时间会话的场景中使用,例如:LDAP/MYSQL等协议;
first #根据服务器在列表中的位置,自上而下进行调度;前面服务器连接数达到上限,新请求将调度至下一个服务器;适用于会话较长的tcp连接;
source #源地址hash,默认情况下,该算法是静态的,这意味着即时更改服务器的权重将不起作用,但可以使用“hash-type”进行更改。
uri #对uri的左半部分或整个uri做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;作用是能够将对同一个uri的请求始终发往一个后端主机;适用于后端为缓存服务器的场景;
url_param #对用户请求的uri中的<params>中的参数的值做hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;此算法常用来追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个后端主机;
hdr(<name>) #对于每个http请求,此处由<name>指定的http首部会被取出;如果此首部没有有效值,则轮询调度;否则,对其值进行hash计算,并与服务器的总权重相除后派发至某挑选出的后端主机;
rdp-cookie(<name>) #将是查找和散列每个传入的TCP请求。 就像与等效的ACL'req_rdp_cookie()'函数,名称不区分大小写。 这种机制是有用的降解持久化模式,因为它可以始终发送相同的用户(或相同的会话ID)到相同的服务器。
3.5 绑定和服务器选项
The "bind", "server" and "default-server" 关键字支持多个设置取决于一些构建选项,而在系统上构建了HAProxy。 这些设置通常每个都包含一个字,后面是一个值,写在与“绑定”或“服务器”行相同的行上。
绑定选项:
accept-netscaler-cip <magic number> #该NetScaler客户端IP插入协议规定了第3/4层地址传入连接将被使用到任何地方使用,与只有“tcp-request连接”规则的例外才会看到实际连接地址。 accept-proxy #通过任何接受的任何连接执行PROXY协议的使用在同一行上声明的套接字。 PROXY协议的版本1和2被支持并被正确检测。 alpn <protocols> #这使得TLS ALPN扩展和通告指定的协议列表在ALPN顶部支持。 backlog <backlog> #将套接字的积压设置为此值。如果未指定,则使用前端的积压文件,通常默认为maxconn值。 ecdhe <named curve> #此设置仅在内置OpenSSL支持时可用。它设置用于生成ECDH临时密钥的命名曲线(RFC 4492)。 默认情况下,使用命名曲线为prime256v1。 ca-file <cafile> #此设置仅在内置OpenSSL的支持时可用。它指定一个PEM文件,从中加载用于验证客户端证书的CA证书。 ca-ignore-err [all|<errorID>,...] #此设置仅在内置OpenSSL支持时可用。在深度> 0的验证期间,将错误ID的逗号分隔列表设置为忽略。如果设置为“全部”,则忽略所有错误。 如果忽略错误,SSL握手不会中止。 ca-sign-file <cafile> #此设置仅在内置OpenSSL支持时可用。它指定一个包含用于创建和签署服务器证书的CA证书和CA私钥的PEM文件。 当启用证书的动态生成时,这是一个强制性设置。 ca-sign-pass <passphrase> #此设置仅在内置OpenSSL支持时可用。它是CA私钥密码。 此设置是可选的,仅在启用证书的动态生成时使用。 ciphers <ciphers> #此设置仅在内置OpenSSL支持时可用。它设置描述在SSL / TLS握手期间协商的密码算法列表(“密码套件”)的字符串。 crl-file <crlfile> #此设置仅在内置OpenSSL支持时可用。它指定一个PEM文件,从中加载用于验证客户端证书的证书吊销列表。 crt <cert> #此设置仅在支持OpenSSL时可用指定一个包含所需证书和任何证书的PEM文件关联的私钥。 crt-ignore-err <errors> #此设置仅在支持OpenSSL时可用。在深度== 0的验证期间,将错误ID的逗号分隔列表设置为忽略。如果设置为“all”,则会忽略所有错误。 如果忽略错误,SSL握手不会中止。 crt-list <file> #此设置仅在支持OpenSSL时可用指定一个PEM文件列表,其中列出了SNI过滤器的可选列表证书 defer-accept #是一个可选关键字,仅在某些Linux内核上受支持。 它声明一旦连接只有在数据到达之后才能被接受这只能用于协议客户端首先会话(例如:HTTP)。 它可以稍微改善通过确保大多数请求已经可用的性能连接被接受。 force-sslv3 #此选项强制仅对实例化的SSL连接使用SSLv3这个监听。 SSLv3通常比TLS对等体高连接率。 此选项也可用于全局语句“ssl-default-bind-options”。 force-tlsv10 #此选项强制使用TLSv1.0仅在实例化的SSL连接上使用这个监听。 此选项也可用于全局语句"ssl-default-bind-options". force-tlsv11 #同上 force-tlsv12 #同上 generate-certificates #此设置仅在支持OpenSSL时可用启用生成动态SSL证书。 gid <gid> #将UNIX套接字的组设置为指定的系统gid。 group <group> #将UNIX套接字的组设置为指定的系统组。 id <id> #将UNIX套接字的组设置为指定的系统uid interface <interface> #将套接字限制到特定接口。 level <level> #此设置仅与统计信息套接字一起使用,以限制可在套接字上发出的命令的性质。 其他套接字被忽略。user比较低,默认是operator,admin级别慎用。 maxconn <maxconn> #将套接字限制为此并发连接数。 mode <mode> #设置用于在UNIX套接字上定义访问权限的八进制模式。 mss <maxseg> #设置要在传入连接上通告的TCP最大段大小(MSS)值。 这可以用于强制某些特定端口的较低MSS,例如通过VPN的连接。 name <name> #为这些套接字设置可选名称,这些名称将在统计信息页面上报告。 namespace <name> #在Linux上,可以指定套接字属于哪个网络命名空间。 该指令使得可以将侦听器显式地绑定到与默认命名空间不同的命名空间。 nice <nice> #设置从套接口发起的连接的“微妙”。是范围为-1024-1024,默认为零。 正值意味着这种连接对他人更友好,容易提供他们在调度程序中的位置。相反,负值意味着连接想要以比别人更高的优先级运行。 no-sslv3 #此设置仅在内置OpenSSL支持时可用。在支持SSL时,将禁用对从侦听器实例化的任何套接字上的SSLv3的支持。 请注意,SSLv2在代码中被强制禁用,无法使用任何配置选项启用。 no-tls-tickets #此设置仅在内置OpenSSL支持时可用。禁用无状态会话恢复(RFC 5077 TLS Ticket扩展),并强制使用状态会话恢复。 no-tlsv10 #此设置仅在支持OpenSSL时可用。当支持SSL时,禁用对从侦听器实例化的任何套接字上的TLSv1.0的支持。 no-tlsv11 #此设置仅在内置OpenSSL的支持时可用。在支持SSL时,禁用对从侦听器实例化的任何套接字上的TLSv1.1的支持。 no-tlsv12 #此设置仅在内置OpenSSL的支持时可用。当支持SSL时,禁用对从侦听器实例化的任何套接字上的TLSv1.2的支持。 npn <protocols> #这样可以实现NPN TLS扩展,并且在NPN顶部支持指定的协议列表。 协议列表由逗号分隔的协议名称列表组成。这要求SSL库的构建支持启用TLS扩展(使用haproxy -vv进行检查)。请注意,NPN扩展名已被替换为ALPN扩展名 process [ all | odd | even | <number 1-64>[-<number 1-64>] ] #这限制了允许此侦听器运行的进程列表。它不执行任何进程,但消除那些不匹配的进程。 ssl #此设置仅在内置OpenSSL的支持时可用。它可以对从该侦听器实例化的连接进行SSL解密。 需要证书。 缓冲区中的所有内容将以明文形式显示,以便ACL和HTTP处理只能访问已解密的内容。 strict-sni #此设置仅在支持OpenSSL时可用。仅当客户端提供与证书匹配的SNI时,才允许SSL/TLS协商。 未使用默认证书。 tcp-ut <delay> # 它允许haproxy为包含数据的套接字配置超时接收对配置的延迟的确认。 tfo #是一个可选关键字,仅在Linux内核> = 3.7上支持。 这只适用于协议使用高连接率和每次往返的重要性。 这个可以可能会导致许多不接受SYN数据的防火墙的问题数据包,所以这个选项应该只有经过良好测试才能启用。 tls-ticket-keys <keyfile> #设置TLS票证密钥文件以加载密钥。 transparent #是一个可选关键字,仅在某些Linux内核上受支持。 它表示地址将被绑定,即使它们不属于本地机器,并且针对任何这些地址的数据包将被拦截,就像地址被本地配置一样。 这通常需要启用IP转发。 v4v6 #是一个可选关键字,仅在包括Linux内核> = 2.4.21的最新系统上才受支持。 它用于在使用默认地址时将套接字绑定到IPv4和IPv6。 默认情况下,只有绑定到IPv6的系统有时需要这样做。 v6only #是一个可选关键字,仅在最近的系统上才支持包括Linux内核> = 2.4.21。 它仅用于将套接字绑定到IPv6当它使用默认地址。 uid <uid> #将UNIX套接字的所有者设置为指定的系统uid。 user <user> #将UNIX套接字的所有者设置为指定的系统用户。 verify [none|optional|required] #此设置仅在内置OpenSSL支持时可用。如果设置为“none”,则不会请求客户端证书。 这是默认值。
服务器和默认服务器选项:
addr <ipv4|ipv6> #使用“addr”参数,可以使用不同的IP地址发送健康检查或探查代理检查。 agent-check #启用辅助代理检查,该检查与常规健康检查无关。 agent-send <string> #如果指定了此选项,haproxy将在连接时将给定的字符串(逐字)发送到代理服务器。 agent-inter <delay> #参数设置两个代理检查之间的间隔,如果未指定,延迟默认为2000 ms。 agent-port <port> #“agent-port”参数设置用于代理检查的TCP端口。 backup #当服务器行上存在“备份”时,服务器仅在加载时使用所有其他非备份服务器不可用时进行平衡。 ca-file <cafile> #此设置仅在内置OpenSSL的支持时可用。它指定一个PEM文件,用于加载用于验证服务器证书的CA证书。 check #此选项可启用服务器上的运行状况检查。 默认情况下,服务器始终被视为可用。 check-send-proxy #此选项强制发出PROXY协议线路,而不管服务器是否使用发送代理进行正常流量。 check-ssl #此选项强制通过SSL对所有运行状况检查进行加密,无论如何服务器是否为正常流量使用SSL。 ciphers <ciphers> #此选项设置描述在与服务器的SSL/TLS握手期间协商的密码算法列表的字符串。 cookie <value> #“cookie”参数将分配给服务器的cookie值设置为<value>。 将在进入的请求中检查该值,并且将选择具有相同值的第一个操作服务器。 crl-file <crlfile> #此设置仅在内置OpenSSL支持时可用。它指定一个PEM文件,从中加载用于验证服务器证书的证书吊销列表。 crt <cert> #此设置仅在内置OpenSSL支持时可用。它指定一个PEM文件,从中加载证书和相关联的私钥。 该文件可以通过将两个PEM文件连接在一起来构建。 如果服务器发送客户端证书请求,将发送此证书。 disabled #“disabled”关键字启动服务器处于“disabled”状态。 这意味着它在维护模式下被标记,并且除了持续模式允许的连接之外没有连接到达它。 它非常适合设置新的服务器,因为正常的流量将永远不会到达它们,而仍然可以通过使用强制持续机制来测试服务。 error-limit <count> #如果启用了健康状况观察,则“error-limit”参数指定触发“on-error”选项所选事件的连续错误数。 默认设置为10个连续错误。 fall <count> #“fall”参数指出,在<count>连续不成功的健康检查后,服务器将被视为死亡。 如果未指定,此值默认为3。 force-sslv3 #此选项仅在SSL用于通信时强制使用SSLv3服务器。 force-tlsv10 #此选项仅在使用SSL与服务器通信时强制使用TLSv1.0。 force-tlsv11 #此选项仅在SSL用于与服务器通信时强制使用TLSv1.1。 force-tlsv12 #此选项只有在SSL用于通信时才强制使用TLSv1.2服务器。 id <value> #设置服务器的持久ID。 该ID对于代理必须是肯定的和唯一的。 如果未设置,将自动分配未使用的ID。 init-addr {last | libc | none | <ip>},[...]* #指示服务器的地址在启动时应以什么顺序解决 inter <delay> fastinter <delay> downinter <delay> #“inter”参数设置两次连续运行状况检查之间的间隔到[延迟]毫秒。如果未指定,延迟默认为2000 ms。也可以使用“fastinter”和“downinter”来优化延迟 maxconn <maxconn> #“maxconn”参数指定将发送到此服务器的最大并发连接数。 如果进来的数量并发请求高于此值,它们将排队等待为了释放连接。 这个参数非常重要,因为它可以保护脆弱的服务器不受极端负载的影响。 如果“minconn”参数被指定,极限变为动态。 默认值为“0” maxqueue <maxqueue> #“maxqueue”参数指定最大连接数将在队列中等待此服务器。 如果达到这个限制,接下来请求将重新分配给其他服务器,而不是无限期等待送达 这将打破持久性,但可能允许人们当他们尝试连接的服务器正在死亡时,快速重新登录。该默认值为“0”,表示队列无限制。 minconn <minconn> #当设置“minconn”参数时,maxconn限制变为动态限制后端的负载。 服务器将至少接受<minconn>连接,从不超过<maxconn>,并且限制将被打开当后端小于<fullconn>时,两个值之间的斜坡并发连接。 这使得可以限制负载 namespace <name> #在Linux上,可以指定套接字的哪个网络命名空间属于。 该指令使得可以显式地将服务器绑定到一个与默认命名空间不同的命名空间. no-ssl-reuse #当SSL用于通信时,此选项将禁用SSL会话重用服务器。 它将强制服务器对每一个执行完全握手新的连接。 no-sslv3 #当SSL用于通信时,此选项将禁用对SSLv3的支持服务器。 请注意,SSLv2在代码中被禁用,无法启用使用任何配置选项。 no-tls-tickets #此设置仅在内置OpenSSL支持时可用。禁用无状态会话恢复(RFC 5077 TLS Ticket扩展),并强制使用状态会话恢复。 no-tlsv10 #当使用SSL进行通信时,此选项将禁用对TLSv1.0的支持服务器。 no-tlsv11 #当SSL用于通信时,此选项将禁用对TLSv1.1的支持服务器。 no-tlsv12 #当SSL用于通信时,此选项将禁用对TLSv1.2的支持服务器。 non-stick #不要将分配给此服务器的连接添加到条形表中。 这可以与备份一起使用,以确保为备份服务器禁用了stick-table持久性。 observe <mode> #此选项可以基于观察通信来进行健康调整服务器。 默认情况下,此功能被禁用并启用它需要启用健康检查。 on-error <mode> #选择当检测到足够的连续错误时应该发生什么。目前,有四种模式可供选择:fastinter、fail-check、sudden-death、mark-down on-marked-down <action> #修改当服务器被标记为何时发生的情况。目前有一个动作是可用的: shutdown-sessions:关闭对等会话。 启用此设置后,当服务器关闭时,到服务器的所有连接都将立即终止。 on-marked-up <action> #修改在标记服务器时发生的情况。目前有一个动作是可用的:shutdown-backup-sessions port <port> #使用“端口”参数,可以使用不同的端口发送健康检查。 redir <prefix> #“redir”参数启用了针对该服务器的所有GET和HEAD请求的重定向模式。 rise <count> #在<count>连续成功的健康检查后,服务器将被视为可操作。 如果未指定,此值默认为2。 resolve-prefer <family> #当服务器启用DNS解析并返回来自不同系列的多个IP地址时,HAProxy将更喜欢使用“resolve-prefer”参数中提到的系列中的IP地址。 可用系列:“ipv4”和“ipv6” resolve-net <network>[,<network[,...]] #此选项优先选择与网络匹配的IP地址。 resolvers <id> #指向现有的“解析器”部分来解决当前的服务器主机名。 send-proxy #制使用PROXY协议连接建立到此服务器。 send-proxy-v2 #服务器建立的任何连接强制使用PROXY协议版本2。 send-proxy-v2-ssl #制使用PROXY协议版本2通过与此服务器建立的任何连接。 send-proxy-v2-ssl-cn #强制使用PROXY协议版本2通过与此服务器建立的任何连接。 slowstart <start_time_in_ms> #接受以毫秒为单位的值,表示在刚刚恢复的服务器将以全速运行多长时间之后。 sni <expression> #评估样本提取表达式,将其转换为字符串,并将结果作为在服务器的SNI TLS扩展中发送的主机名。 source <addr>[:<pl>[-<ph>]] [usesrc { <addr2>[:<port2>] | client | clientip } ] source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | hdr_ip(<hdr>[,<occ>]) } ] source <addr>[:<pl>[-<ph>]] [interface <name>] ... #设置当时使用的源地址连接到服务器。 ssl #此选项在到服务器的传出连接上启用SSL加密。 tcp-ut <delay> #设置与此服务器的所有传出连接的TCP用户超时。 track [<proxy>/]<server> #此选项可以通过跟踪来设置服务器的当前状态另一个。 可以跟踪本身跟踪另一个的服务器服务器,只要在链的末端,服务器都有健康检查启用。 verify [none|required] #此设置仅在内置OpenSSL支持时可用。如果设置为“none”,则不会验证服务器证书。 verifyhost <hostname> #此设置仅在内置OpenSSL支持时可用,并且只有在指定了“verify required”时才会生效。 weight <weight> #用于调整服务器相对于其他服务器的权重。默认为1,最大是256.
使用DNS的服务器IP地址解析:
resolvers <resolvers id> #创建一个新的名称服务器列表,标签为<resolvers id>,解析器部分接受以下参数:
nameserver <id> <ip>:<port> #DNS服务器描述:<id>:服务器的标签应该是唯一的,<ip>:服务器的IP地址,<port>:DNS服务实际运行的端口 hold <status> <period> # resolve_retries <nb> #定义在放弃之前发送以解析服务器名称的查询的数量<nb>。 默认值:3 timeout <event> <time> #定义与名称解析相关的超时
3.6 HTTP头操作
在HTTP模式下,可以重写,添加或删除一些请求基于正则表达式的响应头。 也可以阻止a如果特定头部匹配正则表达式,请求或响应,这足以阻止大多数基本协议攻击,并保护防止来自内部网络的信息泄漏。
- reqadd <string> - reqallow <search> - reqiallow <search> - reqdel <search> - reqidel <search> - reqdeny <search> - reqideny <search> - reqpass <search> - reqipass <search> - reqrep <search> <replace> - reqirep <search> <replace> - reqtarpit <search> - reqitarpit <search> - rspadd <string> - rspdel <search> - rspidel <search> - rspdeny <search> - rspideny <search> - rsprep <search> <replace> - rspirep <search> <replace>
#使用所有这些关键字,使用相同的约定。 <search>参数是支持分组的POSIX扩展正则表达式(正则表达式)括号(没有反斜杠)。 空格和其他分隔符必须是前缀为反斜杠('\'),以避免与字段分隔符混淆。其他字符可能带有反斜杠以改变其含义:
\t #tab \r #表示回车(CR) \n #为新行(LF) \ #标记一个空格并将其与分隔符区分开来 \# #标记一个尖锐的,并与评论区分开来 \\ #在正则表达式中使用反斜杠 \\\\ #在文本中使用反斜杠(* 2表示正则表达式,* 2表示haproxy) \xXX #以C语言编写ASCII十六进制代码XX
#<replace>参数包含用于替换匹配正则表达式的文本的最大部分的字符串。 它可以使用上面的特殊字符,并且可以通过直接写入反斜杠('\')后跟一个数字从0到9来引用正则表达式中由括号分隔的子字符串,指示组位置(0指定 全线)。 这种做法对于“sed”程序的用户非常普遍。
#<string>参数表示将被系统添加的字符串在最后一个标题行之后。 它也可以使用上面的特殊字符序列。
3.7 使用ACL
ACL基础知识:
使用“acl”关键字。语法是: acl <aclname> <criteria> [flags] [operator] [<value>] ...
ACL名称区分大小写,这意味着“my_acl”和“My_Acl”是两种不同的ACL。
目前支持以下ACL标志:
-i #在匹配所有后续模式时忽略大小写。 -f #从文件加载模式。 -m #使用特定的模式匹配方法 -n #禁止DNS解析 -M #加载由-f指向的文件像地图文件。 -u #强制ACL的唯一ID -- #强制结束标志。 当字符串看起来像其中一个标志时很有用。
但是有一些限制。并不是所有的方法都可以用于所有方法取样方法。另外,如果将“-m”与“-f”结合使用,则必须放在第一位模式匹配方法必须是以下之一:
-“found” #只检查是否可以在流中找到请求的样本, - “bool” #将值作为布尔值检查。 - “int” #将值作为整数进行匹配。 - “ip” #将该值与IPv4或IPv6地址进行匹配。 - “bin” #将内容与表示a的十六进制字符串进行匹配二进制序列。 - “len” #将样本的长度与整数进行匹配。 - “str” #精确匹配:将内容与字符串匹配。 - “sub” #substring match:检查内容是否至少包含一个提供的字符串模式。 - “reg” #正则表达式匹配:匹配内容与常规列表 表达式。 - “beg” #前缀匹配:检查内容是否像提供的那样开始字符串模式。 - “end” #后缀匹配:检查内容是否像提供的那样结束字符串模式。 - “dir” #subdir match:检查一个斜杠分隔的部分内容与所提供的字符串模式之一完全匹配。 - “dom” #域匹配:检查内容的点分隔部分完全匹配所提供的一个字符串模式。
匹配布尔:
为了匹配布尔值,不需要任何值,所有值都将被忽略。对于类型“boolean”的所有提取方法,默认使用布尔匹配。当使用布尔匹配时,获取的值将按原样返回,这意味着布尔值“true”将始终匹配,布尔值“false”将永远不匹配。
布尔匹配也可以在fetch方法中使用“-m bool”强制执行返回一个整数值。 然后,将整数值0转换为布尔值“false”和所有其他值将转换为“true”。
匹配整数:
整数匹配默认适用于整数提取方法。也可以使用“-m int”强制执行布尔获取。在这种情况下,“false”被转换到整数0,“true”转换为整数1。整数匹配还支持整数范围和运算符。注意整数匹配仅适用于正值。
整数匹配的可用运算符是:eq、ge、gt、le、lt
匹配字符串:
字符串匹配适用于字符串或二进制获取方法,并存在于6种不同形式:
- 精确匹配(-m str) #提取的字符串必须与模式完全匹配; - 子串匹配(-m sub) #在提取的字符串内查找模式,ACL匹配,如果在其中找到任何一个; - 前缀匹配(-m beg) #将模式与提取的字符串的开头进行比较,并且ACL匹配,如果匹配。 - 后缀匹配(-m end) #将模式与提取的字符串的末尾进行比较,如果匹配任何匹配,则匹配ACL。 - 子目录匹配(-m dir)#在提取的字符串内查找模式,用斜线(“/”)分隔,如果匹配任何匹配,则匹配。 - 域匹配(-m dom) #在提取的字符串内查找模式,用点(“.”)分隔,并且ACL匹配。
匹配正则表达式(正则表达式):
就像使用字符串匹配一样,正则表达式匹配适用于逐字字符串,因为它们被传递,除了反斜杠(“\”)之外,可以转义一些字符,如空格。 如果“-i”标志在第一个正则表达式之前通过,则将忽略该情况进行匹配。 为了匹配字符串“-i”,请将其设置为第二个,或者在第一个字符串之前传递“ -- ”标志。 当然,匹配字符串“ ---”也是一样的。
匹配任意数据块:
可以将某些提取的样本与可能的二进制块进行匹配不能安全地表示为字符串。 为此,模式必须传递为当匹配方法设置时,一系列十六进制数字以偶数编号到二进制。 两位数字的每个序列都将代表一个字节。 十六进制
数字可以用大写或小写。如:
# match "Hello\n" in the input stream (\x48 \x65 \x6c \x6c \x6f \x0a) acl hello payload(0,6) -m bin 48656c6c6f0a
匹配IPv4和IPv6地址:
使用ACL形成条件:
一些操作仅在有效条件下执行。 条件是ACL与运算符的组合。 支持3个条件:AND、OR、!,这种条件通常在“if”或“unless”语句之后使用,指示条件何时触发动作。
要在“www”站点上以及“img”,“视频”,“下载”和“ftp”主机上的每个请求中选择不同的后端请求静态内容:
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.
转换:
目前可用的转换关键字列表包括:
51d.single(<prop>[,<prop>*]) #返回作为字符串请求的属性的值,其中值由“51degrees-property-separator”指定的分隔符分隔。 使用传递给转换器的用户代理头标识设备。 该函数最多可以传递五个属性名称,如果找不到属性名称,则返回值“NoData”。 add(<value>) #将<value>添加到类型有符号整数的输入值,并将结果作为有符号整数返回。 <value>可以是数值或变量名。 and(<value>) #在<value>和类型有符号整数的输入值之间按位“AND”,并将结果作为有符号整数返回。 <value>可以是数值或变量名。 base64 #将二进制输入样本转换为base64字符串。 bool #如果类型有符号整数的输入值为非空,则返回一个布尔值TRUE,否则返回FALSE。 bytes(<offset>[,<length>]) #从输入二进制样本中提取一些字节。 结果是以原始样本的偏移(以字节为单位)开始的二进制样本,并且可选地在给定长度上截断。 cpl #获取类型有符号整数的输入值,应用一个补码(翻转所有位),并将结果作为有符号整数返回。 crc32([<avalanche>]) #使用CRC32将二进制输入采样值打入无符号32位数散列函数。 da-csv-conv(<prop>[,<prop>*]) #要求DeviceAtlas转换器识别在输入上传递的用户代理字符串,并发出一个由参数中枚举的属性组合的字符串,由由全局关键字“deviceatlas-property-separator”定义的分隔符定界或由默认值 管道字符('|')。 debug #该转换器用作调试工具。 它在屏幕上转储内容和输入样本的类型。 div(<value>) #将类型有符号整数的输入值除以<value>,并将结果作为有符号整数返回。 djb2([<avalanche>]) #使用DJB2哈希函数将二进制输入样本散列为无符号32位数。 even #如果类型有符号整数的输入值为偶,则返回一个布尔值TRUE,否则返回FALSE。 field(<index>,<delimiters>) #考虑到输入字符串中的分隔符,提取给定索引处的子字符串。 索引从1开始,分隔符是字符串格式的字符列表。 hex #将二进制输入样本转换为每个输入字节包含两个十六进制数字的十六进制字符串。 http_date([<offset>]) #将包含从epoch开始的日期的整数转换成适用于HTTP头字段的格式,表示此日期的字符串。 in_table(<table>) #使用输入样本的字符串表示法在指定的表中执行查找。 ipmask(<mask>) #将一个掩码应用于IPv4地址,并使用结果进行查找和存储。 json([<input-code>]) #转义输入字符串,并产生一个可以作为JSON字符串使用的ASCII输出字符串。 language(<value>[,<default>]) #从“accept-language”标题中使用“req.fhdr”提取的列表中返回具有最高q因子的值。 lower #将字符串样本转换为小写。 ltime(<format>[,<offset>]) #将使用strftime(3)的<format>字符串定义的格式,将包含从epoch的日期的整数转换成代表本地时间的字符串的整数。 map(<map_file>[,<default_value>]) map_<match_type>(<map_file>[,<default_value>]) map_<match_type>_<output_type>(<map_file>[,<default_value>]) #使用<match_type>匹配方法从<map_file>搜索输入值,并返回转换为类型<output_type>的关联值。 mod(<value>) #将类型有符号整数的输入值除以<value>,并返回余数作为有符号整数。 如果<value>为null,则返回0。 mul(<value>) #将类型有符号整数的输入值乘以<value>,并将该乘积返回为带符号整数。 neg #获取类型有符号整数的输入值,计算相反的值,并将余数作为带符号整数返回。 not #如果类型有符号整数的输入值为非空,则返回布尔值FALSE,否则返回TRUE。 odd #如果类型有符号整数的输入值为奇数则返回一个布尔值TRUE,否则返回FALSE。 or(<value>) #在<value>和类型有符号整数的输入值之间执行按位“OR”,并将结果作为有符号整数返回。 regsub(<regex>,<subst>[,<flags>]) #对输入字符串应用基于正则表达式的替换。 capture-req(<id>) #捕获请求插槽<id>中的字符串条目,并返回条目。 如果插槽不存在,则捕获失败。 capture-res(<id>) #在响应槽<id>中捕获字符串条目,并返回该条目。 如果插槽不存在,则捕获失败。 sdbm([<avalanche>]) #使用SDBM将二进制输入采样值打入无符号的32位数量散列函数。 set-var(<var name>) #设置带有输入内容的变量,并返回输出的内容是。 sub(<value>) #从类型有符号整数的输入值中减去<value>,并返回结果为有符号整数。 table_bytes_in_rate(<table>) #使用输入样本的字符串表示法在指定的表中执行查找。 如果表中找不到键,则返回整数值零。 table_bytes_out_rate(<table>) table_conn_cnt(<table>) table_conn_cur(<table>) table_conn_rate(<table>) table_gpt0(<table>) table_gpc0(<table>) table_gpc0_rate(<table>) table_http_err_cnt(<table>) table_http_err_rate(<table>) table_http_req_cnt(<table>) table_http_req_rate(<table>) table_kbytes_in(<table>) table_kbytes_out(<table>) table_server_id(<table>) table_sess_cnt(<table>) table_sess_rate(<table>) table_trackers(<table>) #各种同上 upper #将字符串样本转换为大写字母。 这只能在字符串取样函数之后或在转换关键字返回字符串类型之后放置。 结果是字符串类型。 url_dec #获取一个作为输入提供的网址编码字符串,并将解码的版本作为输出返回。 输入和输出是字符串类型。 unset-var(<var name>) #如果定义输入内容,则取消设置变量。 变量的名称从其范围的指示开始。 utime(<format>[,<offset>]) #将包含从时期开始的日期的整数转换为字符串使用由<format>定义的格式在UTC时间表示此日期string使用strftime。 word(<index>,<delimiters>) #从输入字符串中提取考虑给定分隔符的第n个单词。索引从1开始,分隔符是字符串格式的字符列表。 wt6([<avalanche>]) #使用WT6将二进制输入采样值打入无符号的32位数量散列函数。 xor(<value>) #在<value>和输入值之间执行按位“异或”(异或)的类型有符号整数,并将结果作为有符号整数返回。
#还可以从内部状态获取样品这里就不记录了。
在第4层获取样品:
be_id : integer #返回一个包含当前后端的id的整数。 它可以在前端使用响应来检查哪个后端处理了请求。 be_name : string #返回一个包含当前后端名称的字符串。 它可以在前端使用响应来检查哪个后端处理了请求。 dst : ip #这是客户端连接的目标IPv4地址,客户端连接的地址。 dst_conn : integer #返回与同一套接字上当前建立的连接数相对应的整数值,包括正在评估的连接数。 dst_is_local : boolean #如果传入连接的目标地址是系统本地的,则返回true;如果系统上不存在该地址,则返回false,这意味着它以透明模式被拦截。 dst_port : integer #返回与客户端连接的连接的目标TCP端口对应的整数值,该端口是客户端连接的端口。 fc_rcvd_proxy : boolean #如果客户端使用PROXY协议头发起连接,则返回true。 fc_rtt(<unit>) : integer #返回由内核为客户端测量的往返时间(RTT)连接。 fc_rttvar(<unit>) : integer #返回由内核测量的往返时间(RTT)方差客户端连接。 fc_unacked(<unit>) : integer #返回由内核测量的用于客户端连接的未打包计数器。 fc_sacked(<unit>) : integer fc_retrans(<unit>) : integer fc_fackets(<unit>) : integer fc_lost(<unit>) : integer fc_reordering(<unit>) : integer fe_id : integer fe_name : string sc_bytes_in_rate(<ctr>[,<table>]) : integer sc0_bytes_in_rate([<table>]) : integer sc1_bytes_in_rate([<table>]) : integer sc2_bytes_in_rate([<table>]) : integer #返回当前跟踪的计数器的平均客户端到服务器的字节速率,以表格中配置的周期内的字节数量进行测量。 sc_bytes_out_rate(<ctr>[,<table>]) : integer sc0_bytes_out_rate([<table>]) : integer sc1_bytes_out_rate([<table>]) : integer sc2_bytes_out_rate([<table>]) : integer #返回当前跟踪的计数器的平均服务器到客户端字节速率,以表中配置的周期内的字节数量进行测量。 sc_clr_gpc0(<ctr>[,<table>]) : integer sc0_clr_gpc0([<table>]) : integer sc1_clr_gpc0([<table>]) : integer sc2_clr_gpc0([<table>]) : integer #清除与当前跟踪的计数器相关联的第一个通用计数器,并返回其以前的值。 在第一次调用之前,存储的值为零,所以首先调用将始终返回零。 sc_conn_cnt(<ctr>[,<table>]) : integer sc0_conn_cnt([<table>]) : integer sc1_conn_cnt([<table>]) : integer sc2_conn_cnt([<table>]) : integer #返回从当前跟踪的传入连接的累积数计数器。 sc_conn_cur(<ctr>[,<table>]) : integer sc0_conn_cur([<table>]) : integer sc1_conn_cur([<table>]) : integer sc2_conn_cur([<table>]) : integer #返回跟踪相同的并发连接的当前数量跟踪计数器 跟踪时,这个数字会自动递增跟踪停止时开始递减 sc_conn_rate(<ctr>[,<table>]) : integer sc0_conn_rate([<table>]) : integer sc1_conn_rate([<table>]) : integer sc2_conn_rate([<table>]) : integer #返回当前跟踪的计数器的平均连接速率,以表中配置的时间段内的连接量进行测量。 sc_get_gpc0(<ctr>[,<table>]) : integer sc0_get_gpc0([<table>]) : integer sc1_get_gpc0([<table>]) : integer sc2_get_gpc0([<table>]) : integer #返回与当前跟踪的计数器相关联的第一个通用计数器的值。 sc_get_gpt0(<ctr>[,<table>]) : integer sc0_get_gpt0([<table>]) : integer sc1_get_gpt0([<table>]) : integer sc2_get_gpt0([<table>]) : integer #返回与当前跟踪的计数器相关联的第一个通用标签的值。 sc_gpc0_rate(<ctr>[,<table>]) : integer sc0_gpc0_rate([<table>]) : integer sc1_gpc0_rate([<table>]) : integer sc2_gpc0_rate([<table>]) : integer #返回与当前跟踪的计数器相关联的第一个通用计数器的平均增量率。它报告gpc0计数器在配置的周期内递增的频率。 sc_http_err_cnt(<ctr>[,<table>]) : integer sc0_http_err_cnt([<table>]) : integer sc1_http_err_cnt([<table>]) : integer sc2_http_err_cnt([<table>]) : integer #从当前跟踪的计数器返回累积的HTTP错误数。 这包括请求错误和4xx错误响应。 sc_http_err_rate(<ctr>[,<table>]) : integer sc0_http_err_rate([<table>]) : integer sc1_http_err_rate([<table>]) : integer sc2_http_err_rate([<table>]) : integer #从当前跟踪的计数器返回HTTP错误的平均速率,以表中配置的周期内的错误量进行测量。 这个包括两个请求错误和4xx错误响应。 sc_http_req_cnt(<ctr>[,<table>]) : integer sc0_http_req_cnt([<table>]) : integer sc1_http_req_cnt([<table>]) : integer sc2_http_req_cnt([<table>]) : integer #从当前的跟踪计数器返回累积的HTTP请求数。 这包括每个已启动的请求,是否有效。 sc_http_req_rate(<ctr>[,<table>]) : integer sc0_http_req_rate([<table>]) : integer sc1_http_req_rate([<table>]) : integer sc2_http_req_rate([<table>]) : integer #返回当前跟踪的计数器的HTTP请求的平均速率,以表中配置的周期内的请求量来衡量。 这包括每个已启动的请求,是否有效。 sc_inc_gpc0(<ctr>[,<table>]) : integer sc0_inc_gpc0([<table>]) : integer sc1_inc_gpc0([<table>]) : integer sc2_inc_gpc0([<table>]) : integer #增加与当前跟踪的计数器相关联的第一个通用计数器,并返回其新值。 sc_kbytes_in(<ctr>[,<table>]) : integer sc0_kbytes_in([<table>]) : integer sc1_kbytes_in([<table>]) : integer sc2_kbytes_in([<table>]) : integer #从当前跟踪的计数器返回客户端到服务器数据的总量,以千字节为单位。 sc_kbytes_out(<ctr>[,<table>]) : integer sc0_kbytes_out([<table>]) : integer sc1_kbytes_out([<table>]) : integer sc2_kbytes_out([<table>]) : integer #从当前跟踪的计数器返回服务器到客户端数据的总量,以千字节为单位。 sc_sess_cnt(<ctr>[,<table>]) : integer sc0_sess_cnt([<table>]) : integer sc1_sess_cnt([<table>]) : integer sc2_sess_cnt([<table>]) : integer #返回被转换成会话的传入连接的累积数量,这意味着它们被当前跟踪的计数器的“tcp-request连接”规则所接受。 sc_sess_rate(<ctr>[,<table>]) : integer sc0_sess_rate([<table>]) : integer sc1_sess_rate([<table>]) : integer sc2_sess_rate([<table>]) : integer #从当前跟踪的计数器返回平均会话速率,以表中配置的时间段内的会话量进行测量。 会话是一个超过早期的“tcp-request连接”规则的连接。 sc_tracked(<ctr>[,<table>]) : boolean sc0_tracked([<table>]) : boolean sc1_tracked([<table>]) : boolean sc2_tracked([<table>]) : boolean #如果指定的会话计数器当前正在由当前会话跟踪,则返回true。 sc_trackers(<ctr>[,<table>]) : integer sc0_trackers([<table>]) : integer sc1_trackers([<table>]) : integer sc2_trackers([<table>]) : integer #返回跟踪相同跟踪计数器的并发连接数量。 跟踪时,这个数字会自动递增跟踪停止时开始递减。 so_id : integer #返回一个包含当前侦听套接字的id的整数。 它在前端涉及许多“绑定”行是有用的,或者将通过相同套接字传入的所有用户都粘贴到同一台服务器。 src : ip #这是会话的客户端的源IPv4地址。 src_bytes_in_rate([<table>]) : integer #返回当前代理服务台或指定的表格中传入连接的源地址的平均字节速率,以表中配置的周期内的字节数量来衡量。 src_bytes_out_rate([<table>]) : integer #返回当前代理服务台或指定的表格中传入连接的源地址的平均字节速率,以表中配置的周期内的字节数量来衡量。 如果找不到地址,则返回零。 src_clr_gpc0([<table>]) : integer #清除与当前代理服务台或指定的表格中的传入连接的源地址关联的第一个通用计数器,并返回其以前的值。 src_conn_cnt([<table>]) : integer #返回从当前代理服务台或指定的表格中的当前传入连接的源地址发起的累积连接数。 如果找不到地址,则返回零。 src_conn_cur([<table>]) : integer #返回当前代理服务台或指定的服务台中当前传入连接的源地址发起的并发连接数。 src_conn_rate([<table>]) : integer src_get_gpc0([<table>]) : integer src_get_gpt0([<table>]) : integer src_gpc0_rate([<table>]) : integer src_http_err_cnt([<table>]) : integer src_http_err_rate([<table>]) : integer src_http_req_cnt([<table>]) : integer src_http_req_rate([<table>]) : integer src_inc_gpc0([<table>]) : integer src_is_local : boolean src_kbytes_in([<table>]) : integer src_kbytes_out([<table>]) : integer src_port : integer src_sess_cnt([<table>]) : integer src_sess_rate([<table>]) : integer src_updt_conn_cnt([<table>]) : integer srv_id : integer #在处理响应时返回一个包含服务器ID的整数。 虽然它几乎只用于ACL,但它可能用于记录或调试。
在第5层取样:不记录了
从缓冲区内容中获取样本(第6层):不记录了
获取HTTP样本(第7层)
base : string #这将返回第一个主机头和请求的路径部分的连接,该部分以第一个斜线开始,并在问号之前结束 base32 : integer #这将返回上述“基本”获取方法返回的值的32位散列。 base32+src : binary #这将返回上面的base32 fetch和下面的src fetch的并置。 结果类型是二进制类型,大小为8或20字节,具体取决于源地址族。 这可以用于跟踪每IP地址,每个URL计数器。 capture.req.hdr(<idx>) : string #这提取了由“捕获请求头”捕获的标题的内容,idx是配置中capture关键字的位置。 第一个条目是0的索引。 capture.req.method : string #这提取了HTTP请求的METHOD。 它可以在请求和响应中使用。 与“方法”不同,它可以在请求和响应中使用,因为它被分配。 capture.req.uri : string #这提取了请求的URI,它从第一个斜杠开始,并在请求中的第一个空格(没有主机部分)之前结束。 与“路径”和“url”不同,它可以在请求和响应中使用,因为它被分配。 capture.req.ver : string #这提取了请求的HTTP版本,并返回“HTTP / 1.0”或“HTTP / 1.1”。与“req.ver”不同,它可以在请求,响应和日志中使用,因为它依赖于持久标志。 capture.res.hdr(<idx>) : string #这提取了“捕获响应头”捕获的头部内容,idx是配置中capture关键字的位置。 第一个条目是一个索引为0. capture.res.ver : string #这提取了响应的HTTP版本,并返回“HTTP/1.0”或“HTTP / 1.1”。与“res.ver”不同,它可以在日志中使用,因为它依赖于持久标志。 req.body : binary #这将作为数据块返回HTTP请求的可用主体。 它要求使用“option http-buffer-request”缓冲提供请求正文。 req.body_param([<name>) : string #该提取假定POST请求的正文是网址编码的。 req.body_len : integer #这返回HTTP请求的可用主体的长度(以字节为单位)。 req.body_size : integer #这返回了HTTP请求的主体的广告长度(以字节为单位)。 req.cook([<name>]) : string cook([<name>]) : string (deprecated) #这将从请求中的“Cookie”标题行中提取Cookie名称<name>的最后一次出现,并将其值作为字符串返回。 req.cook_cnt([<name>]) : integer cook_cnt([<name>]) : integer (deprecated) #返回表示请求中cookie <name>的出现次数的整数值,如果未指定<name>,则返回所有Cookie。 req.cook_val([<name>]) : integer cook_val([<name>]) : integer (deprecated) #这将从请求中提取“Cookie”标题行上的Cookie名称<name>的最后一次出现,并将其值转换为返回的整数。 cookie([<name>]) : string (deprecated) #这会从请求中的“Cookie”标题行或响应中的“Set-Cookie”头中提取Cookie名称<name>的最后一次,并将其值作为字符串返回。 hdr([<name>[,<occ>]]) : string req.fhdr(<name>[,<occ>]) : string req.fhdr_cnt([<name>]) : integer req.hdr([<name>[,<occ>]]) : string req.hdr_cnt([<name>]) : integer hdr_cnt([<header>]) : integer (deprecated) req.hdr_ip([<name>[,<occ>]]) : ip hdr_ip([<name>[,<occ>]]) : ip (deprecated) req.hdr_val([<name>[,<occ>]]) : integer hdr_val([<name>[,<occ>]]) : integer (deprecated) http_auth(<userlist>) : boolean #返回一个布尔值,表示从客户端接收的验证数据是否与存储在指定用户列表中的用户名和密码相匹配。 这个抓取功能在ACL之外并不真正有用。 目前只支持http basic auth。 http_auth_group(<userlist>) : string #根据指定的用户列表,如果用户名和密码都有效,则返回与从客户端接收到的认证数据中发现的用户名相对应的字符串。 http_first_req : boolean #当正在处理的请求是连接的第一个时,返回true。 method : integer + string #返回与HTTP请求中的方法对应的整数值。 path : string #这将提取请求的URL路径,该路径以第一个斜线开头,并在问号(不含主机部分)之前结束。 query : string #这提取了请求的查询字符串,该字符串从第一个问号开始。 req.hdr_names([<delim>]) : string req.ver : string req_ver : string (deprecated) #从HTTP请求返回版本字符串,例如“1.1”。 res.comp : boolean #如果响应被HAProxy压缩,则返回布尔值“true”,否则返回“false”。 这可以用于在日志中添加信息。 res.comp_algo : string #如果响应被HAProxy压缩,则返回一个包含所使用算法名称的字符串,例如:“deflate”。 这可以用来在日志中添加一些信息。 res.cook([<name>]) : string scook([<name>]) : string (deprecated) #这将从响应中的“Set-Cookie”标题行中提取cookie名称<name>的最后一次出现,并将其值作为字符串返回。 res.cook_cnt([<name>]) : integer scook_cnt([<name>]) : integer (deprecated) res.cook_val([<name>]) : integer scook_val([<name>]) : integer (deprecated) res.fhdr([<name>[,<occ>]]) : string #这将在HTTP响应中提取标题<name>的最后一个出现,如果没有指定<name>,则会提取最后一个标题。 res.fhdr_cnt([<name>]) : integer #返回表示响应头字段名称<name>的出现次数的整数值,或未指定<name>的标题字段总数。 res.hdr([<name>[,<occ>]]) : string shdr([<name>[,<occ>]]) : string (deprecated) res.hdr_cnt([<name>]) : integer shdr_cnt([<name>]) : integer (deprecated) res.hdr_ip([<name>[,<occ>]]) : ip shdr_ip([<name>[,<occ>]]) : ip (deprecated) res.hdr_val([<name>[,<occ>]]) : integer shdr_val([<name>[,<occ>]]) : integer (deprecated) res.ver : string resp_ver : string (deprecated) status : integer #返回一个包含HTTP响应中的HTTP状态代码的整数 unique-id : string #返回附加到请求的unique-id。 url : string #这将提取请求中显示的请求的URL。 url_ip : ip #当主机部分作为IP地址显示时,会从请求的URL中提取IP地址。 url_port : integer #这将从请求的URL中提取端口部分。 urlp([<name>[,<delim>]]) : string url_param([<name>[,<delim>]]) : string # urlp_val([<name>[,<delim>]]) : integer # 这个提取请求中的URL参数<name>,并将其转换为整数值。 url32 : integer #这返回通过连接第一个主机头和包含参数的整个URL获得的值的32位散列 url32+src : binary #这将返回“url32”fetch和“src”fetch的连接。 结果类型是二进制类型,大小为8或20字节,具体取决于源地址族。 这可以用于跟踪每IP地址,每个URL计数器。
预定义ACL:
一些预定义的ACL是硬编码的,因此它们不需要在需要它们的每个前端中声明。 他们都有大写的名字,以避免混淆。 他们的等同性在下面提供。
ACL name 相当于 用法 ---------------+-----------------------------+--------------------------------- 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_DELETE method DELETE match HTTP DELETE 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_PUT method PUT match HTTP PUT 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
3.8 Logging
Log levels:
可以记录TCP和HTTP连接,其中包括日期,时间,源IP地址,目的地址,连接持续时间,响应时间,HTTP请求,HTTP返回码,发送的字节数,会话结束的条件,甚至交换cookie值。 例如跟踪特定用户的问题。
Log formats:
HAProxy支持5种日志格式。 这些格式之间的几个字段是常见的,下面将详细介绍。 由于特定选项特定的指标,其中一些可能会因配置而略有不同。 支持的格式如下:
- the default format #这是非常基本的,很少使用。它仅在接收时提供有关传入连接的非常基本的信息:源IP:端口,目标IP:端口和前端名称。这种模式最终会消失,所以不会在很大程度上被描述。 - the TCP format #更先进。在前台设置“选项tcplog”时,此格式被启用。然后,HAProxy通常会在记录之前等待连接终止。此格式提供了更丰富的信息,如定时器,连接数,队列大小等。这种格式推荐用于纯TCP代理。 - the HTTP format #是HTTP代理最先进的。在前端设置“option httplog”时启用此格式。它提供与TCP格式相同的信息,其中包含一些特定于HTTP的字段,例如请求,状态代码以及标题和Cookie的捕获。这种格式推荐用于HTTP代理。 - the CLF HTTP format #等同于HTTP格式,但字段排列顺序与CLF格式相同。在这种模式下,所有定时器,捕获,标志等在公共字段结束后显示一个字段,按照与标准HTTP格式相同的顺序显示。 - the custom log format #自定义日志格式,允许自定义日志格式。
#这五种日志的具体格式,请参照doc/configuration.txt文件里面的记录。