HAProxy 3.4.4
9. 统计信息与监控
HAProxy 3.4 入门、配置与管理三套完整手册的简体中文译本
可以查询 HAProxy 的运行状态。最常用的机制是 HTTP 统计信息页面。该页面还提供了一种用于监控工具的替代 CSV 输出格式。相同的格式也通过 Unix 套接字提供。
统计信息按类别分组,类别以域(domain)命名,对应 HAProxy 的多个组件。当前提供两个域:proxy 和 resolvers。若未指定,将选择 proxy 域。请注意,仅代理的统计信息会显示在 HTTP 页面上。
9.1. CSV 格式
可通过 Unix 套接字或 HTTP 页面查阅统计信息。两种方式均提供 CSV 格式,其字段定义如下。第一行以井号(’#’)开头,每个逗号分隔的字段对应一列标题。从第二行开始的其余行采用标准 CSV 格式,以逗号作为分隔符,双引号(’"’)作为可选的文本分隔符,仅当被包围的文本存在歧义时(如包含引号或逗号)才使用。文本中的双引号字符需以两个双引号(’""’)表示,这是大多数工具所识别的格式。请勿在这些字段前插入任何列,以免破坏依赖硬编码列位置的工具。
对于代理的统计信息,每个字段名后方括号内会列出该字段可能具有值的类型。类型包括 L(监听器)、F(前端)、B(后端)和 S(服务器)。存在一组固定的静态字段,其始终以相同顺序可用。包含字符“-”的列表示静态字段的结束,此后字段的存在性或顺序无法保证。
以下是使用代理统计信息域的静态字段列表:
0. pxname [LFBS]: proxy name
1. svname [LFBS]: service name (FRONTEND for frontend, BACKEND for backend,
any name for server/listener)
2. qcur [..BS]: current queued requests. For the backend this reports the
number queued without a server assigned.
3. qmax [..BS]: max value of qcur
4. scur [LFBS]: current sessions
5. smax [LFBS]: max sessions
6. slim [LFBS]: configured session limit
7. stot [LFBS]: cumulative number of sessions
8. bin [LFBS]: bytes in
9. bout [LFBS]: bytes out
10. dreq [LFB.]: requests denied because of security concerns.
- For tcp this is because of a matched tcp-request content rule.
- For http this is because of a matched http-request or tarpit rule.
11. dresp [LFBS]: responses denied because of security concerns.
- For http this is because of a matched http-request rule, or
"option checkcache".
12. ereq [LF..]: request errors. Some of the possible causes are:
- early termination from the client, before the request has been sent.
- read error from the client
- client timeout
- client closed connection
- various bad requests from the client.
- request was tarpitted.
13. econ [..BS]: number of requests that encountered an error trying to
connect to a backend server. The backend stat is the sum of the stat
for all servers of that backend, plus any connection errors not
associated with a particular server (such as the backend having no
active servers).
14. eresp [..BS]: response errors. srv_abrt will be counted here also.
Some other errors are:
- write error on the client socket (won't be counted for the server stat)
- failure applying filters to the response.
15. wretr [..BS]: number of times a connection to a server was retried.
16. wredis [..BS]: number of times a request was redispatched to another
server. The server value counts the number of times that server was
switched away from.
17. status [LFBS]: status (UP/DOWN/NOLB/MAINT/MAINT(via)/MAINT(resolution)...)
18. weight [..BS]: total effective weight (backend), effective weight (server)
19. act [..BS]: number of active servers (backend), server is active (server)
20. bck [..BS]: number of backup servers (backend), server is backup (server)
21. chkfail [...S]: number of failed checks. (Only counts checks failed when
the server is up.)
22. chkdown [..BS]: number of UP->DOWN transitions. The backend counter counts
transitions to the whole backend being down, rather than the sum of the
counters for each server.
23. lastchg [..BS]: number of seconds since the last UP<->DOWN transition
24. downtime [..BS]: total downtime (in seconds). The value for the backend
is the downtime for the whole backend, not the sum of the server downtime.
25. qlimit [...S]: configured maxqueue for the server, or nothing in the
value is 0 (default, meaning no limit)
26. pid [LFBS]: process id (0 for first instance, 1 for second, ...)
27. iid [LFBS]: unique proxy id
28. sid [L..S]: server id (unique inside a proxy)
29. throttle [...S]: current throttle percentage for the server, when
slowstart is active, or no value if not in slowstart.
30. lbtot [..BS]: total number of times a server was selected, either for new
sessions, or when re-dispatching. The server counter is the number
of times that server was selected.
31. tracked [...S]: id of proxy/server if tracking is enabled.
32. type [LFBS]: (0=frontend, 1=backend, 2=server, 3=socket/listener)
33. rate [.FBS]: number of sessions per second over last elapsed second
34. rate_lim [.F..]: configured limit on new sessions per second
35. rate_max [.FBS]: max number of new sessions per second
36. check_status [...S]: status of last health check, one of:
UNK -> unknown
INI -> initializing
SOCKERR -> socket error
L4OK -> check passed on layer 4, no upper layers testing enabled
L4TOUT -> layer 1-4 timeout
L4CON -> layer 1-4 connection problem, for example
"Connection refused" (tcp rst) or "No route to host" (icmp)
L6OK -> check passed on layer 6
L6TOUT -> layer 6 (SSL) timeout
L6RSP -> layer 6 invalid response - protocol error
L7OK -> check passed on layer 7
L7OKC -> check conditionally passed on layer 7, for example 404 with
disable-on-404
L7TOUT -> layer 7 (HTTP/SMTP) timeout
L7RSP -> layer 7 invalid response - protocol error
L7STS -> layer 7 response error, for example HTTP 5xx
Notice: If a check is currently running, the last known status will be
reported, prefixed with "* ". e. g. "* L7OK".
37. check_code [...S]: layer5-7 code, if available
38. check_duration [...S]: time in ms took to finish last health check
39. hrsp_1xx [.FBS]: http responses with 1xx code
40. hrsp_2xx [.FBS]: http responses with 2xx code
41. hrsp_3xx [.FBS]: http responses with 3xx code
42. hrsp_4xx [.FBS]: http responses with 4xx code
43. hrsp_5xx [.FBS]: http responses with 5xx code
44. hrsp_other [.FBS]: http responses with other codes (protocol error)
45. hanafail [...S]: failed health checks details
46. req_rate [.F..]: HTTP requests per second over last elapsed second
47. req_rate_max [.F..]: max number of HTTP requests per second observed
48. req_tot [.FB.]: total number of HTTP requests received
49. cli_abrt [..BS]: number of data transfers aborted by the client
50. srv_abrt [..BS]: number of data transfers aborted by the server
(inc. in eresp)
51. comp_in [.FB.]: number of HTTP response bytes fed to the compressor
52. comp_out [.FB.]: number of HTTP response bytes emitted by the compressor
53. comp_byp [.FB.]: number of bytes that bypassed the HTTP compressor
(CPU/BW limit)
54. comp_rsp [.FB.]: number of HTTP responses that were compressed
55. lastsess [..BS]: number of seconds since last session assigned to
server/backend
56. last_chk [...S]: last health check contents or textual error
57. last_agt [...S]: last agent check contents or textual error
58. qtime [..BS]: the average queue time in ms over the 1024 last requests
59. ctime [..BS]: the average connect time in ms over the 1024 last requests
60. rtime [..BS]: the average response time in ms over the 1024 last requests
(0 for TCP)
61. ttime [..BS]: the average total session time in ms over the 1024 last
requests
62. agent_status [...S]: status of last agent check, one of:
UNK -> unknown
INI -> initializing
SOCKERR -> socket error
L4OK -> check passed on layer 4, no upper layers testing enabled
L4TOUT -> layer 1-4 timeout
L4CON -> layer 1-4 connection problem, for example
"Connection refused" (tcp rst) or "No route to host" (icmp)
L7OK -> agent reported "up"
L7STS -> agent reported "fail", "stop", or "down"
63. agent_code [...S]: numeric code reported by agent if any (unused for now)
64. agent_duration [...S]: time in ms taken to finish last check
65. check_desc [...S]: short human-readable description of check_status
66. agent_desc [...S]: short human-readable description of agent_status
67. check_rise [...S]: server's "rise" parameter used by checks
68. check_fall [...S]: server's "fall" parameter used by checks
69. check_health [...S]: server's health check value between 0 and rise+fall-1
70. agent_rise [...S]: agent's "rise" parameter, normally 1
71. agent_fall [...S]: agent's "fall" parameter, normally 1
72. agent_health [...S]: agent's health parameter, between 0 and rise+fall-1
73. addr [L..S]: address:port or "unix". IPv6 has brackets around the address.
74: cookie [..BS]: server's cookie value or backend's cookie name
75: mode [LFBS]: proxy mode (tcp, http, health, unknown)
76: algo [..B.]: load balancing algorithm
77: conn_rate [.F..]: number of connections over the last elapsed second
78: conn_rate_max [.F..]: highest known conn_rate
79: conn_tot [.F..]: cumulative number of connections
80: intercepted [.FB.]: cum. number of intercepted requests (monitor, stats)
81: dcon [LF..]: requests denied by "tcp-request connection" rules
82: dses [LF..]: requests denied by "tcp-request session" rules
83: wrew [LFBS]: cumulative number of failed header rewriting warnings
84: connect [..BS]: cumulative number of connection establishment attempts
85: reuse [..BS]: cumulative number of connection reuses
86: cache_lookups [.FB.]: cumulative number of cache lookups
87: cache_hits [.FB.]: cumulative number of cache hits
88: srv_icur [...S]: current number of idle connections available for reuse
89: src_ilim [...S]: limit on the number of available idle connections
90. qtime_max [..BS]: the maximum observed queue time in ms
91. ctime_max [..BS]: the maximum observed connect time in ms
92. rtime_max [..BS]: the maximum observed response time in ms (0 for TCP)
93. ttime_max [..BS]: the maximum observed total session time in ms
94. eint [LFBS]: cumulative number of internal errors
95. idle_conn_cur [...S]: current number of unsafe idle connections
96. safe_conn_cur [...S]: current number of safe idle connections
97. used_conn_cur [...S]: current number of connections in use
98. need_conn_est [...S]: estimated needed number of connections
99. uweight [..BS]: total user weight (backend), server user weight (server)
100. agg_server_status [..B.]: backend aggregated gauge of server's status
101. agg_server_status_check [..B.]: (deprecated)
102. agg_check_status [..B.]: backend aggregated gauge of server's state check
status
103. srid [...S]: server id revision
104. sess_other [.F..]: total number of sessions other than HTTP since process
started
105. h1_sess [.F..]: total number of HTTP/1 sessions since process started
106. h2_sess [.F..]: total number of HTTP/2 sessions since process started
107. h3_sess [.F..]: total number of HTTP/3 sessions since process started
108. req_other [.F..]: total number of sessions other than HTTP processed by
this object since the worker process started
109. h1req [.F..]: total number of HTTP/1 sessions processed by this object
since the worker process started
110. h2req [.F..]: total number of hTTP/2 sessions processed by this object
since the worker process started
111. h3req [.F..]: total number of HTTP/3 sessions processed by this object
since the worker process started
112. proto [L...]: protocol
113. priv_idle_cur [...S]: current number of private idle connections
114. reqbin [LFBS]: total number of request bytes received since the worker
process started
115. reqbout [LFBS]: total number of request bytes sent since the worker
process started
116. resbin [LFBS]: total number of response bytes received since the worker
process started
117. resbout [LFBS]: total number of response bytes sent since the worker
process started对于所有其他统计信息域,字段的存在与否或顺序均无法保证。此时,应始终使用头行来解析 CSV 数据。
9.2. 类型化输出格式
“show info” 和 “show stat” 均支持一种模式,其中每个输出值均附带其类型,以及足够信息以明确该值在进程间应如何聚合,以及其如何演变。
在所有情况下,输出格式为每行仅包含一个值,所有信息均以冒号(’:’)分隔的字段形式呈现。
第一列指定被转储的对象或指标。其格式由生成此输出的命令决定,本节不作说明。通常由一系列标识符和字段名组成。
第二列包含四个字符,分别表示所报告值的来源、性质、作用域和持久性状态。第一个字符(来源)表示该值的提取位置。可能的字符如下:
M The value is a metric. It is valid at one instant any may change depending
on its nature .
S The value is a status. It represents a discrete value which by definition
cannot be aggregated. It may be the status of a server ("UP" or "DOWN"),
the PID of the process, etc.
K The value is a sorting key. It represents an identifier which may be used
to group some values together because it is unique among its class. All
internal identifiers are keys. Some names can be listed as keys if they
are unique (eg: a frontend name is unique). In general keys come from the
configuration, even though some of them may automatically be assigned. For
most purposes keys may be considered as equivalent to configuration.
C The value comes from the configuration. Certain configuration values make
sense on the output, for example a concurrent connection limit or a cookie
name. By definition these values are the same in all processes started
from the same configuration file.
P The value comes from the product itself. There are very few such values,
most common use is to report the product name, version and release date.
These elements are also the same between all processes.第二个字符(即类型)用于表示字段所携带信息的性质,以便聚合器决定对多个值进行聚合时应采用的操作。可能的字符包括:
A The value represents an age since a last event. This is a bit different
from the duration in that an age is automatically computed based on the
current date. A typical example is how long ago did the last session
happen on a server. Ages are generally aggregated by taking the minimum
value and do not need to be stored.
a The value represents an already averaged value. The average response times
and server weights are of this nature. Averages can typically be averaged
between processes.
C The value represents a cumulative counter. Such measures perpetually
increase until they wrap around. Some monitoring protocols need to tell
the difference between a counter and a gauge to report a different type.
In general counters may simply be summed since they represent events or
volumes. Examples of metrics of this nature are connection counts or byte
counts.
D The value represents a duration for a status. There are a few usages of
this, most of them include the time taken by the last health check and
the time a server has spent down. Durations are generally not summed,
most of the time the maximum will be retained to compute an SLA.
G The value represents a gauge. It's a measure at one instant. The memory
usage or the current number of active connections are of this nature.
Metrics of this type are typically summed during aggregation.
L The value represents a limit (generally a configured one). By nature,
limits are harder to aggregate since they are specific to the point where
they were retrieved. In certain situations they may be summed or be kept
separate.
M The value represents a maximum. In general it will apply to a gauge and
keep the highest known value. An example of such a metric could be the
maximum amount of concurrent connections that was encountered in the
product's life time. To correctly aggregate maxima, you are supposed to
output a range going from the maximum of all maxima and the sum of all
of them. There is indeed no way to know if they were encountered
simultaneously or not.
m The value represents a minimum. In general it will apply to a gauge and
keep the lowest known value. An example of such a metric could be the
minimum amount of free memory pools that was encountered in the product's
life time. To correctly aggregate minima, you are supposed to output a
range going from the minimum of all minima and the sum of all of them.
There is indeed no way to know if they were encountered simultaneously
or not.
N The value represents a name, so it is a string. It is used to report
proxy names, server names and cookie names. Names have configuration or
keys as their origin and are supposed to be the same among all processes.
O The value represents a free text output. Outputs from various commands,
returns from health checks, node descriptions are of such nature.
R The value represents an event rate. It's a measure at one instant. It is
quite similar to a gauge except that the recipient knows that this measure
moves slowly and may decide not to keep all values. An example of such a
metric is the measured amount of connections per second. Metrics of this
type are typically summed during aggregation.
T The value represents a date or time. A field emitting the current date
would be of this type. The method to aggregate such information is left
as an implementation choice. For now no field uses this type.第三个字符(作用域)表示该值所反映的范围。某些元素可能与进程相关,而其他元素可能与配置或系统相关。明确这一区别至关重要,以判断在聚合过程中是否应保留单一值,还是必须对多个值进行聚合。当前支持的字符如下:
C The value is valid for a whole cluster of nodes, which is the set of nodes
communicating over the peers protocol. An example could be the amount of
entries present in a stick table that is replicated with other peers. At
the moment no metric use this scope.
P The value is valid only for the process reporting it. Most metrics use
this scope.
S The value is valid for the whole service, which is the set of processes
started together from the same configuration file. All metrics originating
from the configuration use this scope. Some other metrics may use it as
well for some shared resources (eg: shared SSL cache statistics).
s The value is valid for the whole system, such as the system's hostname,
current date or resource usage. At the moment this scope is not used by
any metric.第四个字符(持久性状态)表示该值(指标)在重载后是否保持持久。后续字符的含义如下:
V The metric is volatile because it is local to the current process so
the value will be lost when reloading.
P The metric is persistent because it may be shared with other co-processes
so that the value is preserved across reloads.消费这些信息的用户通常只需具备这 4 个字符即可准确报告跨多个进程的聚合信息。
在该列之后,第三列指示字段类型,包括 “s32”(有符号 32 位整数)、“s64”(有符号 64 位整数)、“u32”(无符号 32 位整数)、“u64”(无符号 64 位整数)和 “str”(字符串)。在解析值之前,必须了解其类型,以确保正确读取。例如,仅包含数字的字符串仍然是字符串,而非整数(如通过检查获取的错误码)。
第四列是值本身,其编码方式根据类型而定。字符串在冒号后直接输出,不加任何前导空格。若字符串中包含冒号,将正常显示。这意味着输出不应仅通过冒号进行分割,否则某些检查输出或服务器地址可能被截断。
9.3. Unix 套接字命令
统计信息套接字默认未启用。如需启用,必须在 HAProxy 配置的 global 段中添加一行配置。建议添加第二行以设置更大的超时值,手动执行命令时此设置始终有益:
也可以通过重复该行来添加多个统计信息套接字实例,并使其监听 TCP 端口而非 Unix 套接字。默认情况下从不这样做,因为存在安全隐患,但在某些情况下可能较为方便:
global
stats socket /var/run/haproxy.sock mode 600 level admin
stats socket ipv4@192.168.0.1:9999 level admin
stats timeout 2m要访问套接字,需要使用外部工具,例如“socat”。Socat 是一款功能强大的工具,可用于连接任意两个端点。我们使用它将终端连接到套接字,或将其与若干 stdin/stdout 管道连接,以供脚本使用。我们将主要使用以下两种语法:
第一个用于脚本。可以将脚本的输出发送给 HAProxy,并将 HAProxy 的输出传递给另一个脚本。例如,这在获取计数器或攻击追踪信息时非常有用。
第二个仅适用于手动执行命令。其优势在于终端由 readline 库处理,支持行编辑和历史记录,当重复执行命令时(例如:监视计数器)非常方便。
套接字支持三种操作模式:
- 非交互式,静默模式
- 交互式,静默模式
- 交互式,带提示
非交互模式是 socat 与套接字连接时的默认模式。在此模式下,可发送单行内容。该行将作为整体被处理,响应会返回,并在响应结束时关闭连接。此模式通常由脚本和监控工具使用。在此模式下也可以发送多个命令,但需以分号(;)分隔。例如:
如果命令需要使用分号或反斜杠(例如在值中),则必须用反斜杠(’\’)进行转义。
交互模式允许在前一行命令执行完毕后发送新命令。
该模式存在两种变体:一种为静默模式,其行为与非交互模式类似,但套接字会等待新命令而非关闭;另一种在行首显示提示符(\>)。
对于高级工具,推荐使用交互模式;对于人类用户,推荐使用带提示符的模式。
可以使用 “prompt” 命令更改模式。默认情况下,该命令在交互模式与提示模式之间切换。在交互模式下输入 “prompt” 将切换至提示模式。该命令可选择性地指定以下特定模式之一:
- “n”:非交互模式(执行单个命令后退出)
- “i”:交互模式(执行多个命令,无提示符)
- “p”:提示符模式(执行多个命令,带有提示符)
由于默认模式为非交互式,必须首先使用“prompt”命令切换模式,否则前一条命令将导致连接关闭。切换至非交互式模式后,同一行的所有命令执行完毕,连接将被关闭。
因此,在手动调试时,通常会从执行“prompt”命令开始:
show info …
交互式工具可能更倾向于使用“prompt i”来切换至交互模式,而无需显示提示符。
可选地,提示符中可显示进程的运行时间。为启用此功能,使用命令 prompt timed 可启用提示符并切换时间显示状态。运行时间以格式 “d:hh:mm:ss” 显示,其中 “d” 表示天数,“hh”、“mm”、“ss” 分别表示以两位数字表示的小时、分钟和秒:
[23:03:34:39]> show version 2.8-dev9-e5e622-18
[23:03:34:41]> quit
当在主 CLI 上设置定时提示时,提示符将显示当前选定进程的运行时间,因此该功能适用于主进程、当前工作进程或较早的工作进程:
master> prompt timed
[0:00:00:50] master> show proc
(...)
[0:00:00:58] master> @!11955 <-- master, switch to current worker
[0:00:01:03] 11955> @!11942 <-- current worker, switch to older worker
[0:00:02:17] 11942> @ <-- older worker, switch back to master
[0:00:01:10] master>由于可同时发出多个命令,HAProxy 使用空行作为分隔符,以标记每个命令输出的结束,并确保没有任何命令会在输出中产生空行。因此,脚本可以轻松解析输出,即使多个命令在单行中通过管道传递。
部分命令可接受可选负载。若需为命令添加负载,首行必须以 “<<\n” 模式结尾。后续行将被视为负载内容,可包含任意行数。验证带负载的命令时,需以空行结尾。
负载内容的结束模式可自定义,以改变负载的结束方式。若需以非空行的方式结束负载,可在 << 与 \n 之间设置自定义模式。除 << 外,最多可使用 64 个字符,否则将不被视为有效负载。使用随机负载模式通常已足够。例如,使用包含空行和注释的 PEM 文件时:
# echo -e "set ssl cert common.pem <<%EOF%\n$(cat common.pem)\n%EOF%\n" | \
socat /var/run/haproxy.stat -存在限制:模式 “<<” 不能紧接在行末最后一个单词之后。命令行长度不得超过 tune.bufsize,包括启动负载的模式,但不包含负载本身。负载大小默认限制为 128KB。可通过设置 “tune.cli.max-payload-size” 全局参数进行修改,但需注意相关注意事项。请注意,标记负载结束的模式也包含在此限制范围内。
在交互模式下输入负载时,提示符将从“> ”变为“+ ”。
当多个 HAProxy 进程在相同套接字上启动时,任意一个进程都可能接收请求,并输出其自身的统计信息。
当前支持的统计套接字命令列表如下。若发送了未知命令,HAProxy 将显示使用说明,提醒所有支持的命令。部分命令支持更复杂的语法,通常在出现错误时会说明命令中哪一部分无效。
部分命令需要更高权限才能执行。若权限不足,将收到错误提示“权限被拒绝”。请参阅配置手册中“bind”关键字行的“level”选项以获取更多信息。
abort ssl ca-file <cafile>
中止并销毁临时 CA 文件更新事务。
另请参见“set ssl ca-file”和“commit ssl ca-file”。
abort ssl cert <filename>
中止并销毁临时 SSL 证书更新事务。
另请参见“set ssl cert”和“commit ssl cert”。
abort ssl crl-file <crlfile>
中止并销毁临时 CRL 文件更新事务。
另请参见“set ssl crl-file”和“commit ssl crl-file”。
acme renew <certificate>
启动一个使用指定证书名称的 ACME 证书生成任务。该证书必须关联至一个 acme 段,参见配置手册第 12.8 段“ACME”。另请参阅“acme status”。
acme status
显示所有使用 ACME 配置的证书的状态。
该命令以制表符分隔输出:
- HAProxy 中配置的证书名称
- 配置中使用的 acme 段
- acme 任务的状态,取值为 “Running”、“Scheduled” 或 “Stopped”
- 证书的 UTC 过期日期,格式为 ISO8601
- 相对过期时间(已过期则为 0d)
- 证书的 UTC 预定日期,格式为 ISO8601
- 相对预定时间(若处于 Running 状态则为 0d)
示例:
$ echo "@1; acme status" | socat /tmp/master.sock - | column -t -s $'\t'
# certificate section state expiration date (UTC) expires in scheduled date (UTC) scheduled in
ecdsa.pem LE Running 2020-01-18T09:31:12Z 0d 0h00m00s 2020-01-15T21:31:12Z 0d 0h00m00s
foobar.pem.rsa LE Scheduled 2025-08-04T11:50:54Z 89d 23h01m13s 2025-07-27T23:50:55Z 82d 11h01m14sadd acl [@<ver>] <acl> <pattern>
向 ACL <acl> 中添加一项。<acl> 为 #<id> 或由 “show acl” 返回的 <name>。
该命令不会验证该项是否已存在。除非使用 “@<ver>” 指定特定版本,否则条目将添加至当前 ACL 版本。该版本号必须事先通过 “prepare acl” 分配,且其值须位于 “show acl” 输出中报告的 “curr_ver” 与 “next_ver” 之间。使用特定版本号添加的条目,需在执行 “commit acl” 操作后方可生效匹配。但可使用 “show acl @<ver>” 命令查阅,或通过 “clear acl @<ver>” 命令清除。
若参考 <acl> 为与映射(map)同名的名称,则禁止使用此命令。此时应改用 “add map” 命令。
add backend <name> from <defproxy> [mode <mode>] [guid <guid>]
使用名称 <name> 实例化一个新的后端代理。
仅可创建 TCP 或 HTTP 代理。所有设置均继承自 <defproxy> 默认代理实例。默认情况下,除非 <defproxy> 显式定义了后端模式,否则必须通过同名参数指定后端模式。如需,也可选择性地使用 GUID 参数。
可通过命令 add server 添加服务器。后端将以未发布状态初始化。确认已就绪可接收流量后,请使用 publish backend 命令发布新创建的实例。
所有命名的默认代理均可使用,前提是它们符合配置解析过程中应用的相同继承规则。不过存在一些例外情况,例如当模式既非 TCP 也非 HTTP 时。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
add map [@<ver>] <map> <key> <value>
向映射 <map> 中添加一项,将值 <value> 关联至键 <key>。该命令不会验证该项是否已存在。主要用于在执行“clear”或“prepare”操作后填充映射。除非使用 “@<ver>” 指定特定版本,否则条目将添加至当前 ACL 版本。该版本号必须事先通过“prepare acl”分配,并且其数值范围应位于“show acl”输出中报告的 “curr_ver” 与 “next_ver” 之间。使用特定版本号添加的条目,需在执行“commit map”操作后方可匹配。但可通过“show map @<ver>”命令查阅,或通过“clear acl @<ver>”命令清除。若指定的映射同时用作 ACL,则 ACL 仅匹配 <key> 部分,忽略 <value> 部分。使用载荷语法时,可通过在不同行中输入多个键/值对来添加多组键值对。每行中首个词为键,其余部分视为值,值中可包含空格。
示例:
# socat /tmp/sock1 -
prompt
> add map #-1 <<
+ key1 value1
+ key2 value2 with spaces
+ key3 value3 also with spaces
+ key4 value4
>add server <backend>/<server> [args]*
为后端 <backend> 创建一个新的服务器。
<server> 名称在后端中不得已存在。后端必须使用动态负载均衡算法,对此有特殊限制。可从服务器配置文件语句中选取部分关键字来配置服务器行为(参见“add server help”以获取可用关键字列表)。请注意,同一后端中若存在虚构的 ‘default-server’ 语句,其设置将不会被复用。
当前,动态服务器使用“none” init-addr 方法进行静态初始化。这意味着,即使服务器创建将被验证,若指定的地址为完全限定域名(FQDN),也不会执行解析。
为支持重载操作,通过 CLI 创建的服务器也应手动插入相应的 HAProxy 配置文件中。未在配置文件中出现的动态服务器在重载操作后将无法恢复。
动态服务器可使用“track”关键字来跟踪配置中另一台服务器的检查状态。然而,无法跟踪另一台动态服务器。此举旨在确保即使在删除动态服务器的情况下,跟踪链仍保持一致。
使用 “check” 关键字启用健康检查支持。请注意,健康检查默认处于禁用状态,必须通过 “enable health” 命令独立启用服务器的健康检查功能。对于代理检查,使用 “agent-check” 关键字和 “enable agent” 命令。请注意,在此情况下,服务器可能根据代理报告的状态自动激活,无需显式执行 “enable server” 命令。这也意味着在移除具有代理检查的动态服务器时需格外谨慎。应首先通过 “disable agent” 命令停用代理,再将服务器置于所需的维护模式,方可执行移除操作。
在使用大量动态服务器时,可能会达到文件描述符限制。请参考本文中“u-limit”全局关键字的文档。
add server help
列出当前 HAProxy 版本支持的动态服务器关键字。关键字语法与配置文件中的服务器行类似,请参阅各自文档以获取详细信息。
add ssl ca-file <cafile> <payload>
向 ca-file 添加新证书。当 CLI 的缓冲区大小达到上限且需要添加多个证书时,此命令非常有用。无需通过“set”命令一次性设置所有证书,可逐个添加证书。执行“set ssl ca-file”将重置 ca-file。
示例:
echo -e "set ssl ca-file cafile.pem <<\n$(cat rootCA.crt)\n" | \
socat /var/run/haproxy.stat -
echo -e "add ssl ca-file cafile.pem <<\n$(cat intermediate1.crt)\n" | \
socat /var/run/haproxy.stat -
echo -e "add ssl ca-file cafile.pem <<\n$(cat intermediate2.crt)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl ca-file cafile.pem" | socat /var/run/haproxy.stat -add ssl crt-list <crtlist> <certificate>
在 crt-list 中添加证书。该命令也可用于目录,因为目录现在与 crt-list 的加载方式相同。若需在参数中使用证书名称,允许使用 SSL 选项或过滤器,此时 crt-list 行必须作为负载发送。负载中仅支持一条 crt-list 行。该命令将为所有使用 crt-list 的 bind 行加载证书。若要向 HAProxy 推送新证书,必须使用命令 “new ssl cert” 或 “set ssl cert”。
示例:
$ echo "new ssl cert foobar.pem" | socat /tmp/sock1 -
$ echo -e "set ssl cert foobar.pem <<\n$(cat foobar.pem)\n" | socat
/tmp/sock1 -
$ echo "commit ssl cert foobar.pem" | socat /tmp/sock1 -
$ echo "add ssl crt-list certlist1 foobar.pem" | socat /tmp/sock1 -
$ echo -e 'add ssl crt-list certlist1 <<\nfoobar.pem [allow-0rtt] foo.bar.com
!test1.com\n' | socat /tmp/sock1 -add ssl ech <bind> <payload>
向 <bind> 行添加 ECH 密钥。有效载荷必须采用 ECH 格式的 PEM 格式。
(https://datatracker.ietf.org/doc/html/draft-farrell-tls-pemesni
)
绑定行格式为 <frontend>/@<filename>:<linenum>(例如:frontend1/@HAProxy.conf:19),或 <frontend>/<name>(若绑定行使用了 “name” 关键字命名)。
必须使用支持 ECH 的 OpenSSL 版本,且 HAProxy 必须以 USE_ECH=1 编译。 该命令仅在以实验模式运行的 CLI 连接中受支持(参见“experimental-mode on”)。
另请参见配置手册 第 5.1 节 中的 “show ssl ech” 和 “ech”。
示例:
$ openssl ech -public_name foobar.com -out foobar3.com.ech
$ echo -e "experimental-mode on; add ssl ech frontend1/@haproxy.conf:19 <<%EOF%\n$(cat foobar3.com.ech)\n%EOF%\n" | \
socat /tmp/haproxy.sock -
added a new ECH config to frontend1add ssl jwt <filename>
将已加载的证书添加到可用于 JWT 验证的证书列表中(参见 “jwt_verify_cert” 转换器)。该命令在正在进行的事务中无效。另请参见“del ssl jwt”和“show ssl jwt”命令。有关更多信息,请参见“jwt”证书选项。
clear counters
清除每个代理(前端和后端)及每个服务器的统计信息计数器的最大值。累积计数器不受影响。“show activity” 命令报告的内部活动计数器也会被重置。此命令可用于在事件发生后获取干净的计数器,而无需重启或清除流量计数器。该命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。
clear counters all
清除每个代理(前端与后端)及每个服务器的统计信息计数器。此操作效果等同于重启。该命令受限制,仅可在配置为“admin”级别的套接字上执行。
clear acl [@<ver>] <acl>
从 acl <acl> 中移除所有条目。<acl> 为 “show acl” 返回的 #<id> 或 <name>。请注意,若引用 <acl> 为名称且与映射共享,则该映射也将被清空。默认情况下仅清除当前版本的 ACL(即正在匹配的版本)。但也可通过在版本号前加 ‘@’ 来指定清除其他版本。
clear map [@<ver>] <map>
清除映射 <map> 中的所有条目。<map> 为 “show map” 返回的 #<id> 或 <name>。请注意,如果引用 <map> 为名称且与某个 acl 共享,则该 acl 也将被清除。默认情况下仅清除当前版本的映射(即正在匹配的版本)。但可以使用 ‘@’ 加上指定版本的方式,清除其他版本。
clear table <table> [ data.<type> <operator> <value> ] | [ key <key> ] |
从粘性表 <table> 中移除条目。
这通常用于解除某些用户因被不当拒绝访问服务而产生的问题,也可用于清除将要被替换的服务器所匹配的会话粘性条目(详见下文“show table”部分)。请注意,有时删除条目会被拒绝,因为该条目当前正被某个会话跟踪。会话结束后等待几秒再重试是常见做法。
若未提供任何选项参数,将删除所有条目。
当使用 “data.” 形式时,将移除与通过存储数据应用的过滤器匹配的条目(参见第 4.2 段中的 “stick-table”)。必须在 <type> 中指定存储数据类型,且该数据类型必须已存储在表中,否则将报告错误。数据将根据 <operator> 与 64 位整数 <value> 进行比较。操作符与 ACL 中的相同:
- eq: match entries whose data is equal to this value
- ne: match entries whose data is not equal to this value
- le: match entries whose data is less than or equal to this value
- ge: match entries whose data is greater than or equal to this value
- lt: match entries whose data is less than this value
- gt: match entries whose data is greater than this value
使用键形式时,条目 <key> 将被移除。键的类型必须与表类型相同,当前仅限于 IPv4、IPv6、整数和字符串。
使用 ptr 形式时,条目 <ptr> 将被移除。<ptr> 以 0xffff 格式写入,必须与之前执行“show table”命令返回的地址对应。当因键为空或 CLI 上存在不兼容字符而无法通过键匹配条目时,使用指针匹配条目可能具有实际意义。
如果 data.<type> 为数组类型,可以使用 “[]” 访问数组中的特定索引,例如:data.gpt[1]
示例:
$ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1 \
bytes_out_rate(60000)=187
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
bytes_out_rate(60000)=200
$ echo "clear table http_proxy key 127.0.0.1" | socat stdio /tmp/sock1
$ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:1
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
bytes_out_rate(60000)=200
bytes_out_rate(60000)=191
$ echo "clear table http_proxy data.gpc0 eq 1" | socat stdio /tmp/sock1
$ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:1
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
bytes_out_rate(60000)=200
$ echo "clear table http_proxy ptr 0x80e6b40" | socat stdio /tmp/sock1
$ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:0commit acl @<ver> <acl>
提交对 ACL <acl> 版本 <ver> 所做的全部更改,并删除所有历史版本。<acl> 为“show acl”返回的 #<id> 或 <name>。版本号必须介于 “show acl” 报告的 “curr_ver”+1 与 “next_ver” 之间。如需查看将提交至 ACL 的内容,可使用 “show acl @<ver> <acl>” 查询。指定的版本号通常由 “prepare acl” 命令创建。该替换操作为原子操作,其过程为将当前版本原子性地更新为指定版本,这将立即使其他版本中的所有条目不可见,同时使新版本中的所有条目变为可见。也可通过先执行 “prepare acl”,再不添加任何条目即进行提交的方式,使用本命令实现对 ACL 中所有可见条目的原子性删除。若引用 <acl> 为同时用作映射的名称,则不得使用本命令,此时应改用 “commit map” 命令。
commit map @<ver> <map>
提交对映射 <map> 版本 <ver> 所做的全部更改,并删除所有历史版本。<map> 为 “show map” 返回的 #<id> 或 <name>。版本号必须介于 “curr_ver” + 1 与 “next_ver” 之间,该范围由 “show map” 命令报告。如需查看将提交至映射的内容,可使用 “show map @<ver> <map>” 命令查询。指定的版本号通常通过 “prepare map” 命令创建。该替换操作为原子操作,其过程为将当前版本原子性地更新为指定版本,这将立即使其他版本中的所有条目不可见,同时使新版本中的所有条目变为可见。也可通过先执行 “prepare map”,再不添加任何条目即执行提交,来实现对映射中所有可见条目的原子性删除。
commit ssl ca-file <cafile>
提交临时 SSL CA 文件更新事务。
若存在已有的 CA 文件(在“show ssl ca-file”中显示为“Used”状态),则将新的 CA 文件树条目插入 CA 文件树中,并重建所有使用该 CA 文件条目的实例及其所需的 SSL 上下文。所有先前由已重建实例使用的上下文将被移除。成功后,从树中移除原有的 CA 文件条目。失败时,不进行任何删除或移除操作,所有原始 SSL 上下文均保留并继续使用。临时事务提交后,即被销毁。
在新 CA 文件(经“new ssl ca-file”操作后,且处于“show ssl ca-file”中“未使用”状态)的情况下,该 CA 文件将被插入 CA 文件树中,但 HAProxy 不会在任何地方使用它。如需使用该文件并生成使用它的 SSL 上下文,需通过“add ssl crt-list”将其添加至证书列表中。
另请参阅 “new ssl ca-file”、“set ssl ca-file”、“add ssl ca-file”、“abort ssl ca-file” 和 “add ssl crt-list”。
commit ssl cert <filename>
提交临时 SSL 证书更新事务。
若存在现有证书(在 “show ssl cert” 中显示为 “Used” 状态),则生成其所需的全部 SSL 上下文和 SNIs,插入新证书,并移除旧证书。在配置中所有使用 <filename> 的位置,将其在内存中替换为新证书。若操作失败,则不执行任何删除或插入操作。临时事务提交后,立即销毁。
在新证书(经“new ssl cert”操作后,且在“show ssl cert”中处于“Unused”状态)的情况下,该证书将被提交至证书存储,但 HAProxy 中不会在任何地方使用它。若要使用该证书并生成其 SNI,需将其添加至 crt-list 或通过“add ssl crt-list”添加至目录。
另请参阅 “new ssl cert”、“set ssl cert”、“abort ssl cert” 和 “add ssl crt-list”。
commit ssl crl-file <crlfile>
提交临时 SSL CRL 文件更新事务。
在存在现有 CRL 文件(在“show ssl crl-file”中显示为“Used”状态)的情况下,新的 CRL 文件条目将被插入 CA 文件树中(该树同时存储 CA 文件和 CRL 文件),所有使用该 CRL 文件条目的实例都将被重建,以及其所需的 SSL 上下文也将被重建。所有先前由重建后的实例使用的上下文将被移除。成功后,先前的 CRL 文件条目将从树中移除。失败时,不会移除或删除任何内容,所有原始 SSL 上下文将被保留并继续使用。临时事务提交后,将被销毁。
在新 CRL 文件(经“new ssl crl-file”创建且处于“show ssl crl-file”中“未使用”状态)的情况下,该 CRL 文件将被插入 CRL 文件树中,但 HAProxy 任何地方都不会使用它。要使用该文件并生成使用它的 SSL 上下文,需通过“add ssl crt-list”将其添加至 crt-list。
另请参见 “new ssl crl-file”、“set ssl crl-file”、“abort ssl crl-file” 和 “add ssl crt-list”。
debug counters [reset|show|on|off|all|bug|chk|cnt|glt|?]*
列出代码中内置的计数器,其具体数量可能因构建选项而异。部分计数器依赖于 DEBUG_STRICT,另一些则依赖于 DEBUG_COUNTERS。该命令接受多个参数的组合,其中部分参数定义动作,另一些定义过滤器:- bug 用于列出 BUG_ON() 语句的计数器 - cnt 用于列出 COUNT_IF() 语句的计数器 - chk 用于列出 CHECK_IF() 语句的计数器 - glt 用于列出 COUNT_GLITCH() 语句的计数器 - all 用于显示从未触发过的计数器(值为 0) - off 动作:禁用 COUNT_IF() 计数器的更新 - on 动作:启用 COUNT_IF() 计数器的更新 - reset 动作:重置所有指定的计数器 - show 动作:显示所有指定的计数器
默认情况下,动作为“show”,用于显示计数器,列出的计数器均为非零值的类型。当未指定其他动作时,“show”命令为隐式执行,仅用于便于从脚本中生成命令。
输出以一个整数计数器开头,后接大写的计数器类型,接着是其在代码中的位置(文件:行号)、函数名称,以及可选的“: ”和描述。请注意,输出格式可能在主版本之间发生变化,且为提升调试能力,新类型和条目可能会被回溯应用到稳定版本中。对这些输出的监控应仅以极为宽松和宽松的方式进行,最好避免。
通常情况下,终端用户不会使用此命令,但开发者在排查问题、查找 CNT 或 GLT 条目时,可能会邀请用户执行该命令。需要注意的是,非零的“CHK”条目不应出现,若发现此类情况,应报告给开发者,因为这可能表明代码中存在错误的假设。
debug dev <command> [args]*
调用开发者专用命令。仅在以专家模式运行的 CLI 连接中受支持(参见“expert-mode on”)。此类命令极为危险且不容出错,误用可能导致进程崩溃。它们仅限专家使用,除非明确指示,否则务必不可使用。部分命令仅在编译 HAProxy 时定义了 DEBUG_DEV 时才可用,因其可能带来安全风险。所有这些命令均需管理员权限,且故意未被文档化,以避免促使不熟悉源代码的人员使用。
del acl <acl> [<key>|#<ref>]
从映射 <acl> 中删除与键 <key> 对应的所有 ACL 条目。<acl> 为 “show acl” 返回的 #<id> 或 <name>。若使用 <ref>,则仅删除列出的引用。引用可通过列出映射内容获取。请注意,若引用 <acl> 为名称且与映射共享,则该条目在映射中也将被删除。
del backend <name>
删除名为 <name> 的后端代理。
此操作仅适用于 TCP 或 HTTP 代理。要成功执行,后端实例必须已先取消发布。此外,其所有服务器必须先移除(通过 “del server” 命令行工具)。最后,后端实例上不得仍存在任何关联的流。
存在额外限制,阻止后端的移除。首先,若后端被配置元素显式引用,则无法移除,例如通过 use_backend 规则或在样本表达式中引用。部分代理选项与运行时删除不兼容。目前,当使用已弃用的 dispatch 或 option transparent 时即属此类情况。此外,若后端中声明了 stick-table,则无法移除该后端。最后,若后端中曾存在 QUIC 服务器,则目前无法移除该后端。
在执行此命令前,使用“wait be-removable”检查上述要求可能很有用。这还提供了一种等待与目标后端关联的流最终关闭的方法。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
del map <map> [<key>|#<ref>]
从映射 <map> 中删除对应键 <key> 的所有条目。<map> 为“show map”命令返回的 #<id> 或 <name>。若使用 <ref>,则仅删除列出的引用。引用可通过列出映射内容来查找。请注意,若引用 <map> 为名称且与某个 acl 共享,则该条目在映射中也将被删除。
del ssl ca-file <cafile>
从 HAProxy 中删除 CA 文件树条目。CA 文件必须未被使用,并且已从任何 crt-list 中移除。
使用 “show ssl ca-file” 可查看 CA 文件的状态。若证书通过配置中的 “ca-file” 或 “ca-verify-file” 指令直接引用,则无法执行删除操作。
del ssl cert <certfile>
从 HAProxy 中删除证书存储。证书必须未被使用(例如用于 JWT 验证),且已从任意 crt-list 或目录中移除。“show ssl cert” 命令可显示证书状态。若证书通过配置中的 “crt” 指令直接引用,则无法执行删除操作。
del ssl crl-file <crlfile>
从 HAProxy 中删除 CRL 文件树条目。CRL 文件必须未被使用,并且已从任何 crt-list 中移除。“show ssl crl-file” 命令显示 CRL 文件的状态。若证书通过配置中的 “crl-file” 指令直接引用,则无法执行删除操作。
del ssl crt-list <filename> <certfile[:line]>
从 crt-list 中删除条目。此操作将删除该条目在前端中使用的所有 SNI。若证书在 crt-list 中多次使用,需指定要删除的行号。如需显示行号,请使用命令 “show ssl crt-list -n <crtlist>"。
del ssl ech <bind>
删除绑定行中的 ECH 密钥。
绑定行格式为 <frontend>/@<filename>:<linenum>(例如:frontend1/@HAProxy.conf:19),或 <frontend>/<name>(若绑定行使用了 “name” 关键字命名)。
必须使用支持 ECH 的 OpenSSL 版本,且 HAProxy 必须以 USE_ECH=1 编译。 该命令仅在以实验模式运行的 CLI 连接中受支持(参见“experimental-mode on”)。
另请参见配置手册 第 5.1 节 中的 “show ssl ech”、“add ssl ech” 和 “ech”。
示例:
$ echo "experimental-mode on; del ssl ech frontend1/@haproxy.conf:19" | socat /tmp/haproxy.sock -
deleted all ECH configs from frontend1/@haproxy.conf:19del ssl jwt <filename>
从可用于 JWT 验证的证书列表中移除已加载的证书 (参见 “jwt_verify_cert” 转换器)。该命令在正在进行的事务中无效。另请参见 “add ssl jwt” 和 “show ssl jwt” 命令。有关更多信息,请参见 “jwt” 证书选项。
del server <backend>/<server>
从后端 <backend> 中删除一个可移除的服务器。可移除的服务器是指同时满足以下所有条件的服务器:
- 未被其他配置元素引用
- 必须已进入维护模式(参见“disable server”)
- 不得有任何活动或空闲连接
如果满足以下任一条件,则该命令将执行失败。
活跃连接是指至少有一个正在进行的请求的连接。可以使用“shutdown sessions server”命令加速其终止。建议在执行“del server”前使用“wait srv-removable”,以确保所有活跃或空闲连接均已关闭,从而保证命令执行成功。
disable agent <backend>/<server>
将辅助代理检查标记为临时停止。
当代理检查作为辅助检查运行时(由于服务器指令中的 agent-check 参数),仅当代理处于启用状态时才会初始化新的检查。因此,禁用代理将阻止任何新的代理检查启动,直至通过 enable agent 重新启用代理。
当代理被禁用时,若在代理处于启用状态期间已启动辅助代理检查,则处理流程如下:所有可能改变权重的结果,特别是“drain”或代理返回的权重,均被忽略。代理检查的处理过程其余部分保持不变。
此功能的动机在于,允许暂停代理检查对权重的影响,以便在使用 set weight 配置服务器权重时,不会被代理检查所覆盖。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
disable dynamic-cookie backend <backend>
禁用为后端 <backend> 生成动态 Cookie
disable frontend <frontend>
将前端标记为临时停止。这对应于软重启期间所使用的模式:前端会释放端口,但在需要时可重新启用。使用时应谨慎,因为某些非 Linux 操作系统无法重新启用该前端。此功能适用于那些无法想象停止代理的环境,但又必须修复配置错误的代理时。通过这种方式,可以释放端口,并将其绑定到另一个进程以恢复操作。在统计信息页面上,该前端将显示状态为“STOP”。
前端可通过其名称或其数字 ID 指定,数字 ID 前需加井号(’#’)。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
disable health <backend>/<server>
将主健康检查标记为临时停止。这将停止发送健康检查,且忽略最后一次健康检查结果。服务器将处于未检查状态,并被视为 UP,除非辅助代理检查强制其变为 DOWN。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
disable server <backend>/<server>
将服务器标记为维护状态。在此模式下,直到服务器退出维护状态前,将不再对该服务器执行任何检查。如果其他服务器跟踪此服务器,这些服务器将在维护期间被设置为不可用。
在统计信息页面中,因维护而处于 DOWN 状态的服务器将显示为“MAINT”状态,其关联的追踪服务器则显示为“MAINT(via)”状态。
后端和服务器均可通过其名称或编号指定,编号前需加井号(’#’)。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
dump ssl cert <certfile>
将 HAProxy 内存中加载的证书转储。转储内容按 PEM 格式输出证书,随后是私钥,接着是叶证书,最后是证书链。可通过在文件名前加上星号来转储事务。此操作在通过 CLI 更新证书但未同步到文件系统时,用于将证书保存至文件系统,十分有用。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
示例:
$ echo "dump ssl cert cert1.pem" | socat /tmp/sock1 -
$ echo "dump ssl cert cert1.pem" | socat /tmp/sock1 - | openssl storeutl -noout -text /dev/stdindump stats-file
生成一个统计文件,该文件可用于在启动时预加载 HAProxy 计数器的值。详见“统计文件”段获取更多详情。
echo <text>
通过 CLI 输出一些文本。在导出多个命令结果时,可在命令之间添加注释,此功能可能有用。
示例:
echo "expert-mode on; echo FDs from fdtab; show fd; echo wild FDs; debug dev fd" | socat /var/run/haproxy.sock -enable agent <backend>/<server>
恢复被临时停止的辅助代理检查。
有关临时启动和停止辅助代理的影响详情,请参见“disable agent”部分。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
enable dynamic-cookie backend <backend>
为后端 <backend> 启用动态 Cookie 生成。必须同时提供密钥。
enable frontend <frontend>
恢复一个曾被临时停止的前端。某些监听端口可能无法重新绑定(例如:在执行“disable frontend”操作后,有其他进程占用了这些端口)。若发生此情况,将显示错误信息。部分操作系统可能无法恢复已被禁用的前端。
前端可通过其名称或其数字 ID 指定,数字 ID 前需加井号(’#’)。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
enable health <backend>/<server>
恢复被临时停止的主健康检查。这将重新启用健康检查的发送。请参见“disable health”获取详细信息。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
enable server <backend>/<server>
如果服务器之前因维护被标记为 DOWN,则此操作将服务器标记为 UP 并重新启用检查。
后端和服务器均可通过其名称或编号指定,编号前需加井号(’#’)。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
experimental-mode [on|off]
不带选项时,表示当前连接上是否启用了实验模式。传入 “on” 时,仅对当前 CLI 连接启用实验模式。传入 “off” 时,将其关闭。
实验模式用于访问仍在开发中的额外功能。这些功能当前尚不稳定,应谨慎使用。它们可能在不同版本间发生破坏性变更。
在主 CLI 中使用此命令时,不应添加前缀,因为该命令将在任何工作进程连接到其 CLI 时设置其模式。
示例:
echo "@1; experimental-mode on; <experimental_cmd>..." | socat /var/run/haproxy.master -
echo "experimental-mode on; @1 <experimental_cmd>..." | socat /var/run/haproxy.master -expert-mode [on|off]
该命令与 experimental-mode 类似,但用于切换专家模式。
专家模式可显示可能对进程造成极大危害的高级命令,这些命令偶尔可帮助开发者收集复杂错误的关键信息。误用这些功能极可能导致进程崩溃。请勿在未被邀请的情况下使用此选项。请注意,该命令故意未列在帮助消息中,仅在管理员级别下可用。切换至其他级别将自动重置专家模式。
在主 CLI 中使用此命令时,不应添加前缀,因为该命令将在任何工作进程连接到其 CLI 时设置其模式。
示例:
echo "@1; expert-mode on; debug dev exit 1" | socat /var/run/haproxy.master -
echo "expert-mode on; @1 debug dev exit 1" | socat /var/run/haproxy.master -get map <map> <value>
在映射 <map> 或 ACL <acl> 中查找值 <value>。<map> 或 <acl> 为 “show map” 或 “show acl” 命令返回的 <id> 或 <name>。该命令返回与该映射关联的所有匹配模式。此功能适用于调试映射和 ACL。输出格式由每种匹配类型一行组成。每行由空格分隔的词序列构成。
前两个词是:
<match method>: The match method applied. It can be "found", "bool",
"int", "ip", "bin", "len", "str", "beg", "sub", "dir",
"dom", "end" or "reg".
<match result>: The result. Can be "match" or "no-match".以下词语仅在模式与条目匹配时返回。
`<index type>`: "tree" or "list". The internal lookup algorithm.
`<case>`: "case-insensitive" or "case-sensitive". The
interpretation of the case.
`<entry matched>`: match="`<entry>`". Return the matched pattern. It is
useful with regular expressions.
最后两个词用于显示返回值及其类型。在 “acl” 情况下,该模式不存在。
return=nothing: No return because there are no "map".
return="`<value>`": The value returned in the string format.
return=cannot-display: The value cannot be converted as string.
type="`<type>`": The type of the returned sample.
get var <name>
显示进程级变量 ’name’ 的存在性、类型和内容。仅可读取进程级变量,因此变量名必须以 ‘proc.’ 开头,否则将无法找到该变量。此命令需要具备 “operator” 或 “admin” 权限级别。
get weight <backend>/<server>
报告后端 <backend> 中服务器 <server> 的当前权重和初始权重,若任一不存在则返回错误。初始权重指配置文件中显示的权重。通常两者相等,除非当前权重已被修改。后端和服务器均可通过名称或编号 ID 指定,编号 ID 前需加井号(’#’)。
help [<command>]
显示已知关键字及其基本用法列表,或与请求命令匹配的命令列表。未知命令也会显示相同的帮助屏幕。
httpclient [--htx] <method> <URI>
通过 CLI 发起 HTTP 客户端请求,并在 CLI 上打印响应。仅在以专家模式运行的 CLI 连接中受支持(参见“expert-mode on”)。此功能仅用于调试。httpclient 可通过“default”解析器段解析 URL 中的服务器名称,该段默认包含 /etc/resolv.conf 的 DNS 服务器。但若未使用可解析 /etc/hosts 中主机的本地 DNS 守护进程,则无法解析这些主机。
–htx 选项允许使用 HAProxy 内部的 htx 表示形式,通过 htx_dump() 函数实现,主要用于调试。
new ssl ca-file <cafile>
创建一个全新的空 CA 文件树条目,用于填充一组 CA 证书,并添加至 crt-list。该命令应与 “set ssl ca-file”、“add ssl ca-file” 和 “add ssl crt-list” 一同使用。
new ssl cert <filename>
创建一个全新的空 SSL 证书存储,用于填充证书并添加至目录或 crt-list。此命令应与 “set ssl cert” 和 “add ssl crt-list” 一同使用。
new ssl crl-file <crlfile>
创建一个全新的空 CRL 文件树条目,用于填充一组 CRL 并添加至 crt-list。此命令应与 “set ssl crl-file” 和 “add ssl crt-list” 一同使用。
prepare acl <acl>
在 ACL <acl> 中分配一个新的版本号,以实现原子替换。<acl> 为 “#<id>” 或 “show acl” 返回的 <name>。新版本号将在 “New version created:” 之后的响应中显示。该编号随后可用于准备向 ACL 添加新条目,待提交后将原子式替换当前条目。该版本号在 “show acl” 中报告为 “next_ver”。分配新版本号不会产生任何影响,因为未使用的版本号在提交更近期版本后将自动移除。版本号为无符号 32 位值,达到上限后会回绕,因此在外部程序中比较时需格外小心。若引用 <acl> 为也用作映射的名称,则不得使用此命令。此时应改用 “prepare map” 命令。
prepare map <map>
在映射 <map> 中分配一个新的版本号,以实现原子替换。<map> 为 “show map” 返回的 #<id> 或 <name>。新版本号将在 “New version created:” 之后的响应中显示。该编号随后可用于准备向映射中添加新条目,待提交后将原子性地替换当前条目。在 “show map” 中,该编号报告为 “next_ver”。分配新版本号不会产生任何影响,因为未使用的版本号在提交更近期版本后将自动被移除。版本号为无符号 32 位值,达到上限后会回绕,因此在外部程序中比较时必须格外小心。
prompt [help | n | i | p | timed]*
更改交互模式的行为以及在交互模式下行首显示的提示符: - “help” :显示命令的用法 - “n” :切换至非交互模式 - “i” :切换至交互模式 - “p” :切换至交互模式 + 提示符模式 - “timed” :切换在提示符中显示时间
不带任何选项时,将依次切换至提示模式,然后进入非交互模式。 在非交互模式下,当前行的最后一个命令执行完成后,连接即被关闭。 在交互模式下,命令执行完成后不会关闭连接,以便用户输入新命令。 在提示模式下,仍使用交互模式,行首会显示一个提示符,指示解释器正在等待用户输入新命令。 提示符由一个右角括号后跟一个空格组成,即 “> “。
提示模式更适合人类用户,交互模式适合高级脚本,而非交互模式(默认)适合基础脚本。请注意,主套接字不支持非交互模式。
publish backend <backend>
激活内容切换至后端实例。此操作为“unpublish backend”命令的逆操作。该命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。
quit
在交互模式下关闭连接。
set anon [on|off] [<key>]
本文命令用于启用或禁用当前 CLI 会话的“匿名模式”,该模式会将命令输出中被视为敏感或机密的某些字段替换为哈希值。这些哈希值保留了元素间足够的 一致性,有助于开发者在排查 bug 时识别元素之间的关联,但其位数较低(24 位),由于可能匹配项数量极高,因此无法逆向还原。启用该模式后,若未指定密钥,则将使用全局密钥(在配置文件中通过 “anonkey” 指定,或通过 CLI 命令 “set anon global-key” 设置)。若未设置任何密钥,则将生成一个随机密钥。否则,可指定用于当前会话的 32 位密钥,例如复用之前转储所用的密钥,以帮助对比输出结果。开发者无需此密钥,且建议永不共享,因为该密钥可能被用于确认或否定关于某些哈希值所隐藏内容的猜测。
set dynamic-cookie-key backend <backend> <value>
修改用于生成动态持久化 Cookie 的密钥。这将中断现有会话。
set anon global-key <key>
设置全局匿名化密钥为 <key>,该值必须为 0 到 4294967295 之间的 32 位整数(0 表示禁用全局密钥)。此命令需要管理员权限。
set map <map> [<key>|#<ref>] <value>
修改映射 <map> 中每个键 <key> 对应的值。<map> 为 “show map” 返回的 #<id> 或 <name>。若使用 <ref> 代替 <key>,则仅修改 <ref> 指向的条目。新值为 <value>。
set maxconn frontend <frontend> <value>
动态更改指定前端的 maxconn 设置。允许任意正值,包括零,但设置值超过全局 maxconn 限制并无实际意义。若限制值提高且存在待处理连接,这些连接将立即被接受。若限制值降低至当前连接数以下,新连接的接受将延迟,直至达到阈值。前端可通过其名称或以井号(#)前缀的数字 ID 指定。
set maxconn server <backend/server> <value>
动态更改指定服务器的 maxconn 设置。允许任意正值,包括零,但设置值超过全局 maxconn 的情况并无实际意义。
set maxconn global <maxconn>
动态调整全局 maxconn 设置,取值范围受限于初始全局 maxconn 设置。若增大该值,正在等待的连接将立即被接受。若减小至低于当前连接数,新连接的接受将延迟,直至达到阈值。值为零时恢复初始设置。
set profiling memory { on | off }
set profiling memory { on | off }
set profiling tasks { auto | on | off | lock | no-lock | memory | no-memory }启用或禁用指定子系统的 CPU 或内存剖析功能。这等效于在配置文件的“global”段中设置或清除“profiling”选项。 请参阅“show profiling”。请注意,手动将任务剖析设置为“on”会自动重置调度器统计信息,从而可检查指定时间段内的活动情况。 内存剖析仅限于特定操作系统(已知在 linux-glibc 目标上可用),且需要在编译时设置 USE_MEMORY_PROFILING。
. 对于任务性能分析,可以在运行时启用或禁用任务级锁和内存计时的收集,但该更改仅在性能分析器从关闭/自动模式切换至开启模式时(无论是自动还是手动)才会生效。因此,当使用 “no-lock” 禁用任务级锁性能分析以节省 CPU 周期时,建议先关闭再开启任务性能分析,以确保更改生效。
set rate-limit connections global <value>
更改进程级别的连接速率限制,该限制由全局配置项 maxconnrate 设置。值为零时表示禁用限制。此限制适用于所有前端,更改立即生效。数值以每秒连接数为单位。
set rate-limit http-compression global <value>
更改最大输入压缩速率,该值由全局配置项 ‘maxcomprate’ 设置。值为零时表示禁用限制。该值以每秒千字节为单位传递。该值可在 “show info” 输出中通过 “CompressBpsRateLim” 行查看,单位为字节。
set rate-limit sessions global <value>
更改进程级会话速率限制,该限制由全局配置项 maxsessrate 设置。值为零时表示禁用限制。此限制适用于所有前端,更改立即生效。值以每秒会话数为单位。
set rate-limit ssl-sessions global <value>
更改进程级 SSL 会话速率限制,该限制由全局配置项 maxsslrate 设置。值为 0 时表示禁用限制。此限制适用于所有前端,更改立即生效。该值以每秒发送至 SSL 栈的会话数为单位,应用于握手之前,以防止对握手机制的滥用。
set server <backend>/<server> addr <ip4 or ip6 address> [port <port>]
将服务器的当前 IP 地址替换为所提供的地址。可选地,使用 ‘port’ 参数更改端口。请注意,更改端口还支持端口映射的切换(使用 +X 或 -Y 表示),但前提是已为健康检查配置了端口。
set server <backend>/<server> agent [ up | down ]
强制将服务器的代理状态切换至新状态。此操作可用于立即更改服务器状态,例如在某些代理检查响应较慢时。请注意,若存在跟踪服务器,该变更将被传播至跟踪服务器。
set server <backend>/<server> agent-addr <addr> [port <port>]
更改服务器代理检查的地址。允许在运行时将代理检查迁移到另一个地址。
可同时指定 IP 地址和主机名,将自动解析。可选地,更改代理检查的端口。
set server <backend>/<server> agent-port <port>
更改用于代理检查的端口。
set server <backend>/<server> agent-send <value>
更改发送至代理检查目标的代理字符串。可在更改服务器地址时更新字符串,以保持两者一致。
set server <backend>/<server> health [ up | stopping | down ]
强制将服务器的健康状态更改为新状态。此操作可用于立即切换服务器状态,例如在某些健康检查响应较慢时。请注意,若存在跟踪服务器,该变更将被传播至跟踪服务器。
set server <backend>/<server> check-addr <ip4 | ip6> [port <port>]
更改用于服务器健康检查的 IP 地址。可选地,更改用于服务器健康检查的端口。
set server <backend>/<server> check-port <port>
将健康检查使用的端口更改为 <port>
set server <backend>/<server> state [ ready | drain | maint ]
强制将服务器的管理状态更改为新状态。此操作可用于禁用负载均衡和/或向服务器发送任何流量。将状态设为“ready”可使服务器进入正常模式,该命令等同于“enable server”命令。将状态设为“maint”不仅会阻止向服务器发送任何流量,还会禁用所有健康检查。此操作等同于“disable server”命令。将模式设为“drain”仅会将服务器从负载均衡中移除,但仍允许对其进行健康检查,并接受新的持久连接。若存在跟踪服务器,更改将传播至这些服务器。
set server <backend>/<server> weight <weight>[%]
将服务器的权重更改为参数中传入的值。这与下方的“set weight”命令完全等效。
set server <backend>/<server> fqdn <FQDN>
更改服务器的完全限定域名(FQDN)为参数中传入的值。这要求为该服务器配置并启用了内部运行时 DNS 解析器。
set server <backend>/<server> ssl [ on | off ] (deprecated)
此选项用于配置向服务器发起连接时的 SSL 加密。关闭时,所有流量将变为明文传输;健康检查路径保持不变。
此命令已弃用,请改用“add server”命令动态创建服务器,支持启用或不启用 SSL。
set severity-output [ none | number | string ]
更改当前会话期间统计套接字输出的严重性格式。
set ssl ca-file <cafile> <payload>
本命令属于事务系统的一部分,可能需要使用“commit ssl ca-file”和“abort ssl ca-file”命令。若当前无正在进行的事务,该命令将创建一个 CA 文件树条目,用于存储负载中包含的证书。该 CA 文件条目不会被保存至 CA 文件树,仅在临时事务中保留。若已存在同名事务,先前的 CA 文件条目将被删除,并由新条目替换。完成修改后,必须通过“commit ssl ca-file”调用提交事务。若需分别添加多个证书,可使用“add ssl ca-file”命令。
示例:
echo -e "set ssl ca-file cafile.pem <<\n$(cat rootCA.crt)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl ca-file cafile.pem" | socat /var/run/haproxy.stat -set ssl cert <filename> <payload>
此命令属于事务系统的一部分,“commit ssl cert” 和 “abort ssl cert” 命令可能需要使用。该事务系统适用于 “show ssl cert” 命令所显示的任意证书,即适用于任意前端或后端证书。若当前无进行中的事务,系统将把证书 <filename> 在内存中复制一份至临时事务,随后使用载荷中的 PEM 文件更新该事务。若存在同名文件的事务,系统将更新该事务。也可对与证书关联的文件(如 .issuer、.sctl、.oscp 等)进行更新。完成修改后,必须执行 “commit ssl cert” 以提交事务。
通过 CLI 注入文件时必须谨慎,因为空行用于通知负载的结束。建议注入已清理过的 PEM 文件。一种简单的方法是删除所有空行,仅保留 PEM 段中的内容。可使用 sed 命令实现。
示例:
# With some simple sanitizing
echo -e "set ssl cert localhost.pem <<\n$(sed -n '/^$/d;/-BEGIN/,/-END/p' 127.0.0.1.pem)\n" | \
socat /var/run/haproxy.stat -
# Complete example with commit
echo -e "set ssl cert localhost.pem <<\n$(cat 127.0.0.1.pem)\n" | \
socat /var/run/haproxy.stat -
echo -e \
"set ssl cert localhost.pem.issuer <<\n $(cat 127.0.0.1.pem.issuer)\n" | \
socat /var/run/haproxy.stat -
echo -e \
"set ssl cert localhost.pem.ocsp <<\n$(base64 -w 1000 127.0.0.1.pem.ocsp)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl cert localhost.pem" | socat /var/run/haproxy.stat -set ssl crl-file <crlfile> <payload>
本命令属于事务系统的一部分,可能需要使用“commit ssl crl-file”和“abort ssl crl-file”命令。若当前无正在进行的事务,该命令将创建一个 CRL 文件树条目,用于存储载荷中的吊销列表。该 CRL 文件条目不会被保存至 CRL 文件树,而仅保留在临时事务中。若已存在同名的事务,先前的 CRL 文件条目将被删除,并由新条目替换。完成修改后,必须通过调用“commit ssl crl-file”提交事务。
示例:
echo -e "set ssl crl-file crlfile.pem <<\n$(cat rootCRL.pem)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl crl-file crlfile.pem" | socat /var/run/haproxy.stat -set ssl ech <bind> <payload>
使用此密钥替换绑定行中的 ECH 密钥。负载必须以 ECH 格式的 PEM 格式提供。 (https://datatracker.ietf.org/doc/html/draft-farrell-tls-pemesni )
绑定行格式为 <frontend>/@<filename>:<linenum>(例如:frontend1/@HAProxy.conf:19),或 <frontend>/<name>(若绑定行使用了 “name” 关键字命名)。
必须使用支持 ECH 的 OpenSSL 版本,且 HAProxy 必须以 USE_ECH=1 编译。 该命令仅在以实验模式运行的 CLI 连接中受支持(参见“experimental-mode on”)。
另请参见配置手册 第 5.1 节 中的 “show ssl ech”、“add ssl ech” 和 “ech”。
$ openssl ech -public_name foobar.com -out foobar3.com.ech
$ echo -e "experimental-mode on;
set ssl ech frontend1/@haproxy.conf:19 <<%EOF%\n$(cat foobar3.com.ech)\n%EOF%\n" | \
socat /tmp/haproxy.sock -
set new ECH configs for frontend1/@haproxy.conf:19
set ssl ocsp-response <response | payload>
此命令用于更新证书的 OCSP 响应(参见 “bind” 行中的 “crt”)。执行的控制操作与初始加载响应时相同。<response> 必须以 Base64 编码的 DER 格式响应字符串形式传递,该响应来自 OCSP 服务器。此命令不支持 BoringSSL。
示例:
openssl ocsp -issuer issuer.pem -cert server.pem \
-host ocsp.issuer.com:80 -respout resp.der
echo "set ssl ocsp-response $(base64 -w 10000 resp.der)" | \
socat stdio /var/run/haproxy.stat
using the payload syntax:
echo -e "set ssl ocsp-response <<\n$(base64 resp.der)\n" | \
socat stdio /var/run/haproxy.statset ssl tls-key <id> <tlskey>
为 <id> 监听器设置下一个 TLS 密钥为 <tlskey>。该密钥将成为最终密钥,倒数第二密钥用于加密(其余密钥仅用于解密)。最旧的 TLS 密钥将被覆盖。<id> 为数值 #<id> 或由 “show tls-keys” 返回的 <file>。<tlskey> 为经过 base64 编码的 48 位或 80 位 TLS 会话票据密钥(例如:OpenSSL rand 80 | OpenSSL base64 -A)。
set table <table> key <key> [data.<data_type> <value>]*
set table <table> key <key> [data.<data_type> <value>]*
set table <table> ptr <ptr> [data.<data_type> <value>]*在表中创建或更新一个粘性表条目。若键不存在,则插入一条新条目。
请参阅第 4.2 段中的 stick-table 以获取 <data_type> 的所有可能取值。最常见用法是动态添加源 IP 地址条目,并在 gpc0 中设置标志,以动态屏蔽 IP 地址或影响其服务质量。单次调用中可传递多个 data_type。
可选地,对于现有条目,可使用指针查找代替键查找:<ptr> 的格式为 0xffff,且必须与先前执行“show table”命令所返回的地址对应。当因键为空或 CLI 上存在不兼容字符而无法通过键匹配条目时,使用指针匹配条目可能具有实际意义。
如果 data.<data_type> 为数组类型,可以使用 “[]” 访问数组中的特定索引,例如:data.gpt[1]
set timeout cli <delay>
更改当前连接的 CLI 接口超时时间。在需要长时间调试会话且用户需持续检查某些指标而不被断开连接时,此功能非常有用。延迟时间以秒为单位指定。
set var <name> <expression>
允许使用表达式 <expression> 或格式字符串 <format> 的结果来设置或覆盖进程级变量 ’name’。仅可使用进程级变量,因此名称必须以 ‘proc.’ 开头,否则不会设置任何变量。<expression> 和 <format> 仅可包含“内部”样本提取关键字和转换器,尽管最可能有用的通常是 str(‘something’)、int()、简单字符串或对其他变量的引用。请注意,命令行解析器不识别引号,因此表达式中的任何空格必须以反斜杠转义。该命令需要“operator”或“admin”级别权限。该命令仅在以实验模式运行的 CLI 连接上受支持(参见“experimental-mode on”)。
set weight <backend>/<server> <weight>[%]
将服务器的权重更改为参数中传入的值。若该值以百分号(%)结尾,则新权重将相对于初始配置的权重计算。绝对权重允许的范围为 0 至 256。相对权重必须为正数,且最终计算出的绝对权重上限为 256。属于运行静态负载均衡算法的服务器组的服务器具有更严格的限制,因为权重一旦设定便不可更改。因此,对于此类服务器,仅接受的值为 0 和 100%(或 0 和初始权重)。更改立即生效,但某些负载均衡算法需要一定数量的请求后才会考虑权重变化。该命令的典型用法是在更新期间将服务器权重设为 0 以禁用它,更新完成后将其权重恢复为 100% 以重新启用。此命令受限制,仅可在配置为“admin”级别的套接字上执行。后端和服务器均可通过名称或其数值 ID 指定,数值 ID 前需加井号(#)。
show acl [[@<ver>] <acl>]
显示关于 ACL 转换器的信息。若未指定参数,将返回所有可用 ACL 的列表。若指定 <acl>,则输出其内容。<acl> 为 #<id> 或 <name>。默认情况下显示 ACL 的当前版本(即当前用于匹配并作为 ‘curr_ver’ 在 ACL 列表中报告的版本)。可通过在 ACL 标识符前添加 @<ver> 来选择输出其他版本。版本号作为过滤器使用,不存在的版本将不返回任何结果。输出格式与映射(map)相同,即使对于样本值(sample value)也是如此。返回的数据并非可用 ACL 的列表,而是构成任意 ACL 的所有模式(pattern)的列表。其中许多模式可与映射(map)共享。’entry_cnt’ 值表示 ACL 条目总数,不仅包括激活的条目,还包含当前正在添加的条目。
show anon
显示匿名模式的当前状态(启用或禁用)以及当前会话的密钥。
show backend
转储运行进程中的可用后端列表
show cli level
显示当前 CLI 会话的 CLI 级别。结果可能是 ‘admin’、‘operator’ 或 ‘user’。 参见 ‘operator’ 和 ‘user’ 命令。
示例:
$ socat /tmp/sock1 readline
prompt
> operator
> show cli level
operator
> user
> show cli level
user
> operator
Permission deniedoperator
将当前 CLI 会话的 CLI 级别降低至 operator。该级别无法提升。同时会退出 expert 和 experimental 模式。参见“show cli level”。
unpublish backend <backend>
将后端标记为未来流量选择中不可用。实际上,引用该后端的 use_backend / default_backend 规则将被忽略,继续评估后续的内容切换规则。与禁用的后端不同,服务器的健康检查仍保持激活状态。该命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。
user
将当前 CLI 会话的级别降低至 user。该级别无法提升。同时会退出 expert 和 experimental 模式。参见“show cli level”。
show activity [-1 | 0 | thread_num]
报告有关内部事件的一些计数器,有助于开发者以及对 HAProxy 有足够了解、能够缩小异常行为报告原因的人员。典型示例为一个正常运行的进程从未休眠且持续占用 100% 的 CPU。输出字段将按每项指标一行组织,同一行内包含各线程的计数器。这些计数器为 32 位,将在进程生命周期内发生溢出,但由于该命令的调用通常会执行两次,因此不会造成问题。字段未被正式文档化,以确保其确切含义在计数器被更新的代码中得到验证。这些值也会被 “clear counters” 命令重置。在多线程部署中,第一列将显示所有线程的总和(或平均值,视指标性质而定),所有线程的值将以方括号形式按线程顺序列出。可选地,可在参数中指定要转储的线程编号。特殊值 “0” 将报告聚合值(第一列),而 “-1”(默认值)将显示所有列。请注意,与单线程模式一样,当仅请求单列时,将不显示方括号。
show cli sockets
列出 CLI 套接字。输出格式由三个以空格分隔的字段组成。第一个字段为套接字地址,可以是 Unix 套接字、IPv4 地址:端口对或 IPv6 地址。其他类型的套接字不会被输出。第二个字段描述套接字的级别:‘admin’、‘user’ 或 ‘operator’。第三个字段列出套接字绑定的进程,字段间以逗号分隔,可以是进程编号或 ‘all’。
示例:
$ echo 'show cli sockets' | socat stdio /tmp/sock1
# socket lvl processes
/tmp/sock1 admin all
127.0.0.1:9999 user 2,3,4
127.0.0.2:9969 user 2
[::1]:9999 operator 2show cache
列出已配置的缓存及其各自缓存树中存储的对象。
$ echo ‘show cache’ | socat stdio /tmp/sock1 0x7f6ac6c5b03a: foobar (shctx:0x7f6ac6c5b000, available blocks:3918) 1 2 3 4
- 指向缓存结构的指针
- 缓存名称
- 指向 mmap 区域的指针(shctx)
- shctx 中可用于重用的块数量
0x7f6ac6c5b4cc 哈希值:286881868 变化值:0x0011223344556677 大小:39114(39 个块),引用计数:9,过期时间:237 1 2 3 4 5 6 7
- 缓存条目的指针
- 哈希值的前 32 位
- 在使用 vary 时,条目的二级哈希值
- 对象大小,单位为字节
- 用于该对象的块数量
- 正在使用该条目的事务数量
- 过期时间,若已过期则可能为负值
show dev
本命令旨在集中提供 HAProxy 开发者可能需要的部分信息,以便更深入理解特定问题的成因。该命令通常对用户无实际帮助,但这些信息有助于开发者排除某些假设。输出格式大致为一系列段,每段包含缩进的多行内容,每行一个元素,例如操作系统类型与版本、CPU 类型或启动时的文件描述符限制等。为避免重复或输出污染,某些无实际价值的字段(如“无限制”值)将被省略。未来可能新增更多字段,部分字段也可能发生变化。此输出不适用于脚本解析,不应被视为高度可靠,其主要目的是为可读者节省时间。
从技术上讲,此类信息直接从启动时存储的内部结构中获取,以便在崩溃后也能在核心转储文件中找到。因此,开发者可能会要求在进程正常运行时提前输出相关信息,以便与核心转储中的内容进行对比,或在多次重载之间进行对比(例如,某些限制值可能发生变化)。若启用了匿名化功能,任何可能敏感的值也将被匿名化(例如,节点名称)。
输出示例:
$ socat stdio /tmp/sock1 <<< "show dev"
Platform info
machine vendor: To be filled by O.E.M
machine family: Altra
cpu model: Impl 0x41 Arch 8 Part 0xd0c r3p1
virtual machine: no
container: no
OS name: Linux
OS release: 6.2.0-36-generic
OS version: #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 18:01:07 UTC 2
OS architecture: aarch64
node name: 489aaf
Process info
pid: 1735846
boot uid: 509
boot gid: 1002
fd limit (soft): 1024
fd limit (hard): 1048576show env [<name>]
转储进程已知的一个或全部环境变量。不带参数时,转储所有变量。带参数时,若该变量存在,则仅转储指定变量;否则输出“变量未找到”。变量以与“env”工具存储或返回相同的格式转储,即“<name>=<value>”。此功能在调试大量使用环境变量的配置文件时尤为有用,可确保其包含预期值。该命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。
show errors [<iid>|<proxy>] [request|response]
dump last known HTTP/1.x 请求和响应错误,这些错误由前端和后端收集。若指定 <iid>,则将转储范围限制为 ID 为 <iid> 的前端或后端相关的错误。代理 ID “-1” 将导致所有实例被转储。若指定代理名称,则使用其 ID 作为过滤器。若在代理名称或 ID 后添加 “request” 或 “response”,则仅转储请求或响应错误。此命令受限制,仅可在配置为 “operator” 或 “admin” 级别的套接字上执行。
可能收集的错误包括由协议违规引起的最后一个请求和响应错误,通常源于头字段名称中的无效字符。报告会精确指出具体违反协议的字符。其他重要信息,如错误检测的确切日期、前端和后端名称、服务器名称(如已知)、内部事务 ID 以及发起会话的源地址,也会一并报告。
所有字符均被返回,不可打印字符会被编码。最常见的字符(\t = 9,\n = 10,\r = 13 以及 \e = 27)以反斜杠后接一个字母的形式进行编码。反斜杠本身编码为 ‘\\’,以避免混淆。其他不可打印字符则编码为 ‘\xNN’,其中 NN 为字符 ASCII 码的两位十六进制表示。
每行前缀为该行首个字符在缓冲区中的位置,起始位置为 0。每行最多输出一条输入行,过长的行将被拆分为多个连续的输出行,确保输出宽度不超过 79 个字符。若某行被拆分,可通过其不以 ‘\n’ 结尾,且下一行偏移量前带有 ‘+’ 符号来判断,该符号表示当前行是前一行的续行。
示例:
$ echo "show errors -1 response" | socat stdio /tmp/sock1
>>> [04/Mar/2009:15:46:56.081] backend http-in (#2): invalid response
src 127.0.0.1, session #54, frontend fe-eth0 (#1), server s2 (#1)
response length 213 bytes, error at position 23:
00000 HTTP/1.0 200 OK\r\n
00017 header/bizarre:blah\r\n
00038 Location: blah\r\n
00054 Long-line: this is a very long line which should b
00104+ e broken into multiple lines on the output buffer,
00154+ otherwise it would be too large to print in a ter
00204+ minal\r\n
00211 \r\n
In the example above, we see that the backend "http-in" which has internal
ID 2 has blocked an invalid response from its server s2 which has internal
ID 1. The request was on transaction 54 (called "session" here) initiated
by source 127.0.0.1 and received by frontend fe-eth0 whose ID is 1. The
total response length was 213 bytes when the error was detected, and the
error was at byte 23. This is the slash ('/') in header name
"header/bizarre", which is not a valid HTTP character for a header name.show events [<sink>] [-w] [-n] [-0]
不带选项时,列出所有已知事件接收端及其类型。带选项时,若接收端类型为缓冲区,则会转储该接收端中所有可用事件。若在接收端名称后传递选项 “-w”,则在到达缓冲区末尾后,命令将等待新事件并显示它们。可通过输入任意内容(该内容将被丢弃)或关闭会话来终止操作。选项 “-n” 用于直接定位到缓冲区末尾,通常与 “-w” 配合使用,以仅报告新事件。为方便起见,可使用 “-wn” 或 “-nw” 一次性启用上述两个选项。默认情况下,所有事件以换行符(’\n’ 或 10 或 0x0A)分隔。可通过传递 “-0” 参数将其更改为 NUL 字符(’\0’ 或 0)。
show fd [-!plcfbsd]* [[<tgid>]/[<fd>] | <fd>]
dump 所有打开的文件描述符列表,或仅输出指定编号 <fd> 的文件描述符。格式 “<tgid>/<fd>” 也允许使用,任一侧可为空以作为通配符(例如 “/<fd>” 表示跨线程组的 fd <fd>,"<tgid>/” 表示 <tgid> 的所有文件描述符)。目前 <tgid> 会被解析但被忽略,待未来支持按线程组的文件描述符表时再启用。可选择性地传入一组标志,以限制仅输出特定类型的文件描述符,或排除特定类型。当遇到 ‘-’ 或 ‘!’ 时,后续字符的选择将被反转,且每次以空格分隔的参数词前都会重置反转状态。可选的文件描述符类型包括:‘p’ 表示管道,’l’ 表示监听器,‘c’ 表示连接(任意类型),‘f’ 表示前端连接,‘b’ 表示后端连接(任意类型),’s’ 表示到服务器的连接,’d’ 表示到“分发”地址或后端透明地址的连接。通过此方式,‘b’ 是 ‘sd’ 的快捷方式,‘c’ 是 ‘fb’ 或 ‘fsd’ 的快捷方式。‘c!f’ 等价于 ‘b’(即“除前端连接外的所有连接”确实为后端连接)。该功能仅面向需要观察内部状态以排查复杂问题(如异常 CPU 使用率)的开发者。每行报告一个文件描述符,每行中其在多路复用器中的状态以大写字母表示启用的标志,小写字母表示禁用的标志,使用 “P” 表示“已轮询”,“R” 表示“就绪”,“A” 表示“活跃”,事件状态使用 “H” 表示“挂起”,“E” 表示“错误”,“O” 表示“输出”,“P” 表示“优先级”,“I” 表示“输入”,其他若干标志如 “N” 表示“新”(刚加入文件描述符缓存),“U” 表示“已更新”(在文件描述符缓存中收到更新),“L” 表示 “linger_risk”,“C” 表示“克隆”,随后是缓存条目位置、内部所有者指针、I/O 回调指针及其名称(如已知)。当所有者为连接时,报告连接标志及目标(前端、代理或服务器)。当所有者为监听器时,报告监听器状态及其前端。使用此命令前必须对内部结构有充分了解。请注意,输出格式可能随时间变化,因此不应由设计为长期稳定的工具解析该输出。某些内部结构状态可能对列出它们的函数而言显得可疑,此时输出行将附加感叹号(’!’)。这有助于在诊断事件时找到切入点。
show info [typed|json] [desc] [float]
在当前进程上转储 HAProxy 状态相关信息。若传入可选参数 “typed”,还将输出字段编号、名称和类型,以便外部监控产品能够轻松检索、可能聚合后报告其未知字段中的信息。每个字段单独占一行。若传入可选参数 “json”,则 “typed” 输出的信息将以 JSON 格式提供,作为 JSON 对象列表。默认格式仅包含由冒号(’:’)分隔的两列,左侧为字段名,右侧为值。请注意,在类型化输出格式中,单个对象的转储是连续的,因此消费者无需一次性存储全部内容。若传入可选参数 “float”,部分通常以整数形式输出的字段可能切换为浮点数以提高精度。具体哪些字段受影响未明确指定,因为这可能随时间变化。使用此选项意味着消费者能够处理浮点数。输出格式使用 sprintf("%f”)。
使用类型化输出格式时,每行由四个以冒号(’:’)分隔的列组成。第一列是一个由点号(.)分隔的三元素序列。第一个元素是字段在列表中的数值位置(从零开始)。该位置不应随时间变化,但根据构建选项或未来字段被删除的情况,可能出现空缺。第二个元素是字段名称,其形式与默认的 “show info” 输出中显示的一致。第三个元素是相对进程编号,从 1 开始。
该行中第一个冒号之后的内容遵循上方段落所述的“类型化输出格式”。简而言之,第二个字段(第一个冒号之后)表示变量的来源、性质和作用域。第三个字段表示字段类型,包括 “s32”、“s64”、“u32”、“u64” 和 “str”。第四个字段为值本身,消费者可根据第三列的类型信息进行解析,并根据第二列的信息进行处理。
因此,类型化模式下的整体行格式为:
当命令后附加 “desc” 时,会在指标后附加一个额外的冒号及一个被引号括起的字符串,用于描述该指标。截至本文撰写时,此功能仅支持 “typed” 和默认输出格式。
示例:
> show info
Name: HAProxy
Version: 1.7-dev1-de52ea-146
Release_date: 2016/03/11
Nbproc: 1
Process_num: 1
Pid: 28105
Uptime: 0d 0h00m04s
Uptime_sec: 4
Memmax_MB: 0
PoolAlloc_MB: 0
PoolUsed_MB: 0
PoolFailed: 0
(...)
> show info typed
0.Name.1:POSV:str:HAProxy
1.Version.1:POSV:str:3.1-dev0-7c653d-2466
2.Release_date.1:POSV:str:2025/07/01
3.Nbthread.1:CGSV:u32:1
4.Nbproc.1:CGSV:u32:1
5.Process_num.1:KGPV:u32:1
6.Pid.1:SGPV:u32:638069
7.Uptime.1:MDPV:str:0d 0h00m07s
8.Uptime_sec.1:MDPV:u32:7
9.Memmax_MB.1:CLPV:u32:0
10.PoolAlloc_MB.1:MGPV:u32:0
11.PoolUsed_MB.1:MGPV:u32:0
12.PoolFailed.1:MCPV:u32:0
(...)在类型化格式中,第一列末尾的进程 ID 使得从多个进程获取的输出能够非常方便地进行视觉聚合。示例:
$ ( echo show info typed | socat /var/run/haproxy.sock1; \
echo show info typed | socat /var/run/haproxy.sock2 ) | \
sort -t . -k 1,1n -k 2,2 -k 3,3n
0.Name.1:POS:str:HAProxy
0.Name.2:POS:str:HAProxy
1.Version.1:POS:str:1.7-dev1-868ab3-148
1.Version.2:POS:str:1.7-dev1-868ab3-148
2.Release_date.1:POS:str:2016/03/11
2.Release_date.2:POS:str:2016/03/11
3.Nbproc.1:CGS:u32:2
3.Nbproc.2:CGS:u32:2
4.Process_num.1:KGP:u32:1
4.Process_num.2:KGP:u32:2
5.Pid.1:SGP:u32:30120
5.Pid.2:SGP:u32:30121
6.Uptime.1:MDP:str:0d 0h01m28s
6.Uptime.2:MDP:str:0d 0h01m28s
(...)JSON 输出格式的定义详见其模式,可使用命令 “show schema json” 输出该模式。
JSON 输出中不包含额外的空白字符,以减少输出体积。如需人工阅读,可通过格式化工具处理输出以提高可读性。示例:
$ echo “show info json” | socat /var/run/haproxy.sock stdio | \ python -m json.tool
JSON 输出中不包含额外的空白字符,以减少输出体积。如需人工阅读,可通过格式化工具处理输出以提高可读性。示例:
$ echo “show info json” | socat /var/run/haproxy.sock stdio | \ python -m json.tool
show libs
输出已加载的共享动态库和目标文件列表,仅在支持该功能的系统上可用。当可用时,每个共享对象将显示其虚拟地址范围、大小以及路径。例如,可用于尝试估算某函数由哪个库提供。请注意,在许多系统上,每次重启后地址会发生变化(地址空间随机化),因此若需用于分析核心转储文件,该列表应在启动时获取。此命令仅可在配置为“operator”或“admin”级别的套接字上执行。请注意,输出格式可能因操作系统、架构甚至 HAProxy 版本而异,不应在脚本中依赖该格式。
show map [[@<ver>] <map>]
显示关于映射转换器的信息。若未指定参数,将返回所有可用映射的列表。若指定 <map>,则输出其内容。<map> 为 #<id> 或 <name>。默认情况下显示映射的当前版本(即当前用于匹配并作为 ‘curr_ver’ 在映射列表中报告的版本)。可通过在映射标识符前添加 @<ver> 来选择输出其他版本。版本号作为过滤器使用,不存在的版本将仅返回无结果。’entry_cnt’ 值表示映射中所有条目的总数,而不仅限于激活状态的条目,因此也包含当前正在添加的条目。
输出中,第一列为唯一条目标识符,可用于“del map”和“set map”操作的引用。第二列为模式,第三列为样本(如可用)。返回的数据并非直接列出所有可用映射,而是列出构成任意映射的所有模式。其中许多模式可与 ACL 共享。
show peers [dict|-] [<peers section>]
dump 有关“peers”段中配置的对等节点的信息。若未指定参数,将列出所有“peers”段中的对等节点。若指定 <peers section>,则仅输出属于该“peers”段的对等节点信息。若在对等节点段名称前指定“dict”,还将 dump 整个 Tx/Rx 字典缓存(数据量极大)。若对等节点段名为“dict”,可能需要传入“-”以正确输出。
以下是两个输出示例,其中 hostA、hostB 和 hostC 对等节点属于 “sharedlb” 对等节点段。仅 hostA 和 hostB 已建立连接。仅 hostA 向 hostB 发送了数据。
$ echo “show peers” | socat - /tmp/hostA 0x55deb0224320: [15/Apr/2019:11:28:01] id=sharedlb
state=0 flags=0x3 \ resync_timeout=<PAST> task_calls=45122
0x55deb022b540: id=hostC(remote) addr=127.0.0.12:10002 status=CONN \
reconnect=4s confirm=0 flags=0x0 0x55deb022a440: id=hostA(local) addr=127.0.0.10:10000 status=NONE
\ reconnect=<NEVER> confirm=0 flags=0x0 0x55deb0227d70: id=hostB(remote)
addr=127.0.0.11:10001 status=ESTA reconnect=2s confirm=0 flags=0x20000200 appctx:0x55deb028fba0
st0=7 st1=0 task_calls=14456 \ state=EST xprt=RAW src=127.0.0.1:37257
addr=127.0.0.10:10000 remote_table:0x55deb0224a10 id=stkt local_id=1 remote_id=1
last_local_table:0x55deb0224a10 id=stkt local_id=1 remote_id=1 shared tables:
0x55deb0224a10 local_id=1 remote_id=1 flags=0x0 remote_data=0x65
last_acked=0 last_pushed=3 last_get=0 teaching_origin=0 update=3
table:0x55deb022d6a0 id=stkt update=3 localupdate=3 \
commitupdate=3 syncing=0$ echo “show peers” | socat - /tmp/hostB 0x55871b5ab320: [15/Apr/2019:11:28:03] id=sharedlb
state=0 flags=0x3 \ resync_timeout=<PAST> task_calls=3 0x55871b5b2540:
id=hostC(remote) addr=127.0.0.12:10002 status=CONN \ reconnect=3s
confirm=0 flags=0x0 0x55871b5b1440: id=hostB(local) addr=127.0.0.11:10001 status=NONE
\ reconnect=<NEVER> confirm=0 flags=0x0 0x55871b5aed70: id=hostA(remote)
addr=127.0.0.10:10000 status=ESTA \ reconnect=2s confirm=0
flags=0x20000200 appctx:0x7fa46800ee00 st0=7 st1=0 task_calls=62356 \
state=EST remote_table:0x55871b5ab960 id=stkt local_id=1 remote_id=1 last_local_table:0x55871b5ab960
id=stkt local_id=1 remote_id=1 shared tables:
0x55871b5ab960 local_id=1 remote_id=1 flags=0x0 remote_data=0x65
last_acked=3 last_pushed=0 last_get=3 teaching_origin=0 update=0
table:0x55871b5b46a0 id=stkt update=1 localupdate=0 \
commitupdate=0 syncing=0show pools [byname|bysize|byusage] [detailed] [match <pfx>] [<nb>]
dump 内部内存池状态。当怀疑存在内存泄漏时,此功能有助于追踪内存使用情况。其行为与在前台运行时发送 SIGQUIT 信号完全相同,但不会刷新内存池。输出默认不排序。若指定 “byname”,则按池名称排序;若指定 “bysize”,则按项目大小降序排序;若指定 “byusage”,则按总使用量降序排序,且仅显示已使用的条目。也可通过指定 <nb> 限制输出仅显示前若干条目(例如按使用量排序时)。还可通过指定 “detailed” 输出更多内部详情,包括所有已合并池的列表。最后,若指定 “match” 并后接前缀,则仅显示名称以该前缀开头的池。报告的总和仅针对符合筛选条件的池。示例:
$ socat - /tmp/haproxy.sock <<< "show pools match quic byusage"
Dumping pools usage. Use SIGQUIT to flush them.
- Pool quic_conn_r (65560 bytes): 1337 allocated (87653720 bytes), ...
- Pool quic_crypto (1048 bytes): 6685 allocated (7005880 bytes), ...
- Pool quic_conn (4056 bytes): 1337 allocated (5422872 bytes), ...
- Pool quic_rxbuf (262168 bytes): 8 allocated (2097344 bytes), ...
- Pool quic_conne (184 bytes): 9359 allocated (1722056 bytes), ...
- Pool quic_frame (184 bytes): 7938 allocated (1460592 bytes), ...
- Pool quic_tx_pac (152 bytes): 6454 allocated (981008 bytes), ...
- Pool quic_tls_ke (56 bytes): 12033 allocated (673848 bytes), ...
- Pool quic_rx_pac (408 bytes): 1596 allocated (651168 bytes), ...
- Pool quic_tls_se (88 bytes): 6685 allocated (588280 bytes), ...
- Pool quic_cstrea (88 bytes): 4011 allocated (352968 bytes), ...
- Pool quic_tls_iv (24 bytes): 12033 allocated (288792 bytes), ...
- Pool quic_dgram (344 bytes): 732 allocated (251808 bytes), ...
- Pool quic_arng (56 bytes): 4011 allocated (224616 bytes), ...
- Pool quic_conn_c (152 bytes): 1337 allocated (203224 bytes), ...
Total: 15 pools, 109578176 bytes allocated, 109578176 used ...show profiling [{all | status | tasks | memory}] [byaddr|bytime|byctx|aggr|<max_lines>]*
以每行一个的方式输出当前的性能分析设置,以及用于修改这些设置的命令。 当启用任务性能分析时,调度器收集的部分函数级统计信息也将被输出,包括调用次数、总 CPU 时间/平均 CPU 时间以及总延迟/平均延迟的汇总信息。 当启用内存性能分析时,将报告诸如分配/释放次数及其大小等信息。 可通过指定相应关键字,将输出限制为仅性能分析状态、任务信息或内存性能分析信息;默认情况下,所有性能分析信息均会被输出。 还可通过指定数值限制,控制每个类别输出的行数。 可请求按地址、总执行时间或调用上下文而非使用频率对输出进行排序,例如便于比较后续调用结果或识别需优化的部分,并可按被调用函数聚合任务活动,而非查看详细信息。 请注意,性能分析本质上面向开发者,用于提示代码中 CPU 周期或内存浪费的位置。该信息对监控无实际用途。
show resolvers [<resolvers section id>]
转储指定解析器段的统计信息,若未提供段,则转储所有解析器段的统计信息。
针对每个名称服务器,报告以下计数器:
sent: number of DNS requests sent to this server
valid: number of DNS valid responses received from this server
update: number of DNS responses used to update the server's IP address
cname: number of CNAME responses
cname_error: CNAME errors encountered with this server
any_err: number of empty response (IE: server does not support ANY type)
nx: non existent domain response received from this server
timeout: how many time this server did not answer in time
refused: number of requests refused by this server
other: any other DNS errors
invalid: invalid DNS response (from a protocol point of view)
too_big: too big response
outdated: number of response arrived too late (after another name server)show quic [<format>] [<filter>]
dump info on all active QUIC frontend connections。此命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。
可选参数可用于控制输出的详细程度。其值可按不同方式解释。第一种方式是使用预定义值:使用 “oneline” 表示默认格式,使用 “stream” 列出所有活动流,使用 “full” 显示全部信息。另一种方式是指定以逗号分隔的字段列表,以限制输出内容。当前支持的值包括 “tp”、“sock”、“pktns”、“cc” 和 “mux”。最后,若格式中使用 “help”,则会显示更详细的帮助信息。
最后一个参数用于限制或扩展连接列表。默认情况下,仅显示活跃的前端连接。使用额外参数 “clo” 可列出正在关闭的前端连接,使用 “be” 可列出后端连接,使用 “all” 可列出所有类别。也可以通过指定其十六进制地址来限制为单个连接。
show servers conn [<backend>]
转储指定后端(或所有后端,若未指定)中服务器的当前连接和空闲连接状态。可使用后端名称或标识符。
输出包含一行标题,显示字段名称,随后每行对应一个服务器,依次包含后端名称和 ID、服务器名称和 ID、地址、端口以及一系列数值。字段数量随线程数量变化而变化。输出格式在不同版本间及线程数量不同时可能略有差异。提取输出值时,需注意标题行以正确对应列,并留意线程数量,因为最后一列数据为每线程独立值:
bkname/svname Backend name '/' server name
bkid/svid Backend ID '/' server ID
addr Server's IP address
port Server's port (or zero if none)
- Unused field, serves as a visual delimiter
purge_delay Interval between connection purges, in milliseconds
served Number of connections currently in use
used_cur Number of connections currently in use
note that this excludes conns attached to a session
used_max Highest value of used_cur since the process started
need_est Floating estimate of total needed connections
idle_sess Number of idle connections flagged as private
unsafe_nb Number of idle connections considered as "unsafe"
safe_nb Number of idle connections considered as "safe"
idle_lim Configured maximum number of idle connections
idle_cur Total of the per-thread currently idle connections
idle_per_thr[NB] Idle conns per thread for each one of the NB threads当 <idle_cur> 与 <used_cur> 的总和超过估算值 <need_est> 时,HAProxy 将每隔 <purge_delay> 杀死一部分 <idle_cur>。该估算值会随连接活动情况变化。
由于空闲连接具有线程特性,必须理解的是,某些值在读取后可能发生改变,因此单行内的数据一致性无法保证。此输出主要用于调试,不应常规监控或绘图。
show servers state [<backend>]
转储运行配置中发现的服务器状态。可提供后端名称或标识符,以将输出限制为该后端。
转储文件的格式如下:
- 第一行包含格式版本(本规范中为 1);
- 第二行包含列标题,以井号(’#’)开头;
- 第三行及后续行包含数据;
- 以井号(’#’)开头的每一行均被视为注释。
由于同一输出可能存在多个版本,以下是各文件格式版本对应的字段及其顺序列表:
1:
be_id: Backend unique id.
be_name: Backend label.
srv_id: Server unique id (in the backend).
srv_name: Server label.
srv_addr: Server IP address.
srv_op_state: Server operational state (UP/DOWN/...).
0 = SRV_ST_STOPPED
The server is down.
1 = SRV_ST_STARTING
The server is warming up (up but
throttled).
2 = SRV_ST_RUNNING
The server is fully up.
3 = SRV_ST_STOPPING
The server is up but soft-stopping
(eg: 404).
srv_admin_state: Server administrative state (MAINT/DRAIN/...).
The state is actually a mask of values:
0x01 = SRV_ADMF_FMAINT
The server was explicitly forced into
maintenance.
0x02 = SRV_ADMF_IMAINT
The server has inherited the maintenance
status from a tracked server.
0x04 = SRV_ADMF_CMAINT
The server is in maintenance because of
the configuration.
0x08 = SRV_ADMF_FDRAIN
The server was explicitly forced into
drain state.
0x10 = SRV_ADMF_IDRAIN
The server has inherited the drain status
from a tracked server.
0x20 = SRV_ADMF_RMAINT
The server is in maintenance because of an
IP address resolution failure.
0x40 = SRV_ADMF_HMAINT
The server FQDN was set from stats socket.
srv_uweight: User visible server's weight.
srv_iweight: Server's initial weight.
srv_time_since_last_change: Time since last operational change.
srv_check_status: Last health check status.
srv_check_result: Last check result (FAILED/PASSED/...).
0 = CHK_RES_UNKNOWN
Initialized to this by default.
1 = CHK_RES_NEUTRAL
Valid check but no status information.
2 = CHK_RES_FAILED
Check failed.
3 = CHK_RES_PASSED
Check succeeded and server is fully up
again.
4 = CHK_RES_CONDPASS
Check reports the server doesn't want new
sessions.
srv_check_health: Checks rise / fall current counter.
srv_check_state: State of the check (ENABLED/PAUSED/...).
The state is actually a mask of values:
0x01 = CHK_ST_INPROGRESS
A check is currently running.
0x02 = CHK_ST_CONFIGURED
This check is configured and may be
enabled.
0x04 = CHK_ST_ENABLED
This check is currently administratively
enabled.
0x08 = CHK_ST_PAUSED
Checks are paused because of maintenance
(health only).
srv_agent_state: State of the agent check (ENABLED/PAUSED/...).
This state uses the same mask values as
"srv_check_state", adding this specific one:
0x10 = CHK_ST_AGENT
Check is an agent check (otherwise it's a
health check).
bk_f_forced_id: Flag to know if the backend ID is forced by
configuration.
srv_f_forced_id: Flag to know if the server's ID is forced by
configuration.
srv_fqdn: Server FQDN.
srv_port: Server port.
srvrecord: DNS SRV record associated to this SRV.
srv_use_ssl: use ssl for server connections.
srv_check_port: Server health check port.
srv_check_addr: Server health check address.
srv_agent_addr: Server health agent address.
srv_agent_port: Server health agent port.show sess [<options>*]
转储所有已知的活动流(以前称为“会话”)。在慢速连接上应避免执行此操作,因为输出可能非常庞大。此命令受限制,仅可在配置为“operator”或“admin”级别的套接字上执行。请注意,在连接快速回收的机器上,输出的条目数可能少于实际存在的数量,因为该命令仅转储在输入命令前创建的最后一个流之前的所有现有流;在此期间终止的流将不会显示。有关支持的选项,请参见下文。
show sess [<id> | all | help] [<options>*]
显示关于匹配流的大量内部信息。该命令支持两种输出格式:一种为简短格式,当未指定特定流标识符时,默认采用此格式;另一种为扩展格式,用于列出指定流时使用。简短格式由默认的 “show sess” 命令使用,每行仅输出一个流,包含少量信息,且流标识符位于行首,以十六进制表示(对应流的指针)。
在扩展形式中,由 “show sess <id>” 或 “show sess all” 使用时,流会以大量调试细节的形式在多行上输出(每流约 20 行),且仍以标识符开头。此处流之间的分隔符为行首的标识符;属于同一流的额外行以一个或多个空格开头(流内容缩进输出)。输出大量流可能导致输出内容极为庞大,耗时较长且对 CPU 消耗较高,因此始终建议仅输出所需最少信息。这些信息对大多数用户无用,但 HAProxy 开发者可将其用于排查复杂问题。确切的输出格式故意未予文档化,以便根据需求自由演进,包括在稳定分支中亦可调整。该输出旨在结合 src/stream.c 中的 strm_dump_to_buffer() 函数的实现进行解读,以明确特定字段的含义。
“help” 参数将显示命令的详细用法,而非转储流。
可以设置某些选项以自定义转储内容或应用过滤器。以下是支持的选项: - backend <b>:仅显示与该后端关联的流 - frontend <f>:仅显示与该前端关联的流 - older <age>:仅显示超过 <age> 秒的流 - server <b/s>:仅显示与该后端+服务器关联的流 - show-uri:转储请求分析过程中捕获的事务 URI。仅在已捕获时显示 - susp:仅显示开发人员根据可能随时间或版本变化的标准判定为可疑的流
show stat [domain <resolvers|proxy>] [{<iid>|<proxy>} <type> <sid>] \
show stat [domain <resolvers|proxy>] [{<iid>|<proxy>} <type> <sid>] \
[typed|json] [desc] [up|no-maint]转储统计信息。域用于选择要打印的统计信息;当前可用的有解析器和代理。默认使用 CSV 格式;若在其他参数后传递 “typed”,可启用上文所述的扩展类型化输出格式;若传递 “json”,则使用 JSON 格式。通过传递 <id>、<type> 和 <sid>,可仅转储选定项目:- <iid> 为代理 ID,-1 表示转储全部内容。也可指定代理名称 <proxy>,此时将使用该代理的 ID 作为选择器。- <type> 用于选择可转储对象的类型:1 表示前端,2 表示后端,4 表示服务器,-1 表示全部。这些值可进行按位或操作,例如:
- `<sid>` is a server ID, -1 to dump everything from the selected proxy.
示例:
$ echo "show info;show stat" | socat stdio unix-connect:/tmp/sock1
>>> Name: HAProxy
Version: 1.4-dev2-49
Release_date: 2009/09/23
Nbproc: 1
Process_num: 1
(...)
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq, (...)
stats,FRONTEND,,,0,0,1000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0, (...)
stats,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,250,(...)
(...)
www1,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,1,1,0,,0,250, (...)
$在此示例中,同时发出了两条命令。这种方式便于在多进程模式下识别统计信息所对应的进程。在类型化输出格式中,无需如此操作,因为每个输出行都会报告进程编号。请注意,信息输出后有一行空行,用于标记第一个数据块的结束。第二个数据块(统计信息)末尾也出现类似的空行,以便读者确认输出未被截断。
当指定 “typed” 时,输出格式更适用于监控工具,因为其提供了数值位置,并标明了每个输出字段的类型。每个值单独占一行,包含进程编号、元素编号、性质、来源和作用域。该格式也可通过在 HTTP 统计信息 URI 后添加 “;typed” 获得。请注意,在 typed 输出格式中,单个对象的转储是连续的,因此消费者无需一次性存储全部数据。
“up” 修饰符将仅列出报告为正常或未检查的服务器。处于关闭、未解析或维护状态的服务器将不会被列出。这与 HTTP 统计信息中的 “;up” 选项类似。类似地,“no-maint” 修饰符将如同 HTTP 中的 “;no-maint” 修饰符,使处于禁用状态的服务器不被列出。区别在于,处于启用状态但已关闭的服务器不会被排除。
使用类型化输出格式时,每行由 4 个以冒号(’:’)分隔的列组成。第一列是由 5 个以点号(’.’)分隔的元素构成的序列。第一个元素是表示所描述对象类型的字母。当前已知的对象类型包括:‘F’ 表示前端,‘B’ 表示后端,‘L’ 表示监听器,‘S’ 表示服务器。第二个元素是表示该对象所属代理的唯一标识符的正整数。该值等同于 CSV 输出中的 “iid” 列,并与前端或后端段中可选的 “id” 指令前的值匹配。第三个元素是表示代理内部唯一对象标识符的正整数,对应于 CSV 输出中的 “sid” 列。在导出前端或后端时,该值报告为 0。对于监听器或服务器,该值对应其在代理内的相应 ID。第四个元素是字段在列表中的数值位置(从零开始)。该位置不应随时间变化,但根据构建选项或未来字段被删除的情况,可能出现空缺。第五个元素是字段名称,其形式与 CSV 输出中的名称一致。第六个元素是正整数,表示从 1 开始的相对进程编号。
该行中第一个冒号之后的内容遵循上方段落所述的“类型化输出格式”。简而言之,第二个字段(第一个冒号之后)表示变量的来源、性质、作用域及持久化状态。第三个字段表示字段类型,包括 “s32”、“s64”、“u32”、“u64”、“flt” 和 “str”。第四个字段为值本身,消费者可根据第三字段的类型信息进行解析,并依据第二字段的信息进行处理。
当命令后附加 “desc” 时,会在指标后附加一个额外的冒号及一个被引号括起的字符串,用于描述该指标。截至本文撰写时,此功能仅支持 “typed” 输出格式。
因此,类型化模式下的整体行格式为:
以下是类型化输出格式的示例:
$ echo "show stat typed" | socat stdio unix-connect:/tmp/sock1
F.2.0.0.pxname.1:KNSV:str:dummy
F.2.0.1.svname.1:KNSV:str:FRONTEND
F.2.0.4.scur.1:MGPV:u32:0
F.2.0.5.smax.1:MMPV:u32:0
F.2.0.6.slim.1:CLPV:u32:524269
F.2.0.7.stot.1:MCPP:u64:0
F.2.0.8.bin.1:MCPP:u64:0
F.2.0.9.bout.1:MCPP:u64:0
F.2.0.10.dreq.1:MCPP:u64:0
F.2.0.11.dresp.1:MCPP:u64:0
F.2.0.12.ereq.1:MCPP:u64:0
F.2.0.17.status.1:SGPV:str:OPEN
F.2.0.26.pid.1:KGPV:u32:1
F.2.0.27.iid.1:KGSV:u32:2
F.2.0.28.sid.1:KGSV:u32:0
F.2.0.32.type.1:CGSV:u32:0
F.2.0.33.rate.1:MRPP:u32:0
F.2.0.34.rate_lim.1:CLPV:u32:0
F.2.0.35.rate_max.1:MMPV:u32:0
F.2.0.46.req_rate.1:MRPP:u32:0
F.2.0.47.req_rate_max.1:MMPV:u32:0
F.2.0.48.req_tot.1:MCPP:u64:0
F.2.0.51.comp_in.1:MCPP:u64:0
F.2.0.52.comp_out.1:MCPP:u64:0
F.2.0.53.comp_byp.1:MCPP:u64:0
F.2.0.54.comp_rsp.1:MCPP:u64:0
(...)在类型化格式中,第一列末尾的进程 ID 使得从多个进程获取的输出能够非常方便地进行视觉聚合,如下例所示,每行均对应一个进程:
$ ( echo show stat typed | socat /var/run/haproxy.sock1 -; \
echo show stat typed | socat /var/run/haproxy.sock2 - ) | \
sort -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5 -k 6,6n
B.3.0.0.pxname.1:KNSV:str:private-backend
B.3.0.0.pxname.2:KNSV:str:private-backend
B.3.0.1.svname.1:KNSV:str:BACKEND
B.3.0.1.svname.2:KNSV:str:BACKEND
B.3.0.2.qcur.1:MGPV:u32:0
B.3.0.2.qcur.2:MGPV:u32:0
B.3.0.3.qmax.1:MMPV:u32:0
B.3.0.3.qmax.2:MMPV:u32:0
B.3.0.4.scur.1:MGPV:u32:0
B.3.0.4.scur.2:MGPV:u32:0
B.3.0.5.smax.1:MMPV:u32:0
B.3.0.5.smax.2:MMPV:u32:0
B.3.0.6.slim.1:CLPV:u32:1000
B.3.0.6.slim.2:CLPV:u32:1000
(...)JSON 输出格式的定义详见其模式,可使用命令 “show schema json” 输出该模式。
JSON 输出中不包含额外的空白字符,以减少输出体积。如需人工阅读,可通过格式化工具处理输出以提高可读性。示例:
$ echo “show stat json” | socat /var/run/haproxy.sock stdio | \ python -m json.tool
JSON 输出中不包含额外的空白字符,以减少输出体积。如需人工阅读,可通过格式化工具处理输出以提高可读性。示例:
$ echo “show stat json” | socat /var/run/haproxy.sock stdio | \ python -m json.tool
show ssl ca-file [[*][\]<cafile>[:<index>]]
显示进程加载的 CA 文件列表及其各自的证书数量。证书在状态为“已使用”前不会被任何前端或后端使用。列表中可能出现 “@system-ca” 条目,该条目由 httpclient 默认加载,包含 OpenSSL 返回的系统信任 CA 列表。若文件名前缀为星号,则表示该操作尚未提交。若指定 <cafile> 而未指定 <index>,将显示 CA 文件的状态(“已使用”/“未使用”),随后列出该 CA 文件中包含的所有证书的详细信息。每个证书显示的详细信息与 “show ssl cert” 命令输出一致。若指定 <cafile> 后跟 <index>,则仅显示指定索引的证书详情。索引从 1 开始。若索引无效(例如过大),则不显示任何内容。该命令可用于检查 CA 文件是否已正确更新。也可通过在文件名前加 ‘’ 来查看正在进行中的事务详情。若文件名首字符为 ‘’,可使用 ‘\*’ 进行转义。
示例:
$ echo "show ssl ca-file" | socat /var/run/haproxy.master -
# transaction
*cafile.crt - 2 certificate(s)
# filename
cafile.crt - 1 certificate(s)
$ echo "show ssl ca-file cafile.crt" | socat /var/run/haproxy.master -
Filename: /home/tricot/work/haproxy/reg-tests/ssl/set_cafile_ca2.crt
Status: Used
Certificate #1:
Serial: 11A4D2200DC84376E7D233CAFF39DF44BF8D1211
notBefore: Apr 1 07:40:53 2021 GMT
notAfter: Aug 17 07:40:53 2048 GMT
Subject Alternative Name:
Algorithm: RSA4096
SHA1 FingerPrint: A111EF0FEFCDE11D47FE3F33ADCA8435EBEA4864
Subject: /C=FR/ST=Some-State/O=HAProxy Technologies/CN=HAProxy Technologies CA
Issuer: /C=FR/ST=Some-State/O=HAProxy Technologies/CN=HAProxy Technologies CA
$ echo "show ssl ca-file *cafile.crt:2" | socat /var/run/haproxy.master -
Filename: */home/tricot/work/haproxy/reg-tests/ssl/set_cafile_ca2.crt
Status: Unused
Certificate #2:
Serial: 587A1CE5ED855040A0C82BF255FF300ADB7C8136
[...]show ssl cert [[*][\]<filename>]
显示已加载到进程中的证书列表。这些证书在状态为“已使用”之前,不会被任何前端或后端使用。若文件名前缀为星号,则表示该证书为尚未提交的事务。若指定文件名,将显示该证书的详细信息。此命令可用于检查证书是否已正确更新。也可通过在文件名前加 ‘’ 来显示事务的详细信息。若文件名首字符为 ‘’,可使用 \* 进行转义。此命令还可通过在文件名后缀 “.ocsp” 扩展名来显示证书的 OCSP 响应详情。该功能对已提交的证书及正在进行的事务均有效。对于已提交的证书,此命令等效于使用证书对应的 OCSP 响应 ID 调用 “show ssl ocsp-response”。
示例:
$ echo "@1 show ssl cert" | socat /var/run/haproxy.master -
# transaction
*test.local.pem
# filename
test.local.pem
$ echo "@1 show ssl cert test.local.pem" | socat /var/run/haproxy.master -
Filename: test.local.pem
Status: Used
Serial: 03ECC19BA54B25E85ABA46EE561B9A10D26F
notBefore: Sep 13 21:20:24 2019 GMT
notAfter: Dec 12 21:20:24 2019 GMT
Issuer: /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Subject: /CN=test.local
Subject Alternative Name: DNS:test.local, DNS:imap.test.local
Algorithm: RSA2048
SHA1 FingerPrint: 417A11CAE25F607B24F638B4A8AEE51D1E211477
$ echo "@1 show ssl cert *test.local.pem" | socat /var/run/haproxy.master -
Filename: *test.local.pem
Status: Unused
[...]
$ echo "@1 show ssl cert \*.local.pem" | socat /var/run/haproxy.master -
Filename: *.local.pem
Status: Used
[...]show ssl crl-file [[*][\]<crlfile>[:<index>]]
显示已加载到进程中的 CRL 文件列表。这些文件在状态为“已使用”之前,不会被任何前端或后端使用。若文件名前缀为星号,表示该操作尚未提交。若指定 <crlfile> 而未指定 <index>,将显示 CRL 文件的状态(“已使用”/“未使用”),并列出该 CRL 文件中包含的所有吊销列表的详细信息。每个列表的详细信息基于命令 “openssl crl -text -noout -in <file>” 的输出。若指定 <crlfile> 后跟 <index>,则仅显示指定索引的列表详情。索引从 1 开始。若索引无效(例如过大),则不显示任何内容。该命令可用于检查 CRL 文件是否已正确更新。也可以通过在文件名前加 ‘’ 来查看正在进行中的事务的详情。若文件名首字符为 ‘’,可使用 ‘\*’ 进行转义。
示例:
$ echo "show ssl crl-file" | socat /var/run/haproxy.master -
# transaction
*crlfile.pem
# filename
crlfile.pem
$ echo "show ssl crl-file crlfile.pem" | socat /var/run/haproxy.master -
Filename: /home/tricot/work/haproxy/reg-tests/ssl/crlfile.pem
Status: Used
Certificate Revocation List #1:
Version 1
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=FR/O=HAProxy Technologies/CN=Intermediate CA2
Last Update: Apr 23 14:45:39 2021 GMT
Next Update: Sep 8 14:45:39 2048 GMT
Revoked Certificates:
Serial Number: 1008
Revocation Date: Apr 23 14:45:36 2021 GMT
Certificate Revocation List #2:
Version 1
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=FR/O=HAProxy Technologies/CN=Root CA
Last Update: Apr 23 14:30:44 2021 GMT
Next Update: Sep 8 14:30:44 2048 GMT
No Revoked Certificates.show ssl crt-list [-n] [<filename>]
显示 HAProxy 配置中使用的 crt-list 列表和目录列表。若指定文件名,则转储 crt-list 或目录的内容。转储后的输出可作为 crt-list 文件使用。使用 ‘-n’ 选项可显示行号,当与 ‘del ssl crt-list’ 选项配合使用且存在重复条目时尤为有用。使用 ‘-n’ 选项输出的内容不兼容 crt-list 格式,且无法被 HAProxy 加载。
示例:
echo "show ssl crt-list -n localhost.crt-list" | socat /tmp/sock1 -
# localhost.crt-list
common.pem:1 !not.test1.com *.test1.com !localhost
common.pem:2
ecdsa.pem:3 [verify none allow-0rtt ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3] localhost !www.test1.com
ecdsa.pem:4 [verify none allow-0rtt ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3]show ssl ech [<name>]
显示 HAProxy 进程中加载的 ECH 密钥列表。
当指定 <name> 时,显示特定绑定行的键。绑定行格式为 <frontend>/@<filename>:<linenum>(例如:frontend1/@HAProxy.conf:19),或 <frontend>/<name>(若绑定行使用了 “name” 关键字命名)。
‘age’ 条目表示键在绑定行中加载以来经过的时间(单位:秒)。当 HAProxy 启动、重载或重启时,该值将被重置。
必须使用支持 ECH 的 OpenSSL 版本,且 HAProxy 必须以 USE_ECH=1 编译。 该命令仅在以实验模式运行的 CLI 连接中受支持(参见“experimental-mode on”)。
另请参见配置手册中 第 5.1 节 的 “ech”。
示例:
$ echo "experimental-mode on; show ssl ech" | socat /tmp/haproxy.sock -
***
frontend: frontend1
bind: frontend1/@haproxy.conf:19
ECH entry: 0 public_name: example.com age: 557 (has private key)
[fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]
ECH entry: 1 public_name: example.com age: 557 (has private key)
[fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]
bind: frontend1/@haproxy.conf:20
ECH entry: 0 public_name: example.com age: 557 (has private key)
[fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]
ECH entry: 1 public_name: example.com age: 557 (has private key)
[fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]
$ echo "experimental-mode on; show ssl ech frontend1/@haproxy.conf:19" | socat /tmp/haproxy.sock -
***
ECH for frontend1/@haproxy.conf:19
ECH entry: 0 public_name: example.com age: 786 (has private key)
[fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]
ECH entry: 1 public_name: example.com age: 786 (has private key)
[fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]show ssl jwt
显示可用于 JWT 验证的证书列表。参见“add ssl jwt”和“del ssl jwt”命令。有关更多信息,请参见“jwt”证书选项。
示例:
show ssl ocsp-response [[text|base64] <id|path>]
显示 HAProxy 中所用所有 OCSP 响应对应的 OCSP 树条目 ID,以及对应前端证书的路径、颁发者名称与密钥哈希,以及该 OCSP 响应所针对证书的序列号。若提供有效的 <id> 或有效前端证书的 <path>,则显示对应 OCSP 响应的内容。当提供 <id> 时,可定义数据转储的格式。’text’ 为默认选项,可显示与执行 “openssl ocsp -respin <ocsp-response> -text” 命令时相同的 OCSP 响应详细信息。‘base64’ 格式可将 OCSP 响应内容以 base64 形式转储。
示例:
$ echo "show ssl ocsp-response" | socat /var/run/haproxy.master -
# Certificate IDs
Certificate ID key: 303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a0202100a
Certificate path: /path_to_cert/foo.pem
Certificate ID:
Issuer Name Hash: 8A83E0060FAFF709CA7E9B95522A2E81635FDA0A
Issuer Key Hash: F652B0E435D5EA923851508F0ADBE92D85DE007A
Serial Number: 100A
$ echo "show ssl ocsp-response 303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a0202100a" | socat /var/run/haproxy.master -
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: C = FR, O = HAProxy Technologies, CN = ocsp.haproxy.com
Produced At: May 27 15:43:38 2021 GMT
Responses:
Certificate ID:
Hash Algorithm: sha1
Issuer Name Hash: 8A83E0060FAFF709CA7E9B95522A2E81635FDA0A
Issuer Key Hash: F652B0E435D5EA923851508F0ADBE92D85DE007A
Serial Number: 100A
Cert Status: good
This Update: May 27 15:43:38 2021 GMT
Next Update: Oct 12 15:43:38 2048 GMT
[...]
$ echo "show ssl ocsp-response base64 /path_to_cert/foo.pem" | socat /var/run/haproxy.sock -
MIIB8woBAKCCAewwggHoBgkrBgEFBQcwAQEEggHZMIIB1TCBvqE[...]show ssl ocsp-updates
显示由 OCSP 更新机制所涉及条目的信息。该命令将为每个 OCSP 响应输出一行,包含响应的预期更新时间、上次成功更新的时间,以及成功和失败更新的计数器。同时,将以数值形式和文本形式提供上次更新的状态(成功或失败)。有关可能错误的完整列表,请参见下文。输出行将按“Next Update”时间升序排列。每行还将包含指向使用该 OCSP 响应的第一个前端证书的路径。有关 OCSP 自动更新的更多信息,请参见“show ssl ocsp-response”命令和“ocsp-update”选项。
更新的错误码和错误字符串可能如下:
+----+-------------------------------------+
| ID | message |
+----+-------------------------------------+
| 0 | "Unknown" |
| 1 | "Update successful" |
| 2 | "HTTP error" |
| 3 | "Missing \"ocsp-response\" header" |
| 4 | "OCSP response check failure" |
| 5 | "Error during insertion" |
+----+-------------------------------------+示例:
$ echo "show ssl ocsp-updates" | socat /tmp/haproxy.sock -
OCSP Certid | Path | Next Update | Last Update | Successes | Failures | Last Update Status | Last Update Status (str)
303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a02021015 | /path_to_cert/cert.pem | 30/Jan/2023:00:08:09 +0000 | - | 0 | 1 | 2 | HTTP error
304b300906052b0e03021a0500041448dac9a0fb2bd32d4ff0de68d2f567b735f9b3c40414142eb317b75856cbae500940e61faf9d8b14c2c6021203e16a7aa01542f291237b454a627fdea9c1 | /path_to_cert/other_cert.pem | 30/Jan/2023:01:07:09 +0000 | 30/Jan/2023:00:07:09 +0000 | 1 | 0 | 1 | Update successfulshow ssl providers
显示 OpenSSL 初始化期间加载的提供者名称。提供者加载确实可通过 OpenSSL 配置文件进行配置,此选项可用于检查是否加载了正确的提供者。该命令仅在 OpenSSL v3 中可用。
示例:
show ssl sni [-f <frontend>] [-A] [-t <offset>]
dump 指定前端配置的全部 SNI,若未指定前端则 dump 所有前端。该功能可用于查看前端提供的 SNI 列表,并识别同一前端是否因多个证书而重复定义了某个 SNI。
-A 选项可用于过滤列表,仅显示已过 notAfter 日期的证书,从而仅展示已过期的证书。
-t 选项接受以秒为单位的偏移量,或带时间单位(s、m、h、d)的偏移量,该偏移量将加到当前时间上,结合 -A. 使用时,可用于检查在偏移时间之后到期的证书。例如,若要检查 30 天后将过期的证书,只需执行命令 “show ssl sni -A -t 30d”。
列之间以单个 \t 分隔,便于简单解析。
“前端/绑定”列显示前端名称,后跟配置中的绑定行位置(前端/文件:行号)。
‘SNI’ 列显示 SNI,其内容可以是 CN、SAN 或来自 crt-list 的过滤器。绑定行的默认证书(即通过 ‘default-crt’ 显式声明的证书,或在未使用 ‘strict-sni’ 时隐式取绑定行中第一个证书)在 SNI 列中显示为 ‘*’ 字符。
“负向过滤器”列列出与通配符关联的负向过滤器,该列将显示位于同一 crt-list 行上的所有负向过滤器。若无负向过滤器,则显示连字符。
“类型”列显示加密算法类型,可以是 “rsa”、“ecdsa” 或 “dsa”。
‘文件名’ 列可以是配置中的文件名,也可以是 crt-store 中声明的别名。
‘NotAfter’ 和 ‘NotBefore’ 列直接从 X509 叶证书中提取。
示例:
$ echo "@1 show ssl sni -A -t 30d" | socat /var/run/haproxy-master.sock - | column -t -s $'\t'
# Frontend/Bind SNI Negative Filter Type Filename NotAfter NotBefore
li1/haproxy.cfg:10021 *.ex.lan !m1.ex.lan rsa example.lan.pem Jun 13 13:37:21 2024 GMT May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021 machine10 - ecdsa machine10.pem.ecdsa Jun 13 13:37:21 2024 GMT May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021 machine10 - rsa machine10.pem.rsa Jun 13 13:37:21 2024 GMT May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021 machine10 - ecdsa machine10.pem.ecdsa Jun 13 13:37:21 2024 GMT May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021 localhost - rsa localhost.pem.rsa Jun 13 13:37:11 2024 GMT May 14 13:37:11 2024 GMT
li1/haproxy.cfg:10021 localhost - ecdsa localhost.pem.ecdsa Jun 13 13:37:10 2024 GMT May 14 13:37:10 2024 GMT
li1/haproxy.cfg:10021 * - rsa localhost.pem.rsa Jun 13 13:37:11 2024 GMT May 14 13:37:11 2024 GMTshow startup-logs
输出当前 HAProxy 进程启动期间发出的所有消息,每个 startup-logs 缓冲区均与其 HAProxy 工作进程唯一对应。
该关键字也存在于主 CLI 中,用于显示最新的启动或重载尝试状态。
show table
转储所有已知 stick-table 的通用信息。返回其名称(持有该 stick-table 的代理名称)、类型(当前始终为 0,表示 IP)、最大可能条目数以及当前已使用的条目数。
示例:
$ echo "show table" | socat stdio /tmp/sock1
>>> # table: front_pub, type: ip, size:204800, used:171454
>>> # table: back_rdp, type: ip, size:204800, used:0show table <name> [ data.<type> <operator> <value> [data.<type> ...]] |
show table <name> [ data.<type> <operator> <value> [data.<type> ...]] |
[ key <key> ] | [ ptr <ptr> ]转储 stick-table <name> 的内容。在此模式下,首先会报告与“show table”相同的关于该表的通用信息,随后转储所有条目。由于该操作可能产生大量数据,可以指定一个过滤器,以明确显示哪些条目。
当使用 “data.” 形式时,过滤器作用于存储的数据(参见第 4.2 段中的 “stick-table”)。必须在 <type> 中指定存储的数据类型,且该数据类型必须已存储于表中,否则将报告错误。数据将根据 <operator> 与 64 位整数 <value> 进行比较。操作符与 ACL 中相同:
- eq: match entries whose data is equal to this value
- ne: match entries whose data is not equal to this value
- le: match entries whose data is less than or equal to this value
- ge: match entries whose data is greater than or equal to this value
- lt: match entries whose data is less than this value
- gt: match entries whose data is greater than this value
在此形式中,可使用多个数据过滤器条目,最多可达构建时定义的上限(默认为 4 个)。
使用键值形式时,将显示条目 <key>。键的类型必须与表的类型相同,当前仅限于 IPv4、IPv6、整数和字符串。
当使用 ptr 形式时,将显示条目 <ptr>。<ptr> 以 0xffff 格式书写,必须与先前执行“show table”命令返回的地址对应。若因键为空或 CLI 中存在不兼容字符而无法通过键匹配条目时,使用指针匹配条目可能具有实际意义。
如果 data.<type> 为数组类型,可以使用 “[]” 访问数组中的特定索引,例如:data.gpt[1]
示例:
$ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1 \
bytes_out_rate(60000)=187
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191
$ echo "show table http_proxy data.gpc0 gt 0" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191
$ echo "show table http_proxy data.conn_rate gt 5" | \
socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191
$ echo "show table http_proxy key 127.0.0.2" | \
socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191
$ echo "show table http_proxy ptr 0x80e6a80" | \
socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
bytes_out_rate(60000)=191当数据准则应用于依赖时间的动态值(如字节速率)时,该值会在评估条目期间动态计算,以决定是否需要转储。这意味着此类过滤器可能在一段时间内匹配,随后不再匹配,因为随着时间推移,平均事件速率下降。
可以利用此功能提取滥用服务的 IP 地址列表,以便进行监控,甚至在防火墙中将其列入黑名单。示例:
$ echo "show table http_proxy data.gpc0 gt 0" \
| socat stdio /tmp/sock1 \
| fgrep 'key=' | cut -d' ' -f2 | cut -d= -f2 > abusers-ip.txt
( or | awk '/key/{ print a[split($2,a,"=")]; }' )当粘性表同步至支持分片的对等节点段时,每个键将显示其分片编号(否则报告为“0”)。这有助于确定哪些对等节点将接收该键。示例:
$ echo "show table http_proxy" | socat stdio /tmp/sock1 | fgrep shard=
0x7f23b0c822a8: key=10.0.0.2 use=0 exp=296398 shard=9 gpc0=0
0x7f23a063f948: key=10.0.0.6 use=0 exp=296075 shard=12 gpc0=0
0x7f23b03920b8: key=10.0.0.8 use=0 exp=296766 shard=1 gpc0=0
0x7f23a43c09e8: key=10.0.0.12 use=0 exp=295368 shard=8 gpc0=0show tasks
显示当前运行队列中任务的数量,以及每个函数的任务数量及其平均延迟(当已知时,仅适用于启用了任务剖析的纯任务)。该输出为执行瞬间的快照,结果可能因执行时队列中剩余的任务而有所差异,尤其是在单线程模式下,此时 I/O 操作重新填充队列的可能性较低(除非队列已满)。该命令会独占访问进程,在高负载进程上执行时可能导致轻微但可测量的延迟,因此必须避免被监控机器人滥用。
show threads
为每个线程转储一些内部状态和结构,有助于开发者理解问题。输出格式力求可读,每个线程显示一个独立区块。当 HAProxy 以 USE_THREAD_DUMP=1 编译时,会使用涉及线程信号的高级转储机制,使每个线程依次转储自身状态。若未启用此选项,执行命令的线程将显示全部详细信息,其余线程则信息较少。处理命令的线程前会显示星号(’*’)。若某线程前显示右角括号(’>’),表示自上次调用此命令以来该线程未取得任何进展,表明代码中存在必须立即报告的缺陷。若两个线程均出现此情况,通常指示存在死锁。若仅有一个线程出现此情况,则为其他类型缺陷,例如链表损坏。在所有情况下,进程已无法正常运行,必须重启。
输出格式未予文档化,以便在识别新需求时可轻松演进,无需维护任何形式的向后兼容性。与“show activity”类似,若无代码在手,这些值毫无意义。
show tls-keys [id|*]
dump 所有已加载的 TLS 会话票证密钥引用。显示 TLS 会话票证密钥引用 ID 以及密钥加载来源文件。可使用这两个信息通过命令 “set ssl tls-key” 更新 TLS 密钥。若指定 ID 作为参数,将仅转储该引用的会话票证;使用 * 则转储所有引用中的全部密钥。
show schema json
输出 “show info json” 和 “show stat json” 时所使用的模式的转储。
输出中不包含额外的空白字符,以减少输出体积。对于人工阅读,将输出通过格式化打印机处理可能更有帮助。示例:
$ echo “show schema json” | socat /var/run/haproxy.sock stdio | \ python -m json.tool
该模式遵循“JSON Schema”(json-schema.org)规范,因此可使用验证器对 “show info json” 和 “show stat json” 的输出结果依据该模式进行验证。
show trace [<source>]
显示当前追踪状态。对于每个源,将显示一行,其中单个字符的状态指示追踪是否已停止、等待或运行。输出接收端(或“none”表示未设置)以及该接收端中丢弃的事件数量,随后是源的简要描述。若指定了源名称,则会列出该源支持的所有事件的详细列表,以及每个动作(报告、启动、暂停、停止)的状态,启用时以“+”表示,否则以“-”表示。所有这些事件相互独立,一个事件可能触发启动但未被报告,反之亦然。
show version
显示当前 HAProxy 进程的版本。此命令可从主进程和工作进程的 CLI 中调用。
示例:
$ echo "show version" | socat /var/run/haproxy.sock stdio
2.4.9
$ echo "show version" | socat /var/run/haproxy-master.sock stdio
2.5.0shutdown frontend <frontend>
完全删除指定的前端。该前端绑定的所有端口将被释放。执行此操作后,前端将无法再启用。此操作旨在用于无法想象停止代理的环境,但又必须修复配置错误的代理时使用。通过这种方式,可以释放端口,并将其绑定到其他进程以恢复服务。前端一旦终止,将完全不会出现在统计信息页面上。
前端可通过其名称或其数字 ID 指定,数字 ID 前需加井号(’#’)。
此命令受限制,仅可在配置为“admin”级别的套接字上执行。
shutdown session <id>
立即终止与指定流标识符匹配的流。该标识符是 “show sess” 转储输出中每行开头的第一个字段(对应流指针)。此操作可用于在不等待超时的情况下终止长时间运行的流,或在持续传输进行时终止该流。被终止的流将在日志中以 ‘K’ 标志报告。
shutdown sessions server <backend>/<server>
立即终止与指定服务器关联的所有流。例如,可在将服务器置于维护模式后,使用此操作终止长时间运行的流。被终止的流将在日志中以 ‘K’ 标志报告。
后端连接在空闲状态下保留,除非服务器已进入维护模式,此时连接将立即被安排删除。
trace
trace 命令单独使用时,会列出追踪源、其当前状态及简要描述。该命令仅作为进入下一级操作的菜单,详见下方其他 trace 命令。
trace 0
立即停止所有追踪。此操作用于快速终止调试会话,或在多个源上启用了复杂追踪且影响服务时作为紧急处理动作。
trace <source> [<args...>]
为源 <source> 配置追踪。不带参数时,将列出该源支持的所有子命令。可串联多个子命令。支持的子命令如下:
event [ [+|-|!]<name> ] 不带参数时,将列出指定源支持的所有事件。已启用的事件前缀为 “+",未启用的事件前缀为 “-"。请注意,单个追踪可能被标记为多个事件,只要任一已启用的事件与追踪中标记的事件匹配,该事件就会传递至追踪子系统。例如,接收一个类型为 HEADERS 的 HTTP/2 帧可能触发帧事件和流事件,因为该帧会创建一个新流。若该源已启用帧事件或流事件中的任意一个,该帧将被传递至追踪框架。
With an argument, it is possible to toggle the state of each event and
individually enable or disable them. Two special keywords are supported,
"none", which matches no event, and is used to disable all events at once,
and "any" which matches all events, and is used to enable all events at
once. Other events are specific to the event source. It is possible to
enable one event by specifying its name, optionally prefixed with '+' for
better readability. It is possible to disable one event by specifying its
name prefixed by a '-' or a '!'.
One way to completely disable a trace source is to pass "event none", and
this source will instantly be totally ignored.
跟随 <other_source>。当另一源 <other_source> 锁定于某一条件,且当前源也匹配相同条件时,此操作允许源 <source> 同时发出追踪信息。例如,若某一源锁定于会话,从另一源跟随该源将导致后者为与该会话相关的所有事件发出追踪信息。此功能可在一定程度上用于追踪后端请求及其关联的前端连接。“session” 源通过提供 “new” 和 “end” 事件,使此类锁定处理更加简便。请注意,此时源 <source> 无需启用追踪,其追踪状态也不会受到影响。然而,若某些事件不包含可用于关联到被追踪元素的信息,则可能遗漏部分事件。该命令也可与元源 “all” 一同使用:此时所有源将跟随 <other_source>。
示例:
level [<level>] 不带参数时,将列出此源的所有跟踪级别,当前级别前会以星号(’*’)作为标记。带参数时,将跟踪级别更改为指定级别。详细级别是一种在事件上报前应用的过滤器。此类过滤器用于根据事件的重要程度选择性地包含或排除事件。例如,开发者可能需要精确了解 HTTP 头在代码中的哪个位置被判定为无效,而终端用户可能根本不在意该头的有效性。目前,跟踪级别共有 5 个不同等级:
user this will report information that are suitable for use by a
regular haproxy user who wants to observe his traffic.
Typically some HTTP requests and responses will be reported
without much detail. Most sources will set this as the
default level to ease operations.
proto in addition to what is reported at the "user" level, it also
displays protocol-level updates. This can for example be the
frame types or HTTP headers after decoding.
state in addition to what is reported at the "proto" level, it
will also display state transitions (or failed transitions)
which happen in parsers, so this will show attempts to
perform an operation while the "proto" level only shows
the final operation.
data in addition to what is reported at the "state" level, it
will also include data transfers between the various layers.
developer it reports everything available, which can include advanced
information such as "breaking out of this loop" that are
only relevant to a developer trying to understand a bug that
only happens once in a while in field. Function names are
only reported at this level.It is highly recommended to always use the "user" level only and switch to
other levels only if instructed to do so by a developer. Also it is a good
idea to first configure the events before switching to higher levels, as it
may save from dumping many lines if no filter is applied. The meta-source
"all" may also be used with this command: in this case, the level will be
applied to all existing sources at once.
lock [criterion] 若不带参数,将列出此源支持的所有锁住条件,并在当前选择的条件前用星号(’*’)标注。锁住(lock-on)表示该源将聚焦于首个匹配的事件,并仅持续关注触发该事件的条件,直到追踪结束前忽略所有其他条件。例如,这可用于对单个连接或单个流进行追踪。以下条件由部分追踪支持,但并非所有追踪均支持,因为某些条件可能对特定源不可用:
backend lock on the backend that started the trace
connection lock on the connection that started the trace
frontend lock on the frontend that started the trace
listener lock on the listener that started the trace
nothing do not lock on anything
server lock on the server that started the trace
session lock on the session that started the trace
thread lock on the thread that started the traceIn addition to this, each source may provide up to 4 specific criteria such
as internal states or connection IDs. For example in HTTP/2 it is possible
to lock on the H2 stream and ignore other streams once a strace starts.
When a criterion is passed in argument, this one is used instead of the
other ones and any existing tracking is immediately terminated so that it
can restart with the new criterion. The special keyword "nothing" is
supported by all sources to permanently disable tracking.
{ pause | start | stop } [ [+|-|!]event] 不带参数时,将列出为该追踪源自动暂停、启动或停止追踪所启用的事件。这些事件因每个追踪源而异。带参数时,将为指定动作启用事件(若可选地以 ‘+’ 前缀)或禁用事件(若以 ‘-’ 或 ‘!’ 前缀)。特殊关键字 “now” 并非事件,而是请求立即执行动作。关键字 “none” 和 “any” 的用法与 “trace event” 中一致。
The 3 supported actions are respectively "pause", "start" and "stop". The
"pause" action enumerates events which will cause a running trace to stop
and wait for a new start event to restart it. The "start" action enumerates
the events which switch the trace into the waiting mode until one of the
start events appears. And the "stop" action enumerates the events which
definitely stop the trace until it is manually enabled again. In practice it
makes sense to manually start a trace using "start now" without caring about
events, and to stop it using "stop now". In order to capture more subtle
event sequences, setting "start" to a normal event (like receiving an HTTP
request) and "stop" to a very rare event like emitting a certain error, will
ensure that the last captured events will match the desired criteria. And
the pause event is useful to detect the end of a sequence, disable the
lock-on and wait for another opportunity to take a capture. In this case it
can make sense to enable lock-on to spot only one specific criterion (e.g. a
stream), and have "start" set to anything that starts this criterion
(e.g. all events which create a stream), "stop" set to the expected anomaly,
and "pause" to anything that ends that criterion (e.g. any end of stream
event). In this case the trace log will contain complete sequences of
perfectly clean series affecting a single object, until the last sequence
containing everything from the beginning to the anomaly.
sink [<sink>] 若不带参数,将列出此源可用的所有事件接收端,当前配置的接收端前会附加星号(’*’)。接收端 “none” 始终可用,表示所有事件将被直接丢弃,尽管其处理不会被忽略(例如,锁机制仍会生效)。其他接收端是否可用取决于配置和构建选项,但通常在调试模式下 “stdout” 和 “stderr” 可用,内存环形缓冲区也应可用。指定名称后,接收端将立即切换至指定源。接收端切换期间事件不会被更改。最坏情况下,若使用无效接收端(或 “none”)可能导致部分事件丢失,但操作仍会继续发送至其他目标。该命令也可与元源 “all” 一同使用:此时接收端将同时应用于所有现有源。
verbosity [<level>] 不带参数时,将列出此源的所有详细级别,当前级别前会以星号(’*’)标记。带参数时,将详细级别更改为指定值。
Verbosity levels indicate how far the trace decoder should go to provide
detailed information. It depends on the trace source, since some sources
will not even provide a specific decoder. Level "quiet" is always available
and disables any decoding. It can be useful when trying to figure what's
happening before trying to understand the details, since it will have a very
low impact on performance and trace size. When no verbosity levels are
declared by a source, level "default" is available and will cause a decoder
to be called when specified in the traces. It is an opportunistic decoding.
When the source declares some verbosity levels, these ones are listed with a
description of what they correspond to. In this case the trace decoder
provided by the source will be as accurate as possible based on the
information available at the trace point. The first level above "quiet" is
set by default.
update ssl ocsp-response <certfile>
为指定的 <certfile> 创建 OCSP 请求,并将其发送至 OCSP 响应器。OCSP 响应器的 URI 应在证书的“权威信息访问”段中指定。仅第一个 URI 会被考虑。随后将检查所接收的 OCSP 响应,并将其插入本地 OCSP 响应树中。该命令仅对已存储 OCSP 响应的证书有效,这些证书的 OCSP 响应可能在初始化时提供,或此前通过 “set ssl cert” 或 “set ssl ocsp-response” 命令设置。若接收到的 OCSP 响应有效且已正确插入本地树中,其内容将显示在标准输出上。格式与 “show ssl ocsp-response” 中描述的相同。
wait { -h | <delay> } [<condition> [<args>...]]
在最简单的形式下,不带任何条件时,该操作会等待指定的延迟时间后再继续执行。此功能可用于收集特定时间间隔内的指标数据。
在指定条件和可选参数下,该命令将等待指定条件得到满足、不可恢复地失败,或在 <delay> 时长内始终不满足。支持的条件如下:
-
be-removable
<proxy>:等待指定的代理后端可由“del backend”命令移除。某些条件将始终不被接受(例如后端尚未发布或其中包含服务器),并导致返回特定错误消息,指出未满足的条件。若在延迟时间内一切正常,则返回成功,并终止操作。 -
srv-removable
<proxy>/<server>:此选项将等待指定服务器被 “del server” 命令移除,即处于维护状态且不再有任何连接(无论是活动连接还是空闲连接)。某些条件将始终不被接受(例如未处于维护状态),并导致返回特定错误消息,指出未满足的条件。服务器甚至可能已被并行移除,不再存在。若在超时前所有条件均满足,则返回成功,并终止操作。
默认情况下,延迟单位为毫秒,但也可接受其他单位,只要其后缀为常规计时单位(us、ms、s、m、h、d)。使用 socat 工具时,请勿忘记将 socat 的关闭超时时间延长至覆盖等待时间。将 “-h” 作为第一个或第二个参数传入可显示命令的用法。示例:
$ socat -t20 /path/to/socket - <<< "show activity; wait 10s; show activity"
$ socat -t5 /path/to/socket - <<< "
disable server px/srv1
shutdown sessions server px/srv1
wait 2s srv-removable px/srv1
del server px/srv1"9.4. 主命令行界面
主进程 CLI 是主进程/工作进程模式下绑定至主进程的套接字。该 CLI 可访问所有运行中或即将退出的进程中的 Unix 套接字命令,并允许对这些进程进行基本监控。
主 CLI 仅可通过 HAProxy 程序参数中的 -S 选项进行配置。该选项还接受以逗号分隔的绑定选项。
示例:
# haproxy -W -S 127.0.0.1:1234 -f test1.cfg
# haproxy -Ws -S /tmp/master-socket,uid,1000,gid,1000,mode,600 -f test1.cfg
# haproxy -W -S /tmp/master-socket,level,user -f test1.cfg9.4.1. 主命令行命令
@<[!]pid>
主 CLI 使用特殊的前缀表示法来访问多个进程。该表示法易于识别,因其以 @ 开头。
以 @ 开头可后接相对进程号,或后接感叹号和 PID(例如 @1 或 @!1271)。单独使用 @ 可用于指定主进程。仅通过 PID 作为相对进程号才能访问的进程,仅在当前进程上下文中可用。
此前缀可用作命令前的包装符,表示仅将该命令及其本身发送至指定进程。此时,完整命令的结束位置与常规命令相同,即行尾或分号处。
缺陷:用于在主进程与工作进程之间实现通信的 sockpair@ 协议在 macOS 上已知不可靠,这是由于 macOS 的 sendmsg(2) 实现存在缺陷所致。因此,命令可能因该问题而无响应。
示例:
$ socat /var/run/haproxy-master.sock readline
prompt
master> @1 show info; @2 show info
[...]
Process_num: 1
Pid: 1271
[...]
Process_num: 2
Pid: 1272
[...]
master>
$ echo '@!1271 show info; @!1272 show info' | socat /var/run/haproxy-master.sock -
[...]前缀也可作为独立命令使用,用于将默认执行上下文切换至指定进程,表示所有后续命令均将在该进程内执行,直至新的 ‘@’ 命令再次更改执行上下文。
示例:
$ socat /var/run/haproxy-master.sock readline
prompt
master> @1
1271> show info
[...]
1271> show stat
[...]
1271> @
master>
$ echo '@1; show info; show stat; @2; show info; show stat' | socat /var/run/haproxy-master.sock -
[...]关于限制的说明:少数罕见命令会更改 CLI 会话的状态(例如 “set anon”、“set timeout”),在从主 CLI 执行时可能无法完全保持一致的行为,因为这些命令是逐个发送到各自的 CLI 会话中执行的。类似地,少数罕见命令(“show events”、“wait”)会主动监控 CLI 的输入或关闭状态,一旦 CLI 关闭便会立即中断。通过主 CLI 执行时,这些命令无法按预期工作,因为每个命令执行后其输入流即被关闭。对于此类罕见情况,下方的 “@@” 变体可能更为合适。
@@<[!]pid> [command...]
此前缀或命令与上述文档中记录的 “@” 前缀非常相似,不同之处在于它会进入工作进程,将整个命令行原样传递给该进程,并在命令执行完毕前保持连接。分号也会被传递,从而允许在工作进程中执行完整的命令流水线。与工作进程的连接将持续开放,直至命令列表执行完毕。在命令执行完成后发送的任何数据将被转发至工作进程的 CLI,可能被正在执行的命令所消耗,而对主进程 CLI 来说将丢失,从而实现与工作进程的真正双向连接。因此,使用此类命令的用户必须格外小心,在发送新命令至主 CLI 之前,务必等待当前命令执行完成。
无需执行单个命令,也可以通过不在单独一行上指定任何命令(即仅输入 “@@1”)的方式,在工作进程上打开一个完全交互式的会话。该会话可通过关闭连接或通过退出工作进程(使用 “quit” 命令)来终止。此时,主控套接字的提示模式(交互式、提示式、定时式)将传播至工作进程。
缺陷:用于在主进程与工作进程之间实现通信的 sockpair@ 协议在 macOS 上已知不可靠,这是由于 macOS 的 sendmsg(2) 实现存在缺陷所致。因此,命令可能因该问题而无响应。
示例:
# gracefully close connections and delete a server once idle (wait max 10s)
$ socat -t 11 /var/run/haproxy-master.sock - <<< \
"@@1 disable server app2/srv36; \
wait 10000 srv-removable app2/srv36; \
del server app2/srv36"
# forcefully close connections and quickly delete a server
$ socat /var/run/haproxy-master.sock - <<< \
"@@1 disable server app2/srv36; \
shutdown sessions server app2/srv36; \
wait 100 srv-removable app2/srv36; \
del server app2/srv36"
# show messages arriving to this ring in real time ("tail -f" equivalent)
$ (echo "show events buf0 -w"; read) | socat /var/run/haproxy-master.sock -expert-mode [on|off]
此命令为通过主控 CLI 访问的每个工作进程激活“专家模式”。与“mcli-debug-mode”结合使用时,还会在主控端激活该命令。在主控 CLI 提示符中显示标志“e”。
参见 第 9.3 节 中的 “expert-mode” 以及 9.4.1 中的 “mcli-debug-mode”。
experimental-mode [on|off]
此命令为通过主控 CLI 访问的每个工作进程激活“experimental-mode”。 与“mcli-debug-mode”结合使用时,还会在主控 CLI 上激活该命令。 在主控 CLI 提示符中显示标志“x”。
另请参阅 第 9.3 节 中的 “experimental-mode” 以及 9.4.1 中的 “mcli-debug-mode”。
hard-reload
此命令与通过主 CLI 执行的“reload”命令功能相同,区别在于它会对前一个进程执行硬停止(-st),而非停止-停止(-sf)。这意味着前一个进程在退出前不会等待任何操作完成,因此所有连接将被立即关闭。
另请参见“reload”命令。
mcli-debug-mode [on|off]
此关键字可在主进程 CLI 中启用特殊模式,使主 CLI 可使用原本仅限工作进程 CLI 使用的命令,从而支持对主进程进行调试。启用后,可通过输入“help”查看新增可用命令。结合使用“experimental-mode”或“expert-mode”时,可启用更多命令。在主 CLI 提示符中显示标志“d”。
prompt
当通过 “prompt” 命令启用提示符时,CLI 所处的上下文将在提示符中显示。主进程以 “master” 字符串标识,其他进程则以其 PID 标识。若上次重载失败,主进程的提示符将变为 “master[ReloadFailed]>",以便明确显示当前进程仍在使用旧配置运行,且新配置尚未生效。
主 CLI 提示符可显示多个标志,表示启用的模式。“d” 表示 mcli-debug-mode,“e” 表示 expert-mode,“x” 表示 experimental-mode。
示例:
$ socat /var/run/haproxy-master.sock -
prompt
master> expert-mode on
master(e)> experimental-mode on
master(xe)> mcli-debug-mode on
master(xed)> @1
95191(xed)>reload
也可以使用“reload”命令重载 HAProxy 主进程,其效果与对主进程执行 kill -USR2 相同,前提是用户至少具备“operator”或“admin”权限。
此命令允许执行同步重载,命令将在重载完成后返回重载状态。若使用工具解析该状态,请注意超时设置,状态仅在配置解析完成且新工作进程创建后才会返回。默认情况下,“socat” 命令的超时时间为 0.5s,若重载耗时过长,该工具将在消息显示前退出。“ncat” 默认无超时设置。当使用 USE_SHM_OPEN=1 编译时,重载命令还可输出主进程的启动日志。
示例:
$ echo "reload" | socat -t300 /var/run/haproxy-master.sock stdin
Success=1
--
[NOTICE] (482713): haproxy version is 2.7-dev7-4827fb-69
[NOTICE] (482713): path to executable is ./haproxy
[WARNING] (482713): config: 'http-request' rules ignored for proxy 'frt1' as they require HTTP mode.
[NOTICE] (482713): New worker (482720) forked
[NOTICE] (482713): Loading success.
$ echo "reload" | socat -t300 /var/run/haproxy-master.sock stdin
Success=0
--
[NOTICE] (482886): haproxy version is 2.7-dev7-4827fb-69
[NOTICE] (482886): path to executable is ./haproxy
[ALERT] (482886): config: parsing [test3.cfg:1]: unknown keyword 'Aglobal' out of section.
[ALERT] (482886): config: Fatal errors found in configuration.
[WARNING] (482886): Loading failure!
$重载命令是主 CLI 上最后执行的命令,此后所有命令均被忽略。 重载命令返回状态后,将关闭与 CLI 的连接。
请注意,重载将关闭与主 CLI 的所有连接。另请参见“hard-reload”命令。
show proc [debug]
主 CLI 引入了 show proc 命令,用于监视进程。
示例:
$ echo 'show proc' | socat /var/run/haproxy-master.sock -
#<PID> <type> <reloads> <uptime> <version>
1162 master 5 [failed: 0] 0d00h02m07s 2.5-dev13
# workers
1271 worker 1 0d00h00m00s 2.5-dev13
# old workers
1233 worker 3 0d00h00m43s 2.0-dev3-6019f6-289在此示例中,主进程已重载 5 次,但其中一个旧的工作进程仍在运行,并成功存活了 3 次重载。可以访问该工作进程的 CLI 以了解当前情况。
‘debug’ 参数有助于显示调试详情,当前用于展示 IPC 通信的文件描述符(FDs)。请注意,调试输出在 HAProxy 不同版本之间无法保证稳定。
show startup-logs
HAProxy 必须使用 USE_SHM_OPEN=1 编译,才能在主 CLI 上正确使用,否则所有消息将不可见。
与统计套接字上的对应命令类似,该命令可用于显示 HAProxy 的启动消息。但该命令不会输出当前工作进程的启动消息,而是输出最近一次启动或重载的启动消息,这意味着它能够输出失败重载时的解析消息。
这些消息也会通过 “reload” 命令输出。
9.5. 统计文件
所谓统计文件可用于在进程启动时,以非零值预加载 HAProxy 内部计数器。其主要用途是在重载期间保留工作进程的统计信息。统计文件中仅包含所有暴露的 HAProxy 统计信息的片段,因为仅对指标类数值进行预加载才有意义。
目前,统计文件中仅支持代理计数器。这允许预先加载前端、后端、服务器和监听器的值。然而,仅存储具有非空 GUID 的对象实例。这确保了即使其他参数不同,也能为类型和 GUID 匹配的对象预先加载值。
CLI 命令 dump stats-file 的用途是生成统计信息文件。统计信息文件的格式由内部定义,未来可能随时更改或扩展。该格式至少保证在相邻的 HAProxy 稳定分支版本间兼容,但在将统计信息文件加载到较旧版本的进程时,可能需要额外的可选配置。
来源与许可
文档取自 pig.center · 上游文档
- 版本
- 3.4.4
- 许可
- GPL-2.0-only
- 来源修订
1dff183d0ca5a430d10324c5bbc64f9853ed77ae5df299827b47b2f54e352f65- 译文修订
1dff183d0ca5a430d10324c5bbc64f9853ed77ae5df299827b47b2f54e352f65