Caddy 部署手册(小白版)


一句话目标:让服务器上的博客(或任意本机服务)通过 域名 + HTTPS 对外提供访问。

适用环境:Ubuntu / Debian 服务器(实测于 Ubuntu 26.04 阿里云 ECS)
本手册实例:博客 dblog-lite 运行在本机 8080 端口,域名 www.duobaobox.cn
更新时间:2026-10-15


📌 开始之前:流程总览(全程约 10 分钟)

① 检查准备 → ② 安装 Caddy → ③ 写配置 → ④ 收紧博客监听 → ⑤ 启动 Caddy → ⑥ 验证

本手册中的域名、端口请按你的实际情况替换:
www.duobaobox.cn → 你的域名;8080 → 你服务的端口。

另外:如果你用官方安装器全新安装 dblog 时带了 --domain www.duobaobox.cn,
下面 ②~⑤ 步会自动完成。本手册适合:① 手动部署场景;② 已装好但域名没配的"补配"场景。


一、先搞懂 3 个概念(1 分钟,看不懂也不影响操作)

名词

一句话解释

反向代理

访客访问域名(443 端口)→ Caddy 接住 → 转交给本机的博客(8080 端口)。访客只看到域名,看不到背后是谁

HTTPS 证书

让浏览器出现 🔒 小锁头的加密凭证。Caddy 会自动申请、自动续期,你完全不用管

127.0.0.1

"只允许本机访问"的地址。博客收紧到它之后,公网只能通过 Caddy 访问,更安全

需要理解的结构:

访客浏览器
   │  https://www.duobaobox.cn(443 端口)
   ▼
┌─────────┐          ┌──────────────────────────┐
│  Caddy  │ ───────▶ │ 博客 blog(127.0.0.1:8080)│
└─────────┘          └──────────────────────────┘

二、动手前的检查清单(2 分钟)

#

检查项

怎么检查

期望结果

1

你有服务器 sudo 权限

sudo -v

不报错

2

域名已解析到本服务器

dig +short www.duobaobox.cn

显示你的公网 IP

3

云安全组已放行 80、443

云控制台 → 安全组

有 80/443 放行规则

4

博客正在运行

systemctl status blog

active (running)

❌ 第 2 项不对 → 先去域名服务商把解析改到服务器 IP,等 10 分钟再继续。
❌ 第 3 项没有 → 去云控制台加规则,否则后面证书会申请失败。


三、安装 Caddy(1 分钟)

sudo apt update
sudo apt install -y caddy
caddy version

✅ 看到版本号(如 v2.6.2)即成功。

💡 如果提示 E: Unable to locate package caddy(仓库里没有这个包),先添加 Caddy 官方源再装:

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 -y caddy

四、写配置(2 分钟)

配置结构(dblog 安装器约定:"一个站点一个文件",以后加新站点互不影响):

/etc/caddy/Caddyfile            ← 总入口(只有一行 import)
/etc/caddy/dblog/blog.caddy     ← 博客站点配置(真正的规则在这里)

第 1 小步:写站点配置

直接复制粘贴下面一整段到服务器终端执行(会自动创建好文件):

sudo mkdir -p /etc/caddy/dblog
sudo tee /etc/caddy/dblog/blog.caddy > /dev/null <<'EOF'
www.duobaobox.cn {
  encode zstd gzip
  reverse_proxy 127.0.0.1:8080
}
​
duobaobox.cn {
  redir https://www.duobaobox.cn{uri} permanent
}
EOF

逐行解释:

配置行

作用

www.duobaobox.cn { ... }

为这个域名提供 HTTPS 服务

encode zstd gzip

自动压缩网页内容、省流量(不想压缩可删掉这行)

reverse_proxy 127.0.0.1:8080

把访问转交给本机 8080 端口的博客

duobaobox.cn { redir ... }

裸域名(不带 www)自动跳转到 www 版本

{uri} / permanent

保留原路径 / 永久跳转(301)

第 2 小步:写总入口 Caddyfile

sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
# Caddyfile
# 站点配置经 import 管理:/etc/caddy/dblog/*.caddy
import /etc/caddy/dblog/*.caddy
EOF

五、把博客收紧到本机(1 分钟,dblog 专属)

目的:博客不再对公网暴露 8080,只有 Caddy 能访问它。
(全新安装带 --domain 的场景,这步安装器已自动做过,直接跳过)

第 1 小步:先看当前参数长什么样:

grep ExecStart /etc/systemd/system/blog.service
  • 显示 --addr 0.0.0.0:8080(没有 --trusted-proxy)→ 执行下面的修改命令

  • 已显示 --addr 127.0.0.1:8080 --trusted-proxy 127.0.0.1 → 已经是好的,跳过

第 2 小步:修改 + 重启 + 自检:

sudo sed -i 's|--addr 0.0.0.0:8080|--addr 127.0.0.1:8080 --trusted-proxy 127.0.0.1|' /etc/systemd/system/blog.service
sudo systemctl daemon-reload
sudo systemctl restart blog
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/health

✅ 期望输出:200(博客正常运行)


六、启动 Caddy(1 分钟)

# 1) 校验配置(写错了这里会明确报错,先修好再做下一步)
sudo caddy validate --config /etc/caddy/Caddyfile

# 2) 开机自启 + 启动
sudo systemctl enable caddy
sudo systemctl restart caddy

# 3) 确认状态
systemctl is-active caddy                  # 期望:active
sudo ss -tlnp | grep -E ':(80|443) '       # 期望:caddy 正在监听 80 和 443

七、验证(1 分钟,3 个层次)

# ① 服务器上自测(绕过 DNS,直接测本机)
curl -sk --resolve www.duobaobox.cn:443:127.0.0.1 -o /dev/null -w '%{http_code}\n' https://www.duobaobox.cn/
# 期望:200(第一次可能要等十几秒,Caddy 正在申请证书;没拿到就等 10 秒重试一次)

# ② 跳转链测试
curl -sI http://duobaobox.cn/  | head -3   # 期望:308 Permanent Redirect → https://duobaobox.cn/
curl -sI https://duobaobox.cn/ | head -3   # 期望:301 → https://www.duobaobox.cn/

③ 用自己的电脑浏览器打开 https://www.duobaobox.cn/ —— 看到博客页面 + 地址栏 🔒 小锁头,就是成功了。

想看证书有效期(可选):

echo | openssl s_client -connect www.duobaobox.cn:443 -servername www.duobaobox.cn 2>/dev/null | openssl x509 -noout -subject -dates

看到 notAfter 是未来日期即可。证书会全自动续期,不需要你做任何事。


八、出问题怎么办(先记住一条万能命令)

sudo journalctl -u caddy --no-pager | tail -50    # 看 Caddy 最近日志

现象

最可能的原因

解决

浏览器打不开 / 超时

安全组没放行 80/443,或 DNS 不对

检查安全组;dig +short 你的域名 核对 IP

日志里有 acme / certificate 报错

DNS 抖动、80 端口被占、验证被拒

稍等几分钟 Caddy 会自动重试;确认 DNS 和 80 端口;实在不行 sudo systemctl restart caddy

打开是 Caddy 默认页 / 404

配置没生效(域名写错或没 reload)

sudo caddy validate --config /etc/caddy/Caddyfile 再 sudo systemctl reload caddy

502 Bad Gateway

背后博客没跑、或端口写错

systemctl status blog;ss -tlnp \| grep 8080;核对 reverse_proxy 的端口

Caddy 起不来(端口被占)

装过 nginx/apache 等

sudo ss -tlnp \| grep -E ':(80\|443)' 找到占用进程并停掉

💡 小知识:改配置改错了也不用慌——reload 失败时,Caddy 会继续用旧配置运行,服务不会断。


九、日常维护速查

改配置的标准三步(以后所有修改都走这个流程):

sudo nano /etc/caddy/dblog/blog.caddy                  # 1. 改
sudo caddy validate --config /etc/caddy/Caddyfile      # 2. 校验
sudo systemctl reload caddy                            # 3. 生效(服务不断线)

想干什么

命令

查看状态

systemctl status caddy

实时看日志

sudo journalctl -u caddy -f

完全重启

sudo systemctl restart caddy

升级 Caddy

sudo apt update && sudo apt upgrade caddy

证书存放位置

/var/lib/caddy/.local/share/caddy/certificates/

官方文档

https://caddyserver.com/docs/

卸载 Caddy(⚠️ 会同时删除所有站点配置和证书,确认不再使用再执行):

sudo systemctl disable --now caddy
sudo apt purge -y caddy
sudo rm -rf /etc/caddy /var/lib/caddy /var/log/caddy
sudo userdel caddy 2>/dev/null || true    # 可选:删掉运行账户

十、复用:换域名 / 换端口 / 加新站

需求

做法

换域名

编辑 blog.caddy,把所有出现 www.duobaobox.cn、duobaobox.cn 的地方替换成新域名,然后走"改配置三步"

换后端端口

把 reverse_proxy 127.0.0.1:8080 里的 8080 换成你的服务端口

加一个新网站

在 /etc/caddy/dblog/ 里新建一个 .caddy 文件(例如 site2.caddy),格式照抄、改域名和端口,然后走"改配置三步"——不用动其他文件


附录:关键路径速查

东西

位置

总配置入口

/etc/caddy/Caddyfile

站点配置目录

/etc/caddy/dblog/*.caddy

证书与密钥

/var/lib/caddy/.local/share/caddy/

Caddy 服务名

caddy(systemctl 管理)

博客服务名

blog(systemctl 管理)


最后记住三句话:

  1. 改配置:先 validate,再 reload;

  2. 证书:全自动,不用管;

  3. 出问题:先看 journalctl -u caddy。