Files
shizhui_website/docs/DEPLOY.md

4.9 KiB
Raw Blame History

部署与运维记录

记录服务器环境、部署流程与上线状态。凭据不写入本文件。

服务器信息

  • 系统Ubuntu 26全新
  • 域名shizhui.xyz已解析可 ping 通)
  • 登录:建议改用 SSH 密钥,关闭 root 密码登录(待办)

部署架构

本地构建 (npm run build) → 生成 dist/ 静态文件
  → rsync/scp 上传到服务器 /var/www/shizhui
  → Nginx 托管
  → Let's Encrypt 提供 HTTPS

采用"本地构建 + 上传 dist"的方式,服务器无需安装 Node最简单、最稳定。

一、服务器初始化(首次)

# 更新系统
apt update && apt upgrade -y

# 安装 Nginx 与 certbot
apt install -y nginx certbot python3-certbot-nginx

# 防火墙放行 HTTP/HTTPS/SSH
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw --force enable

# 站点目录
mkdir -p /var/www/shizhui

二、Nginx 配置

文件:/etc/nginx/sites-available/shizhui(仓库内见 deploy/nginx-shizhui.conf

ln -sf /etc/nginx/sites-available/shizhui /etc/nginx/sites-enabled/shizhui
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

三、申请 HTTPS 证书

certbot --nginx -d shizhui.xyz -d www.shizhui.xyz
# 自动续期已由 certbot 的 systemd timer 处理,可验证:
certbot renew --dry-run

四、发布更新(每次内容/代码变更后)

本地执行(见 deploy/deploy.sh

npm run build
rsync -avz --delete dist/ root@shizhui.xyz:/var/www/shizhui/

五、上线检查清单

  • 服务器初始化完成swap 2G + Nginx 1.28 + certbot 4.0 + ufw 防火墙)
  • Nginx 配置就位并 reload
  • 首次上传 dist服务器本机 HTTP 200 正常)
  • 阿里云安全组放行 80之前规则未应用到实例已修复80/8080 探测 open
  • HTTP 公网访问正常(http://shizhui.xyz → 200
  • 阿里云安全组放行 443
  • HTTPS 证书申请成功DNS-01 验证,含 shizhui.xyz/www/git到期 2026-09-09自动续期已配
  • HTTPS 配置启用(本机握手 200HTTP 跳转 HTTPS
  • 浏览器访问 https://shizhui.xyz 正常(需先完成 ICP 备案,否则被劫持)
  • 清理临时 8080 测试配置(备案上线后)
  • 更换 root 密码 + 配置 SSH 密钥登录
  • 备案完成后轮转阿里云 AccessKey

排障记录:公网端口不通

现象:服务器内部 nginx/ufw 全正常,本机 HTTP 200但公网探测 80 closed、 nginx 日志无任何外部请求。

排查用服务器调用第三方端口探测服务ports.yougetsignal.com从外部探测 并对比高位端口 8080。最终定位为阿里云安全组规则未应用到实例(实例绑定的 安全组与编辑的安全组不一致)。修正绑定后 80/8080 探测变为 openHTTP 恢复正常。

结论:与备案、与本地 VPN 均无关,是安全组绑定问题。

排障记录HTTPS 证书 HTTP 验证失败 (403 / 200空响应)

现象80/443 端口已放行静态文件外部访问完全正常probe 文件本机/公网/www 三种方式均 200 且内容正确),但 certbot 的 ACME HTTP-01 验证始终失败: Let's Encrypt 访问 /.well-known/acme-challenge/<token> 返回 403 或 200 空响应。

排查:

  • webroot 与 nginx 插件两种方式都试过,均失败。
  • 手动放置同目录静态文件testfile/probe123本机、公网 IP、www Host 三种请求都正常返回 200 + 正确内容。
  • certbot 写入的 challenge 文件路径与内容均正确(已边写边抓验证)。
  • 域名解析 IP 与服务器真实公网 IP 一致,未走 CDN。
  • 唯一失败的是「瞬时新建的 acme-challenge 路径」被外部访问时异常。

判断:阿里云网络入口对突发的 /.well-known/acme-challenge/ 新路径存在安全 拦截(国内服务器常见),导致 HTTP-01 验证不可用。

真正根因:域名未备案(已确认)

通过外部代理对比确认:

  • http://shizhui.xyz/(域名+80→ 返回阿里云劫持页 <title>Non-compliance ICP Filing</title>(未备案提示),我们的网站被拦截。
  • http://8.137.165.96:8080/IP+非标端口)→ 正常返回站点。

阿里云对未备案域名经标准端口80/443的访问会劫持到备案提示页 这正是 HTTP-01 验证拿到 403/异常响应的真正原因。

影响与对策:

  • HTTPS 证书HTTP 验证不可用,改用 DNS-01 验证(阿里云 DNS 插件,已安装 certbot-dns-aliyun 2.0.0)。
  • 域名正式可用前必须完成 ICP 备案。备案前域名走 80/443 一律被劫持。
  • 测试访问地址(备案完成前):http://8.137.165.96:8080/

解决方案:改用 DNS-01 验证签发证书,绕开 80 端口。

  • 方案一(采用):阿里云 DNS 插件 + RAM 子账号 AccessKey只给 DNS 权限), 全自动签发与续期。