此页面详细介绍了 Caddy 反向代理处理程序的健康检查功能。健康检查监控上游后端服务器,以确定它们是否可用并正常工作。Caddy 支持主动健康检查(主动探测后端)和被动健康检查(监控实际请求流量)。有关上游之间负载平衡的信息,请参阅 负载平衡。
Caddy 的反向代理健康检查机制允许您自动检测并避开故障或过载的上游服务器。健康检查与负载平衡系统交互,以确保请求仅发送到可用的后端。
来源: modules/caddyhttp/reverseproxy/reverseproxy.go85-91 modules/caddyhttp/reverseproxy/reverseproxy.go192-194 modules/caddyhttp/reverseproxy/reverseproxy.go356-374
主动健康检查在后台定时运行,并主动向上游服务器发送 HTTP 请求以验证其状态。它们是按代理处理程序配置的,因此不同的处理程序可以对“健康后端”有不同的标准。
来源: modules/caddyhttp/reverseproxy/healthchecks.go272-294 modules/caddyhttp/reverseproxy/healthchecks.go386-581
主动健康检查遵循以下原则
主动健康检查的关键配置参数
| 参数 | 描述 | 默认 |
|---|---|---|
uri | 健康检查请求的 URI 路径(和查询) | 无(必需) |
port | 健康检查的备用端口(如果与上游端口不同) | 与上游相同 |
interval | 执行检查的频率 | 30秒 |
timeout | 等待响应的最长时间 | 5秒 |
headers | 健康检查请求的自定义 HTTP 请求头 | 无 |
method | 要使用的 HTTP 方法 | GET |
body | 要发送的请求体 | 无 |
passes | 标记为健康所需的连续通过次数 | 1 |
fails | 标记为不健康所需的连续失败次数 | 1 |
expect_status | 预期的 HTTP 状态码 | 任意 2xx 状态码 |
expect_body | 用于匹配响应体的正则表达式 | 无 |
follow_redirects | 健康检查中是否跟踪重定向 | 否 |
来源: modules/caddyhttp/reverseproxy/healthchecks.go74-135 modules/caddyhttp/reverseproxy/caddyfile.go335-547
被动健康检查监控向上游服务器发送的实际请求流量并检测故障。与主动检查不同,被动健康检查是全局跟踪的,并在所有代理处理程序之间共享。
来源: modules/caddyhttp/reverseproxy/reverseproxy.go583-640 modules/caddyhttp/reverseproxy/reverseproxy.go916-928
被动健康检查遵循以下原则
被动健康检查的关键配置参数
| 参数 | 描述 | 默认 |
|---|---|---|
fail_duration | 记住失败请求的时长 | 0 (禁用) |
max_fails | 将后端视为宕机的失败次数 | 1 |
unhealthy_request_count | 标记为宕机前的最大并发请求数 | 0 (无限制) |
unhealthy_status | 计为失败的 HTTP 状态码 | 无 |
unhealthy_latency | 计为失败的响应时间阈值 | 0 (禁用) |
来源: modules/caddyhttp/reverseproxy/healthchecks.go234-257 modules/caddyhttp/reverseproxy/caddyfile.go549-633
健康检查系统与反向代理的其他组件集成如下
来源: modules/caddyhttp/reverseproxy/reverseproxy.go73-212 modules/caddyhttp/reverseproxy/reverseproxy.go450-486 modules/caddyhttp/reverseproxy/hosts.go69-225
关键集成点
上游可用性:在上游被选中之前,会调用其 Available() 方法,该方法会检查
max_requests)故障计数:
fail_duration 后被遗忘健康状态存储:
来源: modules/caddyhttp/reverseproxy/hosts.go269-270 modules/caddyhttp/reverseproxy/reverseproxy.go583-640
主机的健康状态通过原子操作进行管理,以确保线程安全
来源: modules/caddyhttp/reverseproxy/hosts.go34-225
每个 Upstream 引用一个 Host 对象,该对象跟踪
状态通过原子操作更新,以确保在并发环境中的线程安全。
以下是包含主动和被动健康检查的 Caddyfile 配置示例
example.com {
reverse_proxy {
to backend1.example.com:8080 backend2.example.com:8080
# Active health checks
health_uri /health
health_interval 10s
health_timeout 5s
health_status 200
health_body My\\sService\\sIs\\sHealthy
health_passes 2
health_fails 3
# Passive health checks
fail_duration 30s
max_fails 5
unhealthy_status 500 502 503 504
unhealthy_latency 1s
}
}
配置适当的超时:
health_timeout 设置为低于 health_interval 以避免检查重叠fail_duration使用适当的健康检查端点:
/health 或 /status 端点设置有意义的阈值:
fails > 1)passes > 1)max_fails平衡灵敏度和稳定性:
考虑使用断路器进行高级保护:
来源: modules/caddyhttp/reverseproxy/caddyfile.go335-633 modules/caddyhttp/reverseproxy/healthchecks.go38-69
主动健康检查器在后台 goroutine 中运行,并执行以下操作
当后端被发现不健康时,会通过 Caddy 的事件系统发出一个可被监控的事件。
来源: modules/caddyhttp/reverseproxy/healthchecks.go272-294 modules/caddyhttp/reverseproxy/healthchecks.go298-375
被动健康检查器集成到反向代理请求流程中
fail_duration 后递减失败计数max_fails来源: modules/caddyhttp/reverseproxy/reverseproxy.go583-640 modules/caddyhttp/reverseproxy/reverseproxy.go916-928
动态上游:主动健康检查不适用于动态上游,因为这些上游是为每个请求创建的。出于类似原因,被动健康检查对动态上游的有效性有限。
健康检查共享:主动健康检查状态是按处理程序划分的,而被动健康检查状态是全局的。这意味着在使用主动健康检查时,不同的处理程序可能对上游的健康状态有不同的看法。
Unix 套接字后端:当使用 Unix 套接字上游时,健康检查会使用特殊处理来支持正确的健康检查。
来源: modules/caddyhttp/reverseproxy/healthchecks.go38-69 modules/caddyhttp/reverseproxy/healthchecks.go353-355
Caddy 的健康检查系统提供了强大的机制来检测并避开不健康的后端。通过结合主动和被动健康检查,您可以创建一个可靠的反向代理设置,该设置可自动适应不断变化的后端条件。