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