caddy反向代理配置实例
它是什么Caddy 是用 Go 编写的多平台 Web 服务器与反向代理服务器,通过 Caddyfile 一行级配置即可把请求转发到上游,并自动从 Let's Encrypt 获取与续期证书,省去 Certbot 与 ACME 的额外维护,适合中小型生产部署
Caddy 是用 Go 编写的多平台 Web 服务器与反向代理服务器,通过 Caddyfile 一行级配置即可把请求转发到上游,并自动从 Let's Encrypt 获取与续期证书,省去 Certbot 与 ACME 的额外维护,适合中小型生产部署。
详细介绍
简介
Caddy 是用 Go 编写的快速、可扩展的多平台 Web 服务器,既是 HTTP 静态文件服务器,也是反向代理服务器。它要解决的问题很直接:把对外暴露的域名请求转发到本机或内网的上游服务,同时自动完成 HTTPS 证书的获取与续期。对于要把 Go 语言 API、php-fpm、容器内应用或自建服务暴露到公网的开发者与运维人员,Caddy 的 Caddyfile 语法与默认自动 HTTPS 能省掉 Certbot 与 ACME 的一层维护负担,对中小型部署是更实际的选择。
核心功能
- 反向代理:使用 reverse_proxy 指令把网络请求转发到上游,官方说明该指令标准即附带多个动态上游模块。
- 自动 HTTPS:把域名指向服务器并写入 Caddyfile 后,Caddy 会从 Let's Encrypt 获取证书并自动续期,不需要 resolver 配置,也不需要 ACME 设置。
- 三档配置方式:Caddyfile 负责易用配置,原生 JSON 配置负责复杂场景,JSON API 支持动态配置,另有配置适配器可供转换。
- 多协议支持:覆盖 HTTP/1.1、HTTP/2、HTTP/3,可直接对外提供现代协议服务。
- 跨平台:Go 编写,涵盖 Linux、Windows、macOS 等多个平台,属于多平台 Web 服务器。
- 可扩展插件:社区有 caddy-grpc 这类项目为 Caddy 添加反向代理插件,也可自行编译加入所需模块。
- 静态文件与反向代理一体:同一进程既能托管静态文件,也能把请求转发给 php-fpm 等后端。
使用场景
- 把 Go 语言编写的 API 通过反向代理方式暴露给调用者,请求经 Caddy 转发到上游服务。
- 用 Caddy 代替 Nginx 代理 php-fpm,一行配置即可完成转发,省去繁杂的转发规则。
- 容器化部署:在 Azure 拷斗容器中创建 Caddyfile,配置指向 5000/TCP 上监听的应用程序容器,并启用自动 HTTPS。
- 自建服务对外暴露:如 GoToSocial,把 bind-address 设为 localhost,让后端只接受回环地址访问。
- 反向代理维基百科中文站点,满足无代理环境下的访问需求,也方便把站点分享给他人。
- 替代 Nginx 承担 443 端口监听、按主机名分发请求的职责,把流量转发到 VPS 上正确的服务。
安装与获取步骤
- 确认具备基本的终端/命令行技能,并确认 PATH 变量支持 caddy,可在终端中直接调用该命令。
- 准备一个正在运行的后端服务,记下它监听的地址与端口,例如容器内应用监听的 5000/TCP。
- 创建名为 Caddyfile 的文件,写入要对外提供的域名,并用 reverse_proxy 指令指向后端地址;代理 php-fpm 时按一行配置的写法填写。
- 把域名解析指向运行 Caddy 的服务器。配置引用的是域名而不是 IP,域名是自动 HTTPS 的前提。
- 启动 Caddy,它会自动向 Let's Encrypt 申请证书并负责后续续期,无需额外的 ACME 配置。
- 需要源码或插件时,从 github.com/caddyserver/caddy 获取项目;需要反向代理插件可参考 github.com/yhyddr/caddy-grpc,或使用插件作者提供的 Docker Image。
与同类方案的区别
- Nginx、Caddy 与 Traefik 做的是同一件事:监听 443 端口,读取每个请求中的主机名,把请求转发到 VPS 上正确的服务,三者都能完成自动 HTTPS。
- Caddy 除域名外基本不需要配置:写好 Caddyfile 即可签发与续期证书,不需要 resolver 配置,也不需要 ACME 设置;Nginx 强大但设定繁琐,Certbot 是额外一层维护负担。
- Caddy 的文档以例子为主,即使是有经验的使用者也常靠示例对照写法;Nginx 与 Traefik 的资料积累更久,迁移时可对照既有规则逐条改写。
- Caddy 目前最大的短板是没有内置的反向代理缓存,需要自行添加第三方插件并编译,或直接使用插件作者提供的 Docker Image。
- 社区也在讨论新进入者,例如 Ferron 被介绍为 Nginx/Caddy 的替代品,但读者关心的基准对比数据在素材中没有给出,以官方页面为准。
注意事项
- 反向代理配置中应引用域名而不是地址;引用域名才能配合自动 HTTPS 完成证书签发,容器场景下同样指向后端的 5000/TCP 端口。
- 使用动态上游模块会对负载均衡和健康检查产生影响,选型前需要评估后端拓扑是否匹配。
- 若反向代理与后端运行在同一台机器,建议把 bind-address 设为 localhost,使后端只通过回环地址被访问,避免有人直接连接后端绕过代理。
- 没有内置的反向代理缓存,需要缓存能力时必须引入第三方插件自行编译,或改用插件作者提供的 Docker Image。
- 插件需要在构建阶段加入,自行编译会带来额外的构建与升级成本;具体模块清单与参数以官方页面为准。
- 素材中未给出版本号、文件大小与哈希等信息,涉及具体版本与参数时请以 github.com/caddyserver/caddy 官方页面为准。
更新记录
最近更新:2026-10-04
软件参数速览
下载
常见问题
Caddy 反向代理的最小配置要写哪些内容?
创建名为 Caddyfile 的文件,写入对外提供的域名,再用 reverse_proxy 指令指向正在运行的后端地址;把域名解析到服务器后启动 Caddy 即可,具体写法以官方 reverse_proxy 指令文档为准。
后端是 php-fpm 时该怎么配?
可以用一行配置让 Caddy 充当 php-fpm 的反向代理,思路是让 reverse_proxy 指向 php-fpm 监听的地址,实践记录见 ttys3.dev 的相关文章。
为什么配置里要写域名而不是 IP?
容器场景的官方示例提示配置引用的是域名,引用域名才能配合自动 HTTPS 完成证书签发,同时把请求转发到 5000/TCP 上监听的应用容器。
使用动态上游模块会带来什么影响?
官方文档说明 reverse_proxy 标准附带若干动态上游模块,而使用动态上游会对负载均衡和健康检查产生影响,做容量规划时需要一并考虑。
代理和后端在同一台机器上要注意什么?
GoToSocial 文档建议把 bind-address 设为 localhost,让后端只通过回环地址被访问,否则可能有人直接连接后端,绕过反向代理的访问控制。
Caddy 和 Nginx、Traefik 该怎么选?
三者都监听 443 并按主机名转发请求;Caddy 除域名外不需要 resolver 或 ACME 配置即可自动处理 HTTPS,Nginx 通常还要额外维护 Certbot 这一层。
Caddy 能做反向代理缓存吗?
目前 Caddy 最大的缺点是没有内置的反向代理缓存,需要自己加第三方插件编译,或者直接使用插件作者提供的 Docker Image。
需要 gRPC 反向代理插件怎么办?
社区有 caddy-grpc 这类项目为 Caddy 添加反向代理插件,项目地址为 github.com/yhyddr/caddy-grpc,可按其说明扩展自己的 Caddy 构建。