菜单

反向代理

相关源文件

本文档介绍了 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管理整个请求生命周期。

传输配置

HTTP 传输

HTTPTransport结构体提供了将请求发送到后端服务器的广泛配置

配置目的默认
DialTimeout连接建立超时3秒
KeepAliveHTTP 连接复用设置已启用
TLSHTTPS 后端的 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 连接。

TLS 配置

来源:modules/caddyhttp/reverseproxy/httptransport.go554-615 modules/caddyhttp/reverseproxy/httptransport.go617-733

负载均衡

负载均衡通过Selector接口实现,允许可插拔的选择策略

来源:modules/caddyhttp/reverseproxy/reverseproxy.go85-86 modules/caddyhttp/reverseproxy/loadbalancing.go

默认选择策略是RandomSelectiontryAgain()中的重试逻辑根据时间限制、尝试次数和请求匹配器标准来决定是否尝试另一个上游。

健康检查

健康检查系统提供主动和被动监控上游可用性

主动健康检查

来源: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

配置

Caddyfile 语法

反向代理通过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 头、日志记录和响应处理配置。