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 无不执行动态运行状况检查。选择是:

MethodDescriptionNote
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