On this page
Apache 模块 mod_proxy_hcheck
Description: | mod_proxy平衡器成员(工作人员)的动态健康检查 |
---|---|
Status: | Extension |
Module Identifier: | proxy_hcheck_module |
Source File: | mod_proxy_hcheck.c |
Compatibility: | 在 Apache 2.4.21 及更高版本中可用 |
Summary
该模块提供了对平衡器成员(Worker)的动态健康检查。可以逐个 Worker 启用此功能。运行状况检查与实际的反向代理请求无关。
该模块需要 mod_watchdog的服务。
Note
hcmethod 无不执行动态运行状况检查。选择是:
Method | Description | Note |
---|---|---|
None | 没有进行动态健康检查 | |
TCP | 检查是否可以创建后端的套接字:例如“你起来了吗” | |
OPTIONS | 发送HTTP OPTIONS 请求到后端 |
* |
HEAD | 发送HTTP HEAD 请求到后端 |
* |
GET | 发送HTTP GET 请求到后端 |
* |
:除非使用hcexpr ,否则 2xx 或 3xx HTTP 状态将被解释为通过*健康检查 |
Usage examples
以下示例显示了如何配置各种后端服务器的运行状况检查:
ProxyHCExpr ok234 {%{REQUEST_STATUS} =~ /^[234]/}
ProxyHCExpr gdown {%{REQUEST_STATUS} =~ /^[5]/}
ProxyHCExpr in_maint {hc('body') !~ /Under maintenance/}
<Proxy balancer://foo>
BalancerMember http://www.example.com/ hcmethod=GET hcexpr=in_maint hcuri=/status.php
BalancerMember http://www2.example.com/ hcmethod=HEAD hcexpr=ok234 hcinterval=10
BalancerMember http://www3.example.com/ hcmethod=TCP hcinterval=5 hcpasses=2 hcfails=3
BalancerMember http://www4.example.com/
</Proxy>
ProxyPass "/" "balancer://foo"
ProxyPassReverse "/" "balancer://foo"
在这种情况下,通过向该服务器发送GET /status.php
请求并检查返回的页面不包含字符串* Under maintenance *来对http://www.example.com/
进行健康检查。如果是这样,则该服务器将进入运行状况检查失败模式,并被禁用。此动态检查每 30 秒执行一次,这是默认设置。
通过每 10 秒发送一个简单的HEAD
请求并确保响应状态为 2xx,3xx 或 4xx 来检查http://www2.example.com/
。只需确保该服务器的套接字已启动,便每 5 秒检查一次http://www3.example.com/
。如果后端被标记为“关闭”,并且通过了 2 次健康检查,它将被重新启用并重新添加到负载均衡器中。要使服务器禁用并将其移出旋转状态,需要执行 3 次背对背的运行状况检查失败。最后,http://www4.example.com/
根本不会动态检查。
ProxyHCExpr Directive
Description: | 创建一个命名条件表达式,用于根据其响应确定后端的运行状况 |
---|---|
Syntax: | ProxyHCExpr name {ap_expr expression} |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy_hcheck |
ProxyHCExpr
伪指令允许创建一个命名条件表达式,该表达式检查后端服务器的响应 Headers 以确定其运行状况。然后可以通过hcexpr
参数将此命名条件分配给平衡器成员。
ProxyHCExpr:允许传递 2xx/3xx/4xx
ProxyHCExpr ok234 {%{REQUEST_STATUS} =~ /^[234]/}
ProxyPass "/apps" "balancer://foo"
<Proxy balancer://foo>
BalancerMember http://www2.example.com/ hcmethod=HEAD hcexpr=ok234 hcinterval=10
</Proxy>
Note
expression可以使用大括号(“{}”)作为常规引号之外的引号。
如果使用运行状况检查方法(例如GET
)来生成响应主体,则可以使用hc()
表达式功能(通过该模块独有)通过ap_expr
检查该主体本身。
在下面的示例中,我们向后端发送一个GET
请求,并且如果响应正文中包含短语* Under maintenance *,我们希望禁用该后端。
ProxyHCExpr:检查响应正文
ProxyHCExpr in_maint {hc('body') !~ /Under maintenance/}
ProxyPass "/apps" "balancer://foo"
<Proxy balancer://foo>
BalancerMember http://www.example.com/ hcexpr=in_maint hcmethod=get hcuri=/status.php
</Proxy>
*注意:*由于响应主体可能很大,因此最好将其用于特定状态页面。
ProxyHCTemplate Directive
Description: | 创建一个命名模板以设置各种健康检查参数 |
---|---|
Syntax: | ProxyHCTemplate name parameter=setting [...] |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy_hcheck |
ProxyHCTemplate
伪指令允许创建一个命名的健康检查参数集(模板),然后可以通过hctemplate
参数将其分配给平衡器成员。
ProxyHCTemplate
ProxyHCTemplate tcp5 hcmethod=tcp hcinterval=5
ProxyPass "/apps" "balancer://foo"
<Proxy balancer://foo>
BalancerMember http://www2.example.com/ hctemplate=tcp5
</Proxy>
ProxyHCTPsize Directive
Description: | 设置用于运行状况检查工作程序的线程池在服务器范围内的总大小 |
---|---|
Syntax: | ProxyHCTPsize size |
Default: | ProxyHCTPsize 16 |
Context: | server config |
Status: | Extension |
Module: | mod_proxy_hcheck |
如果 Apache httpd 和 APR 带有线程支持,则运行状况检查模块会将实际检查的工作分流到与 Watchdog 进程关联的线程池中,从而允许并行检查。 ProxyHCTPsize
指令确定此线程池的大小。如果设置为0
,则根本不使用线程池,从而导致序列化运行状况检查。
ProxyHCTPsize
ProxyHCTPsize 32