Files
shizhui_website/docs/DEPLOY.md

129 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署与运维记录
> 记录服务器环境、部署流程与上线状态。凭据不写入本文件。
## 服务器信息
- 系统Ubuntu 26全新
- 域名shizhui.xyz已解析可 ping 通)
- 登录:建议改用 SSH 密钥,关闭 root 密码登录(待办)
## 部署架构
```
本地构建 (npm run build) → 生成 dist/ 静态文件
→ rsync/scp 上传到服务器 /var/www/shizhui
→ Nginx 托管
→ Let's Encrypt 提供 HTTPS
```
采用"本地构建 + 上传 dist"的方式,服务器无需安装 Node最简单、最稳定。
## 一、服务器初始化(首次)
```bash
# 更新系统
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`
```bash
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 证书
```bash
certbot --nginx -d shizhui.xyz -d www.shizhui.xyz
# 自动续期已由 certbot 的 systemd timer 处理,可验证:
certbot renew --dry-run
```
## 四、发布更新(每次内容/代码变更后)
本地执行(见 `deploy/deploy.sh`
```bash
npm run build
rsync -avz --delete dist/ root@shizhui.xyz:/var/www/shizhui/
```
## 五、上线检查清单
- [x] 服务器初始化完成swap 2G + Nginx 1.28 + certbot 4.0 + ufw 防火墙)
- [x] Nginx 配置就位并 reload
- [x] 首次上传 dist服务器本机 HTTP 200 正常)
- [x] 阿里云安全组放行 80之前规则未应用到实例已修复80/8080 探测 open
- [x] HTTP 公网访问正常http://shizhui.xyz → 200
- [x] 阿里云安全组放行 443
- [x] HTTPS 证书申请成功DNS-01 验证,含 shizhui.xyz/www/git到期 2026-09-09自动续期已配
- [x] 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 权限),
全自动签发与续期。