mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1943 字
5 分钟
Caddy 单域名多服务部署教程:反向代理、自动 HTTPS 与 Caddyfile 配置

适用场景#

本文适用于以下部署环境:

  • Linux 云服务器;
  • Docker 部署环境;
  • FastAPI 后端服务;
  • React / Vue / Astro 前端项目;
  • 个人博客和中小型 Web 应用。

Caddy 是什么?#

Caddy 是一个基于 Go 语言开发的现代 Web 服务器。

它集成了:

  • Web Server(静态文件服务器)
  • Reverse Proxy(反向代理)
  • Automatic HTTPS(自动 HTTPS)
  • HTTP/2
  • HTTP/3

等功能。

简单理解:

Caddy 类似于 Nginx,但它通过更简单的配置文件和自动 HTTPS 机制,降低了网站部署和维护成本。

Caddy 可以做什么?#

Caddy 常用于以下场景:

1. 静态网站托管#

例如:

  • Vue / React 构建后的前端项目;
  • Astro、Hugo 等静态博客;
  • HTML、CSS、JavaScript 文件。

2. 反向代理后端服务#

Caddy 可以将公网请求转发到本地应用。

3. 自动 HTTPS#

Caddy 默认支持 Let’s Encrypt。

无需手动:

  • 申请证书;
  • 配置证书路径;
  • 设置自动续期;
  • 定期 reload 服务。

只需要:

example.com {
reverse_proxy localhost:8000
}

Caddy 会自动完成 HTTPS 配置。

Caddy 和 Nginx 如何选择?#

对比CaddyNginx
配置难度⭐⭐⭐⭐⭐ 简单,配置文件简洁易读⭐⭐⭐ 较复杂,需要理解更多指令和模块
HTTPS自动申请、配置和续签 TLS 证书通常需要手动申请、配置和续签证书
性能很高,满足绝大多数中小型应用需求极高,针对高并发场景深度优化
静态资源支持,性能优秀支持,性能非常优秀
反向代理支持,配置简单支持,非常成熟稳定
HTTP/3原生支持,默认集成 QUIC支持,但通常需要额外配置和版本支持
企业生态快速增长,现代化部署场景应用增多非常成熟,拥有大量企业级实践
学习成本较低,适合快速部署较高,需要掌握更多配置和优化技巧
配置可读性Caddyfile 简洁直观,接近自然语言配置体系复杂,学习曲线较高
模块生态较少,但官方功能覆盖常见需求生态丰富,拥有大量第三方模块
资源占用Go Runtime 会带来一定额外开销,但现代服务器环境通常影响有限资源控制能力强,长期优化成熟
高并发能力性能优秀,可以满足大多数中小型及部分大型应用场景长期经过大规模生产环境验证,适合复杂高并发场景
部署体验非常优秀,适合 Docker、个人服务器和快速部署成熟稳定,更适合长期运维和企业环境

如果目标是:

  • 个人网站;
  • 小型项目;
  • Docker 部署;
  • 快速上线 HTTPS 服务;

Caddy 通常是更简单的选择。

如果目标是:

  • 大规模企业架构;
  • 复杂负载均衡;
  • 深度定制网络策略;

Nginx 生态更加成熟。

Caddy 安装#

Debian / Ubuntu 安装#

推荐使用官方软件源:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor \
-o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

查看版本:

caddy version

Docker 安装#

拉取官方镜像:

docker pull caddy

简单运行:

mkdir -p data config
docker run -d \
--name caddy \
--restart unless-stopped \
-p 80:80 \
-p 443:443 \
-v $(pwd)/Caddyfile:/etc/caddy/Caddyfile:ro \
-v $(pwd)/data:/data \
-v $(pwd)/config:/config \
caddy

其他系统安装#

其他系统安装方式:

参考 Caddy 官方中文文档

使用 Caddy 先决条件#

Caddy 自动申请 HTTPS 证书需要满足:

  1. 域名已经解析到服务器公网IP;
  2. 服务器安全组已开放80和443端口;
  3. 80/443端口没有被其他服务使用/占用;
  4. CA 可以访问服务器。

例如:

DNS:
example.com
A记录:
example.com -> 服务器公网 IP

Caddy 单域名多服务配置#

创建 Caddyfile#

Caddy 使用名为:Caddyfile的配置文件。

注意:

  • 文件没有扩展名
  • 默认位置通常为 /etc/caddy/Caddyfile

例如:

touch Caddyfile

单服务反向代理示例#

假设:

后端应用:

127.0.0.1:8000

例如:

FastAPI:

uvicorn main:app --host 127.0.0.1 --port 8000

Caddyfile:

example.com {
reverse_proxy 127.0.0.1:8000
}

访问:

https://example.com

单应用静态文件服务示例#

example.com {
root * /var/www/html
file_server
}

单域名静态文件 + 反向代理配置方式#

example.com {
reverse_proxy 127.0.0.1:8000
root * /var/www/html
file_server
}

这种配置虽然可以运行,但是由于反向代理和静态文件服务处于同一个请求处理链中,随着项目增加路由规则,容易产生请求匹配问题。

推荐使用handle明确划分不同请求

example.com {
handle /api/* {
reverse_proxy 127.0.0.1:8000
}
handle {
root * /var/www/html
file_server
}
}

如果后端接口统一增加/api前缀,例如/api/user, 那么前端请求地址也需要同步调整为https://example.com/api/user

此时,访问:

https://example.com/api/

将代理到后端接口。

而访问:

https://example.com

则是静态资源页面。

这种方式可以使用,但随着项目复杂度增加,路由规则会逐渐变复杂。

单域名部署前后端分离项目推荐方案#

example.com {
root * /var/www/html
file_server
}
api.example.com {
reverse_proxy 127.0.0.1:8000
}

此时,访问:

https://api.example.com

将代理到后端接口。

而访问:

https://example.com

则是静态资源页面。

同样,前端项目中的API请求地址需要配置为https://api.example.com

Caddy 服务管理#

检查配置#

修改Caddyfile后,建议先验证配置:

caddy validate --config /etc/caddy/Caddyfile

可以选择格式化配置文件(非必要):

caddy fmt --overwrite /etc/caddy/Caddyfile

确认无误后重新加载:

caddy reload --config /etc/caddy/Caddyfile

Linux systemd#

启动:

systemctl start caddy

查看状态:

systemctl status caddy

开机启动:

systemctl enable caddy

重新加载配置:

systemctl reload caddy

Docker Compose 部署 Caddy#

示例:

services:
caddy:
image: caddy:latest
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./data:/data
- ./config:/config

/data目录用于保存 Caddy 自动申请的证书和状态信息,生产环境不要删除,否则可能触发重新申请证书。

启动:

docker compose up -d

常见问题#

Caddy 为什么不用手动配置 SSL?#

因为 Caddy 内置 ACME 协议支持,可以自动完成证书申请和续签。

Caddy 可以代理 Docker 容器吗?#

可以。

例如:

example.com {
reverse_proxy app:8000
}

其中app是 Docker Compose 服务名。Caddy 需要与后端服务同属一个网络组内。

Caddy 和 Nginx 可以一起使用吗?#

可以。 不过大多数个人项目没有必要。

Caddy 支持泛域名证书吗?#

支持。

例如:

*.example.com

但是泛域名证书需要 DNS Challenge。

Caddy 权限错误怎么办?#

如果执行 Caddy 命令出现:

permission denied

通常是权限不足导致的。

  1. 检查当前用户是不是root
whoami

如果不是root,可以使用:

sudo <command>

例如:

sudo systemctl restart caddy
  1. 确保当前用户拥有读取权限
ls -l Caddyfile
# 如果当前用户没有权限,修改所有者
chown $USER:$USER Caddyfile
# 设置权限
chmod 644 Caddyfile

总结#

Caddy 是一个简单、高效、现代化的 Web 服务器。

相比传统 Nginx,Caddy 最大优势是:

  • 配置简单;
  • 自动 HTTPS;
  • 自动证书续签;
  • 原生支持 HTTP/3;
  • 非常适合个人项目和中小型服务部署。

对于 FastAPI、React、Astro、Docker 等现代技术栈,使用 Caddy 可以减少服务器运维成本,让开发者更加关注业务代码。

参考资料#

本文内容参考以下官方文档和标准资料:

  1. Caddy 官方文档:Caddy 官方文档详细介绍了 Caddy 的安装、配置、反向代理、自动 HTTPS 等功能。
  2. Caddy 官方中文文档:提供 Caddy 官方文档的中文翻译站点,提供中文化阅读体验。
  3. Caddy 官方 GitHub 仓库:Caddy 是一个基于 Go 语言开发的开源 Web 服务器,其源码托管于 GitHub。
  4. Let’s Encrypt 官方文档:Let’s Encrypt 是目前广泛使用的免费 TLS 证书颁发机构(CA)。
  5. ACME 协议标准(RFC 8555):ACME(Automatic Certificate Management Environment)定义了自动化申请和管理 TLS 证书的标准流程。
  6. HTTP/3 标准(RFC 9114):HTTP/3 基于 QUIC 协议,是现代 Web 网络协议的重要发展方向。
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Caddy 单域名多服务部署教程:反向代理、自动 HTTPS 与 Caddyfile 配置
https://www.pyart.cn/posts/caddy-https-configuration/
作者
kang
发布于
2026-07-17
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录