本文档介绍了 Caddy 的反向代理处理程序,它将传入的 HTTP 请求转发到上游后端服务器,并将它们的响应返回给客户端。反向代理提供了全面的功能,包括负载均衡、健康检查、传输配置和响应操作。
有关上游 TLS 配置的信息,请参阅4.3。有关通用的 HTTP 请求路由概念,请参阅3.2。
反向代理作为 HTTP 处理程序实现,与 Caddy 的模块系统集成。核心的Handler结构体协调请求转发、负载均衡、健康监控和响应处理。
来源:modules/caddyhttp/reverseproxy/reverseproxy.go74-212 modules/caddyhttp/reverseproxy/hosts.go28-69
Handler结构体作为中央协调器,包含传输、负载均衡策略、健康检查和上游定义的配置。每个Upstream代表一个后端服务器,并与一个跟踪连接状态和健康指标的Host关联。
来源:modules/caddyhttp/reverseproxy/reverseproxy.go403-485 modules/caddyhttp/reverseproxy/reverseproxy.go491-597
请求处理遵循重试循环模式,失败的请求可以根据负载均衡配置与不同的上游进行重试。proxyLoopIteration方法处理单个重试尝试,而ServeHTTP管理整个请求生命周期。
HTTPTransport结构体提供了将请求发送到后端服务器的广泛配置
| 配置 | 目的 | 默认 |
|---|---|---|
DialTimeout | 连接建立超时 | 3秒 |
KeepAlive | HTTP 连接复用设置 | 已启用 |
TLS | HTTPS 后端的 TLS 配置 | None |
压缩 | 启用/禁用压缩 | true |
版本 | 支持的 HTTP 版本 | ["1.1", "2"] |
来源:modules/caddyhttp/reverseproxy/httptransport.go53-164 modules/caddyhttp/reverseproxy/httptransport.go486-505
传输层根据配置自动选择合适的协议。HTTP/3 需要独占配置,而 H2C (HTTP/2 over cleartext) 用于明文 HTTP/2 连接。
来源:modules/caddyhttp/reverseproxy/httptransport.go554-615 modules/caddyhttp/reverseproxy/httptransport.go617-733
负载均衡通过Selector接口实现,允许可插拔的选择策略
来源:modules/caddyhttp/reverseproxy/reverseproxy.go85-86 modules/caddyhttp/reverseproxy/loadbalancing.go
默认选择策略是RandomSelection。tryAgain()中的重试逻辑根据时间限制、尝试次数和请求匹配器标准来决定是否尝试另一个上游。
健康检查系统提供主动和被动监控上游可用性
来源:modules/caddyhttp/reverseproxy/healthchecks.go74-135 modules/caddyhttp/reverseproxy/healthchecks.go272-294
主动健康检查在后台协程中运行,定期向配置的健康检查端点发送 HTTP 请求。上游根据连续通过/失败的阈值被标记为健康/不健康。
来源:modules/caddyhttp/reverseproxy/healthchecks.go234-258 modules/caddyhttp/reverseproxy/healthchecks.go583-640
被动健康检查监控常规请求流量,根据响应代码、延迟和并发请求限制跟踪故障。失败的请求在配置的持续时间内被记住,并自动过期。
来源:modules/caddyhttp/reverseproxy/hosts.go137-142 modules/caddyhttp/reverseproxy/hosts.go76-98
Host结构体维护用于请求跟踪和健康状态的原子计数器。全局hosts使用池在配置重新加载时保留状态。上游可用性由健康状态和请求容量共同决定。
熔断器为防止后端过载提供了额外的保护层
来源:modules/caddyhttp/reverseproxy/healthchecks.go264-267 modules/caddyhttp/reverseproxy/reverseproxy.go910-913
反向代理通过UnmarshalCaddyfile方法支持广泛的 Caddyfile 配置
| 指令 | 目的 | 示例 |
|---|---|---|
to | 定义上游地址 | to localhost:8080 localhost:8081 |
lb_policy | 负载均衡算法 | lb_policy round_robin |
health_uri | 主动健康检查端点 | health_uri /health |
transport | 配置传输层 | transport http { tls } |
header_up | 修改请求头 | header_up Host example.com |
trusted_proxies | 定义受信任的代理范围 | trusted_proxies private_ranges |
来源:modules/caddyhttp/reverseproxy/caddyfile.go58-133 modules/caddyhttp/reverseproxy/caddyfile.go142-905
反向代理可以拦截和修改来自后端的响应
来源:modules/caddyhttp/reverseproxy/reverseproxy.go169-182 modules/caddyhttp/reverseproxy/reverseproxy.go936-981
响应处理程序允许根据状态码、HTTP 头或自定义标准修改后端响应。这使得错误页面定制、响应转换和条件处理成为可能。
反向代理设置了许多占位符,可用于配置和日志记录
| 占位符 | 描述 |
|---|---|
{http.reverse_proxy.upstream.address} | 完整的上游地址 |
{http.reverse_proxy.upstream.host} | 上游主机名 |
{http.reverse_proxy.upstream.port} | 上游端口 |
{http.reverse_proxy.upstream.requests} | 当前请求计数 |
{http.reverse_proxy.upstream.latency} | 响应延迟 |
{http.reverse_proxy.duration} | 总代理持续时间 |
{http.reverse_proxy.retries} | 执行的重试次数 |
来源:modules/caddyhttp/reverseproxy/reverseproxy.go55-73 modules/caddyhttp/reverseproxy/reverseproxy.go553-559
这些占位符提供了对代理行为的可见性,可用于 HTTP 头、日志记录和响应处理配置。