适用环境:CentOS Stream 9 / Rocky Linux 9

难度:中等

一、为什么要换

Nginx + Certbot(Let’s Encrypt)是经典组合,但日常维护有两个痛点:

  • 证书每 90 天要续期,虽然 Certbot 有定时任务,但偶尔还是会因为网络、配置问题失败,需要人工处理。
  • 配置相对繁琐:server 块、ssl 证书路径、http 跳 https 的 301、gzip 等都要手写。

Caddy 的核心卖点是自动 HTTPS:

  • 首次启动访问域名时,自动向 Let’s Encrypt 申请证书,到期自动续期,无需任何定时任务。
  • 配置极简,一个 Caddyfile 就能同时搞定静态站和反向代理。
  • 默认启用 HTTP/2、gzip 压缩,零配置。

对于个人博客这类中小型站点,Caddy 能把最繁琐的证书管理彻底自动化。

二、安装 Caddy

CentOS Stream 9 通过官方 COPR 仓库安装:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装 dnf 的 copr 插件
sudo dnf install -y 'dnf-command(copr)'

# 启用 Caddy 官方仓库
sudo dnf copr enable @caddy/caddy

# 安装
sudo dnf install -y caddy

# 验证版本
caddy version

三、配置 Caddyfile

配置文件在 /etc/caddy/Caddyfile。语法核心是:域名后跟一个配置块,块内的指令按行排列。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 静态博客站点
www.wkun.top {
    root * /var/www/blog/public
    encode gzip zstd
    file_server
}

# 反向代理示例:把子域名转发到本机某个服务
# umami.wkun.top {
#     reverse_proxy 127.0.0.1:3000
# }

各指令说明:

  • root *:指定静态文件根目录,* 表示匹配所有路径。
  • encode gzip zstd:开启 gzip / zstd 压缩,减少传输体积。
  • file_server:开启静态文件服务。
  • reverse_proxy 127.0.0.1:3000:反向代理到本机 3000 端口,用于给其他服务(如自托管应用)提供域名和 HTTPS。

配置好后检查语法:

1
sudo caddy validate --config /etc/caddy/Caddyfile

四、迁移步骤(顺序很重要)

关键点:先停 Nginx,再启 Caddy。ACME 证书验证需要占用 80 端口,如果 Nginx 还占着,Caddy 的证书签发会失败。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. 停止并禁用 Nginx,释放 80/443 端口
sudo systemctl stop nginx
sudo systemctl disable nginx

# 2. 启动 Caddy 并设为开机自启
sudo systemctl enable --now caddy
sudo systemctl status caddy

# 3. 查看 Caddy 日志,确认证书自动签发成功
journalctl -u caddy -n 50 --no-pager

日志中出现类似 certificate obtained successfully 即表示证书签发成功。这一步无需任何手动干预,Caddy 会自动完成:

  • 向 Let’s Encrypt 申请证书
  • 写入证书文件
  • 配置 HTTPS 并自动续期

注意:证书验证要求 80 端口对外可达,且域名 DNS 已解析到服务器。如果之前 Certbot 签过证书,Caddy 会检测并复用,无需手动迁移。

五、验证

1
2
3
4
5
# 检查 HTTP 响应
curl -I https://www.wkun.top

# 查看证书信息(确认是有效证书)
echo | openssl s_client -connect wkun.top:443 2>/dev/null | openssl x509 -noout -subject -dates

浏览器访问站点,地址栏出现小锁图标即为成功。

六、(可选)卸载 Nginx 与 Certbot

确认迁移无误、站点稳定运行几天后,再清理旧组件:

1
sudo dnf remove -y nginx certbot python3-certbot-nginx

七、总结

迁移前后对比:

项目Nginx + CertbotCaddy
证书申请手动配置 Certbot自动
证书续期定时任务,需维护自动,无需关心
静态站配置server 块 + ssl 等 20+ 行3 行
反向代理proxy_pass + 头信息等1 行
HTTP/2、gzip需手动开启默认开启

对于"域名 + 静态站 + 少量反代"的典型个人博客场景,Caddy 用最少的配置换来了全自动的 HTTPS,省心很多。