Caddy 一行配置自动 HTTPS(含证书自动续期与多站点反代)

Caddy 把"自动签 Let's Encrypt 证书 + HTTP/2 + 自动续期"做成了默认行为。
nginx 配同样的事情至少 30 行配置 + certbot crontab,Caddy 是 1 行:

example.com {
    reverse_proxy localhost:3000
}

安装

# 官方 apt 仓库(也有 yum / 二进制下载)
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.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

最小可工作 Caddyfile

/etc/caddy/Caddyfile

example.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:3000
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options nosniff
        Referrer-Policy strict-origin-when-cross-origin
    }
}

api.example.com {
    reverse_proxy 127.0.0.1:8000
    log {
        output file /var/log/caddy/api.log
        format json
    }
}

static.example.com {
    root * /var/www/static
    file_server
    encode zstd gzip
}

encode 自动启用 Brotli / zstd / gzip 链路压缩;reverse_proxy 自动透传
X-Forwarded-*;TLS 证书 80 端口 ACME HTTP-01 自动签 + 续期。

启用

sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
journalctl -u caddy -n 50

reload 是热重载,不会断现有连接。

防火墙

sudo ufw allow 80/tcp   # ACME challenge 需要 80
sudo ufw allow 443/tcp

80 必须开 —— Let's Encrypt 通过 80 端口验证域名所有权。

进阶:通配符证书 + DNS-01

如果你想签 *.example.com,必须用 DNS-01 而不是 HTTP-01。Caddy 需要装
带 DNS 插件的版本:

sudo caddy add-package github.com/caddy-dns/cloudflare

然后:

*.example.com {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }
    reverse_proxy 127.0.0.1:3000
}

环境变量在 systemd drop-in 里设:

sudo systemctl edit caddy
# [Service]
# Environment=CF_API_TOKEN=xxxx

与 nginx 对比

维度 Caddy nginx + certbot
配置行数 1-3 行 20-30 行
自动续期 默认 crontab + reload hook
HTTP/3 默认 编译时 --with-http_v3_module
性能 略低 略高(C 写的)
配置复杂度 高,但灵活

小规模 / 个人项目用 Caddy;流量上去后或者需要复杂 rewrite 用 nginx。

踩过的坑

  • 第一次签证书会卡几十秒,是正常 ACME 流程;不要看到日志没动静就 restart,
    会把证书签到一半的 nonce 弄丢,触发 LE 频率限制。
  • LE 每周每域名最多签 50 张;测试时用 tls internal 走 Caddy 内置 CA,
    浏览器手动信任即可。
  • Caddy 默认证书 / 凭据存 /var/lib/caddy/.local/share/caddy/,备份时别漏。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。