从零到上线:一个静态站的完整 checklist
这篇是本站的「总纲」。前面每篇都是某个环节的展开,这里给出顺序——建站最容易出问题的不是某个技术点,而是漏了某一步。
阶段一:域名(第 1 天)
- 选定后缀,对比续费价(不是首年价)
- 选注册商:服务器在境内 → 考虑境内注册商便于备案;在境外 → Cloudflare Registrar 省心
- 开启 WHOIS 隐私、注册锁、自动续费
- DNS 托管到 Cloudflare,改 NS 记录并验证生效
- 配 CAA 记录,开启 DNSSEC(去注册商填 DS)
dig +short NS www.bzii.cn
dig +short CAA www.bzii.cn
dig +short DS www.bzii.cn阶段二:服务器(第 1~2 天)
- 选机房:用户在国内就选亚洲节点(新加坡/东京),别迷信美西
- 系统更新 + 装基础工具
- 建普通用户 + 配置 SSH 密钥(先验证新窗口能登录)
- 改 SSH 端口、禁 root、禁密码登录
- ufw 只放行 22(改后的)/80/443,安全组同步放行
- 装 fail2ban
- 时区、hostname、swap(小内存机器)
- 打系统盘快照
阶段三:Web 服务(第 2 天)
- 装 Nginx,写站点配置(
root+try_files) nginx -t通过并软链到 sites-enabled- 上传站点文件,
chown -R www-data:www-data - 签 Let's Encrypt 证书(
certbot --nginx) - 确认
certbot.timer在跑,加 reload hook - 80 → 443 跳转,www → 根域(或反过来,选一个)
sudo nginx -t
systemctl status certbot.timer
curl -sI http://www.bzii.cn | grep -i location阶段四:加速与安全(第 3 天)
- Cloudflare 开橙色云,加密模式设为 Full (Strict)
- 开启 Always Use HTTPS、Brotli、HTTP/3
- 缓存规则:静态资源长缓存,HTML 不缓存
- 源站防火墙只放行 Cloudflare IP 段
- Nginx 配
real_ip_header CF-Connecting-IP(日志才准) - 安全头:nosniff / X-Frame-Options / Referrer-Policy(HSTS 最后加)
阶段五:自动化与备份(第 3~4 天)
- 代码推到 Git 远程仓库(这就是第一份备份)
- 配 GitHub Actions 自动部署(或用 rsync 脚本)
- 写备份脚本:文件 + 配置 + 数据库
- systemd timer / cron 定时执行,日志落盘
- 异地同步一份(另一台机器或对象存储)
- 做一次恢复演练
阶段六:上线后巡检(每周 / 每月)
- 磁盘、内存、负载(
df -h/free -h/uptime) - 服务状态(nginx / ssh / fail2ban)
- 证书剩余天数 < 30 天要留意
- 站点可用性探测(HTTP 200 + 耗时)
- 看一眼 error.log 有没有异常
curl -o /dev/null -s -w "%{http_code} %{time_total}s\n" https://www.bzii.cn
tail -50 /var/log/nginx/error.log阶段七:持续优化(有空再做)
- 图片转 WebP、加
loading="lazy"、声明尺寸 - Lighthouse 跑分,Performance ≥ 90
- 加 RSS / sitemap.xml
- 日志轮转确认生效
我踩过的坑(按痛感排序)
- 改 SSH 配置没留后路,把自己锁在门外 → 每次改前先开一个新窗口验证;
- 只改 ufw 不改安全组(或反过来)→ 端口死活不通;
- 证书只配 cert.pem 没配 fullchain → 手机上报不安全;
- CDN 缓存了 HTML → 发了新版用户看不到,以为没生效;
- 备份脚本从没恢复过 → 真出事时才发现文件格式不对;
- 忘了域名续费 → 进赎回期,多花几百块。
按顺序走完这份清单,一个静态站就「正经上线」了。剩下的事情只有一件:持续写内容。
站点是给人看的,不是给机器看的。技术细节搞定了,就该回到内容本身了。
