一、速览:Caddy 解决了什么问题

入门

Caddy 是 Go 编写的多平台 Web 服务器,默认开启自动 HTTPS。你只要写一个域名,它就自动从 Let's Encrypt 或 ZeroSSL 申请证书、配置 TLS、到期续期,不需要再装 certbot 或写 cron 任务。

它同时支持 HTTP/1.1、HTTP/2 和 HTTP/3,配置语言叫 Caddyfile,语法比 Nginx 的 server 块更短。对自托管服务开发者来说,主要价值在于把反向代理和 HTTPS 绑定在一起,用几行配置就能暴露内网服务。

Caddy 的配置也可以使用 JSON 或动态 API 修改,适合自动化场景。但入门先掌握 Caddyfile 就够了。

Caddy 官方仓库的 OpenGraph 预览图

二、快速部署:Docker 与裸机

入门

用 Docker 启动最省事。Caddy 官方镜像默认从 /etc/caddy/Caddyfile 读取配置,因此你需要先把配置文件挂载进容器。下面是一个 docker run 命令:

docker run -d \
  --name caddy \
  -p 80:80 \
  -p 443:443 \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -v caddy_data:/data \
  -v caddy_config:/config \
  caddy:latest

注意:80 和 443 端口必须同时映射,缺少任何一个,自动 HTTPS 的 HTTP-01 挑战就无法完成。

caddy_data 卷保存证书和私钥,caddy_config 卷保存配置状态,两个卷都要持久化。80 和 443 端口是 ACME 挑战和 TLS 终止的入口。

如果你不想维护 Caddyfile,也可以直接挂载一个静态目录让 Caddy 作为文件服务器,但推荐把 Caddyfile 写成文件管理,修改起来更直观。

裸机安装时,可以从 GitHub Releases 下载对应平台的二进制文件,解压后放到 /usr/local/bin。以 Linux amd64 为例:

curl -OL https://github.com/caddyserver/caddy/releases/latest/download/caddy_linux_amd64.tar.gz
tar xzf caddy_linux_amd64.tar.gz
sudo mv caddy /usr/local/bin/

然后编写 Caddyfile 并用 caddy run 启动。二进制方式更新更直接,包管理器安装也可以,但版本可能滞后。

三、配置详解:Caddyfile、数据卷与端口

进阶 · 推荐细读

Caddyfile 的基本单位是站点块。一个最简单的反向代理配置如下:

example.com {
    reverse_proxy localhost:8080
}

example.com 是你的域名,必须解析到服务器 IP。Caddy 会为该域名自动申请证书,并把所有流量转发到 localhost:8080

Caddyfile 中的指令可以带匹配器。例如 file_server 指令用于静态文件,root 指定根目录:

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

* 是全局匹配器,表示所有请求。你可以在 Caddyfile 中使用环境变量,例如 {$BACKEND_HOST},这样同一个 Caddyfile 可以用不同环境变量复用。Docker 启动时用 `-e

项目信息

项目
仓库 caddyserver/caddy
语言 Go
Star 74,942
Fork 4,889
主页 https://caddyserver.com

参考链接