Apache HTTP Server 版本 2.4

| 描述 | 针对 mod_proxy 的负载均衡器成员(工作者)动态健康检查 |
|---|---|
| 状态 | 扩展 |
| 模块标识符 | proxy_hcheck_module |
| 源文件 | mod_proxy_hcheck.c |
| 兼容性 | 在 Apache 2.4.21 及更高版本中可用 |
此模块提供对负载均衡器成员(工作者)的动态健康检查。这可以在每个工作者基础上启用。健康检查独立于实际的反向代理请求进行。
此模块需要 mod_watchdog 的服务。
健康检查机制通过使用额外的 BalancerMember 参数启用,这些参数通过 ProxyPass 以标准方式配置。
此模块定义了一个新的 BalancerMember 状态 状态(标志):"C"。当工作者因健康检查模块确定的故障而下线时,将设置此标志,并且可以通过 balancer-manager 查看(和修改)。
| 参数 | 默认值 | 描述 | |||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hcmethod | 无 | 不执行动态健康检查。选项包括
| |||||||||||||||||||||||||||||||||
| hcpasses | 1 | 工作者重新启用之前成功的健康检查测试次数 | |||||||||||||||||||||||||||||||||
| hcfails | 1 | 工作者禁用之前失败的健康检查测试次数 | |||||||||||||||||||||||||||||||||
| hcinterval | 30 | 健康检查的周期(以秒为单位)(例如,每 30 秒执行一次) | |||||||||||||||||||||||||||||||||
| hcuri | 要附加到工作者 URL 以进行健康检查的额外 URI。 | ||||||||||||||||||||||||||||||||||
| hctemplate | 通过 ProxyHCTemplate 创建的模板名称,用于为该工作者设置健康检查参数 | ||||||||||||||||||||||||||||||||||
| hcexpr | 通过 ProxyHCExpr 创建的表达式名称,用于检查响应标头以确定健康状况。如果未使用,则 2xx 到 3xx 状态代码表示成功 | ||||||||||||||||||||||||||||||||||
OPTIONS11、HEAD11 和 GET11 在 2.4.55 及更高版本中可用。
以下示例展示了如何为各种后端服务器配置健康检查
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 请求并查看返回的页面是否包含字符串正在维护中来对 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 name {ap_expr expression} |
| 上下文 | 服务器配置,虚拟主机 |
| 状态 | 扩展 |
| 模块 | mod_proxy_hcheck |
ProxyHCExpr 指令允许创建命名条件表达式,该表达式检查后端服务器的响应标头以确定其健康状况。然后,可以通过 hcexpr 参数将此命名条件分配给负载均衡器成员。
ProxyHCExpr ok234 {%{REQUEST_STATUS} =~ /^[234]/}
ProxyPass "/apps" "balancer://foo"
<Proxy balancer://foo>
BalancerMember http://www2.example.com/ hcmethod=HEAD hcexpr=ok234 hcinterval=10
</Proxy>
如果使用导致响应主体(例如:GET)的健康检查方法,则可以通过 ap_expr 使用 hc() 表达式函数检查主体本身,该函数是此模块独有的。
在以下示例中,我们向后端发送 GET 请求,如果响应主体包含短语正在维护中,我们希望禁用后端。
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 name parameter=setting [...] |
| 上下文 | 服务器配置,虚拟主机 |
| 状态 | 扩展 |
| 模块 | mod_proxy_hcheck |
ProxyHCTemplate 指令允许创建一个命名健康检查参数集(模板),然后可以通过 hctemplate 参数将其分配给负载均衡器成员。
ProxyHCTemplate tcp5 hcmethod=tcp hcinterval=5 ProxyPass "/apps" "balancer://foo" <Proxy balancer://foo> BalancerMember http://www2.example.com/ hctemplate=tcp5 </Proxy>