伟然 的个人博客

在如今的 Web 开发中,Nginx 凭借其强大的生态统治了很久。但如果你厌倦了繁琐的 SSL 证书配置和臃肿的配置文件,那么 Caddy 绝对会让你眼前一亮。它最杀手级的特性就是原生自带免费的自动 SSL 证书申请与续签(Let's Encrypt / ZeroSSL),可以说是真正做到了“开箱即用”。
本文将带你通过两种最主流的方式来部署 Caddy 2:Docker Compose 部署(适合容器化管理)和系统原生部署(适合追求极致性能的物理机或 VPS)。
如果你之前用过 Nginx,你一定经历过以下几件“痛苦面具”的事:
Certbot,写定时任务(Cron)去续签,偶尔还会因为证书过期导致网站“报红”。nginx.conf 里塞满各种 proxy_set_header、SSL 路径和密文套件配置,少个分号(;)系统就起不来。而作为后起之秀、用 Go 语言编写的 Caddy 2,就是为了彻底解决这些痛点而生的。我们来看看它们直观的差异:
| 特性 / 维度 | Nginx (传统老牌) | Caddy 2 (现代新星) |
|---|---|---|
| HTTPS 证书 | 需要手动配置、依赖 Certbot 等外部工具续签 | 全自动!内置申请、配置、续签(开箱即用) |
| HTTP/3 (QUIC) | 需高版本支持,生产环境配置复杂或需自行编译 | 原生内置,默认开启 |
| 配置复杂度 | 语法繁琐,动辄几十行,容易漏写配置 | 极其精简,几行Caddyfile搞定一切 |
| 平滑热重载 | nginx -s reload(通过重新派生 worker 进程) | caddy reload(原生动态 API 零停机热重载) |
| 资源占用 | 极低(C 语言编写,内存控制一绝) | 略高(Go 语言 runtime 损耗,但对现代 VPS 影响微乎其微) |
无论使用哪种部署方式,Caddy 的核心都在于 Caddyfile。它比 Nginx 的语法简单数倍。在开始部署前,我们可以先准备好一个通用的基础配置。
新建一个文件,命名为 Caddyfile:
代码段
# 1. 静态网站托管与反向代理示例
example.com {
# 自动开启 HTTPS,自动申请证书
encode gzip zstd # 开启压缩
# 静态文件服务
root * /var/www/html
file_server
# 反向代理(比如代理后台服务)
handle /api/* {
reverse_proxy localhost:8080
}
}
# 2. 多域名与反向代理(如:博客或私有服务)
blog.example.com {
reverse_proxy 127.0.0.1:3000
}
Docker 部署的优势在于隔离性强、迁移方便,非常适合微服务架构或在一台服务器上跑多个独立容器的场景。
我的博客和其余网站就是使用caddy部署的。
仅需三行代码,即可配置好证书+反向代理。
在服务器上创建项目目录:
Bash
mkdir -p /opt/caddy && cd /opt/caddy
mkdir data config html
data:用于持久化存储 Caddy 申请到的 SSL 证书,千万不能丢失。config:用于存储 Caddy 的运行状态配置。html:存放你的静态网站源码。docker-compose.yml在 /opt/caddy 目录下创建 docker-compose.yml:
YAML
version: '3.8'
services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # 启用 HTTP/3 支持
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./html:/var/www/html
- ./data:/data
- ./config:/config
environment:
- TZ=Asia/Shanghai
将上面写好的 Caddyfile 放到 /opt/caddy 目录下,然后执行:
Bash
# 后台启动
docker compose up -d
# 查看日志(排查证书申请状态)
docker compose logs -f
# 修改 Caddyfile 后,无需重启容器,热重载配置:
docker compose exec -w /etc/caddy caddy caddy reload
如果你想让 Caddy 直接跑在系统上,减少 Docker 带来的网络损耗,或者配合系统原生的 Systemd 进行管理,可以选择这种方式。本节以 Ubuntu/Debian 系统为例。
通过官方专属源进行安装,确保后续可以通过 apt upgrade 自动更新。
Bash
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
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.p/caddy-stable.list
sudo apt update
sudo apt install caddy
在系统级安装中,Caddy 会默认创建 caddy 用户组,并生成以下默认路径:
/etc/caddy/Caddyfilecaddy.service你可以直接编辑默认配置文件:
Bash
sudo nano /etc/caddy/Caddyfile
(注意:如果你的 Caddyfile 引用了本地的网站静态目录,请确保 caddy 用户对该目录有读取权限)
Caddy 安装后会自动注册为系统服务,你可以直接使用 systemctl 进行控制:
Bash
# 启动 Caddy 并设置开机自启
sudo systemctl enable --now caddy
# 检查运行状态
sudo systemctl status caddy
# 修改 Caddyfile 后,进行平滑热重载(推荐,无停机时间)
sudo systemctl reload caddy
# 查看系统日志
sudo journalctl -u caddy --no-pager | tail -n 50
80 和 443 端口。请确保服务器安全组或 UFW 防火墙已经放行了这两个端口。另外,Caddy 原生支持 HTTP/3,建议同时放行 443/UDP 端口以获得更快的访问体验。restart。使用 caddy reload 或 systemctl reload 可以在不中断现有连接的情况下秒级应用新配置。