部署前把四个前提重新确认一遍
复制文件前确认:网页在本地能正常打开;域名 A 记录返回真实服务器 IP;deploy 用户可以 sudo;UFW 和云安全组都放行了 SSH、80/TCP、443/TCP。下面的 example.com 和 203.0.113.10 必须全部替换,服务商网页控制台继续保留。
Caddy 官方安装页 是当前软件源命令的准确信息来源。Debian 或 Ubuntu 要先按官方文档配置 stable 软件源,再安装软件包:
sudo apt update
sudo apt install caddy
caddy version
systemctl status caddy --no-pager
官方软件包通常会同时安装 systemd 服务。正式环境用这个服务管理,不要靠 SSH 窗口里一直挂着 caddy run;窗口断开后,前台进程也可能结束。
建立清楚且可读取的网站目录
网站文件不要长期塞在某个用户的 home 目录。创建固定路径,让 deploy 拥有写权限,同时保证以非 root 身份运行的 Caddy 可以读取。
sudo install -d -m 0755 -o deploy -g deploy /var/www/my-first-site
ls -ld /var/www/my-first-site
遇到 Permission denied 不要直接 chmod 777。静态网站通常目录 755、文件 644 就够了,只有部署账号需要写入,Caddy 只需读取。权限越宽不代表越稳定,只是让更多进程可以改你的网页。
从自己的电脑上传文件
下面命令要在本地 my-first-site 目录执行,不是在服务器执行。路径结尾的斜杠表示把当前目录里的内容放到远端网站根目录。
rsync -av --progress ./ deploy@203.0.113.10:/var/www/my-first-site/
没有 rsync 时可以使用 scp -r ./* deploy@203.0.113.10:/var/www/my-first-site/。第一次不要随手加 rsync --delete,因为它会删除远端存在而本地不存在的文件;先弄懂删除范围,再决定是否用于自动发布。
登录服务器检查上传结果:
find /var/www/my-first-site -maxdepth 2 -type f -print
namei -l /var/www/my-first-site/index.html
应看到 index.html 和 styles.css。namei 会逐级显示目录权限,Caddy 读不到文件时,它比反复 chmod 更容易找到是哪一层没有执行或读取权限。
配置唯一的正式域名
编辑前先备份现有 /etc/caddy/Caddyfile。下面让根域名提供内容,并把 www 永久跳转到根域名;如果你更喜欢 www 作为正式地址,就把两个块反过来。
www.example.com {
redir https://example.com{uri} permanent
}
example.com {
root * /var/www/my-first-site
encode zstd gzip
file_server
}
用 sudoedit /etc/caddy/Caddyfile 写入。普通自动 HTTPS 场景下,站点标签直接写域名即可,不要照着浏览器地址栏把路径也复制进去。
先校验,再重载
validate 只检查新配置,不会替换正在运行的网站;通过以后 reload 才应用。这样一个漏掉的花括号不会直接让线上服务停掉。
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
systemctl status caddy --no-pager
journalctl -u caddy --no-pager -n 80
然后在自己的电脑执行 curl -I https://example.com 和 curl -I https://www.example.com。根域名应返回 200,www 应返回永久跳转,并且 Location 指向根域名。
以后更新页面的固定动作
本地预览、提交代码或备份、上传文件、打开公网页面复查,这是一次最小发布。只替换静态文件不需要重启 Caddy;只有 Caddyfile 变化才需要 validate 和 reload。把命令写进自己的发布清单,比每次靠记忆更可靠。
我的踩坑体会
我第一次部署把网站放在 home 目录,文件只有 SSH 用户能读。遇到 403 后就不断放宽权限,页面虽然偶然打开了,我却不知道为什么。后来改成固定 /var/www 路径、deploy 负责写、Caddy 只负责读,目录结构和问题都清楚多了。
完成标准
域名能打开页面,www 跳转方向一致,退出 SSH 后 Caddy 仍是 active,而且公网没有暴露 Python 预览服务,就算部署成功。HTTPS 失败时不要随机重装,下一篇按网络层逐步完成 Caddy HTTPS 排错。