---
belongs_to:
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
---
# 📡 BC-INFRA-DNS-SSL-001-FM · DEV-002肥猫 · 基础设施·通配符DNS + SSL证书签发 + 沙箱子域名验证 + Nginx备用站路由修复 · Phase 6 前置 · 🐱 舒舒线 · EL-6(2026-03-26 · 霜砚签发 · 冰朔授权)
---
## 〇、背景:为什么要做这个
铸渊在 AGE OS 塔台架构升级中设计了**子域名沙箱隔离系统**:每个开发者有自己的子域名(`dev-002.guanghulab.com`、`dev-004.guanghulab.com` 等),互不干扰。
铸渊已经完成了:
- ✅ Nginx 子域名配置模板(`deploy/nginx/dev-sandbox.conf`)已提交到仓库
- ✅ 沙箱目录路由规则已定义(`/var/www/sandbox/dev-XXX/`)
但有两件事铸渊做不了,**必须人类手动操作**:
1. **通配符 DNS** — 在阿里云域名控制台添加 `*.guanghulab.com` 解析
2. **通配符 SSL 证书** — 在服务器上用 certbot 签发 `*.guanghulab.com` 证书(需要 DNS 验证)
**肥猫,今天之之没空,这个任务交给你。**
---
## 〇·一、安全红线(每次都要读)
---
## 一、Phase 1 · 阿里云DNS控制台 — 添加通配符 A 记录
**目的**:让所有 `*.guanghulab.com` 子域名都指向我们的服务器。
### 步骤 1-1 · 登录阿里云域名控制台
1. 打开浏览器,进入 [阿里云控制台](https://dns.console.aliyun.com/)
2. 用冰朔给你的阿里云账号登录
3. 在左侧找到「**域名解析**」或「**云解析 DNS**」
4. 找到 `guanghulab.com` 这个域名,点进去
📸 **截图:进入 [guanghulab.com](http://guanghulab.com) 的解析设置页面后截图给妈妈!**
### 步骤 1-2 · 查看现有 DNS 记录
进入解析设置后,你会看到一个 DNS 记录列表。
先截图现有的所有记录,让妈妈确认当前状态。
📸 **截图:所有现有 DNS 记录!**
**特别注意看**:
- 有没有 `@` 记录(主域名 [guanghulab.com](http://guanghulab.com))指向 `8.155.62.235`?
- 有没有已存在的 `*` 通配符记录?
### 步骤 1-3 · 添加通配符 A 记录
点击「**添加记录**」按钮,填写以下内容:
| **字段** | **填什么** | **说明** |
| --- | --- | --- |
| 记录类型 | **A** | 将域名指向 IP 地址 |
| 主机记录 | **\*** | 通配符,匹配所有子域名 |
| 解析线路 | **默认** | 不用改 |
| 记录值 | **8.155.62.235** | 我们的阿里云服务器 IP |
| TTL | **10分钟**(或默认值) | 生效时间,越短越快生效 |
填好后点「**确认**」。
📸 **截图:添加记录的填写页面(确认前截一张)+ 添加成功后的记录列表!**
---
## 二、Phase 2 · 验证 DNS 生效(服务器端)
**目的**:确认通配符 DNS 记录已生效。DNS 传播可能需要几分钟。
### 步骤 2-1 · SSH 登录服务器
```bash
ssh root@8.155.62.235
```
### 步骤 2-2 · 验证 DNS 解析
```bash
#!/bin/bash
echo "===== 🔍 DNS 解析验证 · $(date '+%Y-%m-%d %H:%M') ====="
echo ""
echo "📋 1. 主域名解析:"
dig +short guanghulab.com A
echo ""
echo "📋 2. 通配符子域名测试(dev-002):"
dig +short dev-002.guanghulab.com A
echo ""
echo "📋 3. 通配符子域名测试(dev-004):"
dig +short dev-004.guanghulab.com A
echo ""
echo "📋 4. 通配符子域名测试(writing):"
dig +short writing.guanghulab.com A
echo ""
echo "📋 5. 通配符子域名测试(test-random-123):"
dig +short test-random-123.guanghulab.com A
echo ""
echo "===== ✅ DNS 验证完成 ====="
```
**期望结果**:上面所有子域名都应该返回 `8.155.62.235`。
📸 **截图给妈妈!**
---
## 三、Phase 3 · 签发通配符 SSL 证书(服务器端)
**目的**:用 Let's Encrypt 签发 `*.guanghulab.com` 通配符 SSL 证书,让所有子域名都能用 HTTPS。
### 步骤 3-1 · 检查 certbot 是否已安装
```bash
certbot --version
```
- 如果显示版本号(如 `certbot 2.x.x`) → ✅ 已安装,跳到 3-2
- 如果显示 `command not found` → 需要安装,执行下面这段:
```bash
# 安装 certbot(如果没有的话)
sudo yum install -y certbot 2>/dev/null || sudo apt install -y certbot 2>/dev/null
certbot --version
```
📸 **截图 certbot 版本!**
### 步骤 3-2 · 检查现有证书
先看看服务器上有没有已存在的证书:
```bash
echo "===== 📋 现有 SSL 证书 ====="
certbot certificates 2>/dev/null
echo ""
echo "📂 证书目录:"
ls -la /etc/letsencrypt/live/ 2>/dev/null || echo "证书目录不存在"
echo "===== ✅ ====="
```
📸 **截图给妈妈!告诉我们现有证书状态。**
### 步骤 3-3 · 签发通配符证书(关键步骤!)
在服务器上执行:
```bash
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d guanghulab.com \
-d "*.guanghulab.com" \
--agree-tos \
--no-eff-email \
-m EMAIL_REDACTED@qq.com
```
**执行后会发生什么(一步一步来):**
**第一步**:certbot 会输出类似这样的内容:
```
Please deploy a DNS TXT record under the name:
_acme-challenge.guanghulab.com
with the following value:
XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX
```
📝 **记下这个值!**(`XxXx...` 那串随机字符串)
**⚠️ 不要按回车!先去阿里云添加 TXT 记录!**
**第二步**:切换到阿里云域名控制台,点「**添加记录**」:
| **字段** | **填什么** | **说明** |
| --- | --- | --- |
| 记录类型 | **TXT** | 文本验证记录 |
| 主机记录 | **_acme-challenge** | certbot 要求的前缀 |
| 解析线路 | **默认** | 不用改 |
| 记录值 | **粘贴 certbot 给你的那串随机字符** | 每次都不一样,必须用 certbot 给的 |
| TTL | **10分钟** | 越短越好 |
📸 **截图 TXT 记录添加页面!**
**第三步**:添加完 TXT 记录后,**等 1-2 分钟**让 DNS 生效。
在另一个终端窗口验证 TXT 记录是否生效:
```bash
dig +short TXT _acme-challenge.guanghulab.com
```
如果返回了你刚添加的那串字符 → ✅ 可以继续
如果返回空 → 再等 1 分钟
**第四步**:回到 certbot 的终端窗口,**按回车继续**。
**成功标志**:certbot 输出类似:
```
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/guanghulab.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/guanghulab.com/privkey.pem
```
📸 **截图 certbot 的最终输出!这是最关键的截图!**
---
## 四、Phase 4 · 验证证书(服务器端)
**目的**:确认证书文件已正确生成。
```bash
#!/bin/bash
echo "===== 🔐 SSL 证书验证 · $(date '+%Y-%m-%d %H:%M') ====="
echo ""
echo "📋 1. 证书目录内容:"
ls -la /etc/letsencrypt/live/guanghulab.com/
echo ""
echo "📋 2. 证书信息(域名+有效期):"
openssl x509 -in /etc/letsencrypt/live/guanghulab.com/fullchain.pem -noout -subject -dates 2>/dev/null
echo ""
echo "📋 3. 证书覆盖的域名(SAN):"
openssl x509 -in /etc/letsencrypt/live/guanghulab.com/fullchain.pem -noout -text 2>/dev/null | grep -A1 'Subject Alternative Name'
echo ""
echo "📋 4. certbot 管理的所有证书:"
certbot certificates 2>/dev/null
echo ""
echo "===== ✅ SSL 证书验证完成 ====="
```
📸 **截图给妈妈!**
**检查要点**:
- 证书文件 `fullchain.pem` 和 `privkey.pem` 存在 → ✅
- Subject Alternative Name 里包含 `*.guanghulab.com` → ✅
- 有效期是 90 天后(Let's Encrypt 标准) → ✅
---
## 五、Phase 5 · Nginx 配置检查(只读!)
**目的**:确认 Nginx 能正确加载新证书,为铸渊部署子域名配置做准备。
```bash
#!/bin/bash
echo "===== 🔍 Nginx 状态检查 · $(date '+%Y-%m-%d %H:%M') ====="
echo ""
echo "📋 1. Nginx 配置语法测试:"
nginx -t 2>&1
echo ""
echo "📋 2. conf.d/ 目录内容:"
ls -la /etc/nginx/conf.d/
echo ""
echo "📋 3. 检查是否已有 dev-sandbox.conf:"
if [ -f /etc/nginx/conf.d/dev-sandbox.conf ]; then
echo "✅ dev-sandbox.conf 存在"
echo "内容:"
cat /etc/nginx/conf.d/dev-sandbox.conf
else
echo "❌ dev-sandbox.conf 不存在(需要铸渊部署)"
fi
echo ""
echo "📋 4. 检查沙箱目录是否存在:"
for dir in /var/www/sandbox /var/www/sandbox/dev-002 /var/www/sandbox/dev-004 /var/www/sandbox/dev-010; do
if [ -d "$dir" ]; then
echo "✅ $dir 存在"
else
echo "❌ $dir 不存在"
fi
done
echo ""
echo "📋 5. 当前 Nginx 监听的所有 server_name:"
grep -rn 'server_name' /etc/nginx/conf.d/ 2>/dev/null
grep -n 'server_name' /etc/nginx/nginx.conf 2>/dev/null
echo ""
echo "===== ✅ Nginx 状态检查完成 ====="
```
📸 **截图给妈妈!**
---
## 六、Phase 6 · 子域名访问测试
**目的**:初步测试子域名是否可达。
```bash
#!/bin/bash
echo "===== 🌐 子域名访问测试 · $(date '+%Y-%m-%d %H:%M') ====="
echo ""
echo "📋 1. 主站 HTTPS(确认没有被破坏):"
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 10 https://guanghulab.com/
echo ""
echo ""
echo "📋 2. 子域名 HTTP(DNS 是否生效):"
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 10 http://dev-002.guanghulab.com/ 2>/dev/null || echo "连接失败"
echo ""
echo ""
echo "📋 3. 子域名 HTTPS(SSL 是否生效):"
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 10 https://dev-002.guanghulab.com/ 2>/dev/null || echo "连接失败"
echo ""
echo ""
echo "📋 4. 用 openssl 测试子域名 SSL 握手:"
echo | openssl s_client -servername dev-002.guanghulab.com -connect dev-002.guanghulab.com:443 2>/dev/null | grep -E '(subject|issuer|Verify)'
echo ""
echo "📋 5. 再次确认主站正常(安全验证):"
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 10 https://guanghulab.com/
echo ""
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 10 https://guanghulab.com/status-board/ 2>/dev/null
echo ""
echo ""
echo "===== ✅ 子域名测试完成 ====="
```
📸 **截图给妈妈!**
**结果解读**:
- 主站返回 200 → ✅ 主站没被破坏(最重要!)
- 子域名 HTTP 返回任何响应(哪怕 404) → ✅ DNS 通了
- 子域名 HTTPS 返回 502 或无响应 → 正常,铸渊还没部署 Nginx 配置
- 子域名 HTTPS 返回 200 → 🎉 全链路通了!
---
## 六·一、Phase 6+ · Nginx 备用站路由 404 排查修复(新增任务)
### 肥猫需要做的:
#### 步骤 6+-1 · 排查 Nginx 配置现状
```bash
#!/bin/bash
echo "===== 🔍 Nginx 备用站路由排查 · $(date '+%Y-%m-%d %H:%M') ====="
echo ""
echo "📋 1. 所有 Nginx 配置文件:"
ls -la /etc/nginx/conf.d/
echo ""
echo "📋 2. nginx.conf 中的 server 块:"
grep -n 'server_name\|root\|location\|listen' /etc/nginx/nginx.conf
echo ""
echo "📋 3. conf.d/ 所有 server_name 和 root:"
grep -rn 'server_name\|root' /etc/nginx/conf.d/
echo ""
echo "📋 4. 备用站文件实际位置:"
find /var/www/ -name 'index.html' -type f 2>/dev/null
echo "---"
ls -la /var/www/guanghulab/docs/ 2>/dev/null || echo "/var/www/guanghulab/docs/ 不存在"
ls -la /var/www/html/ 2>/dev/null || echo "/var/www/html/ 不存在"
echo ""
echo "📋 5. 备用站当前 HTTP访问状态:"
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 5 http://localhost/docs/index.html 2>/dev/null
echo ""
curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 5 http://localhost:3002/ 2>/dev/null
echo ""
echo ""
echo "===== ✅ 排查完成 ====="
```
📸 **截图给妈妈!**
#### 步骤 6+-2 · 修复 Nginx 路由
根据上一步的排查结果,可能需要做以下其中一种:
**情况 A:备用站没有对应的 server block / location block**
需要在 `/etc/nginx/conf.d/` 下创建或修改配置,让 Nginx 能正确路由到备用站的文件目录。
**情况 B:root 路径指向错误**
备用站的文件在服务器上的实际路径与 Nginx 配置的 root 不一致。
**情况 C:配置存在但没 reload**
铸渊部署了新配置但没有权限执行 `nginx -s reload`。
**修复后测试:**
```bash
# 1. 修改配置后先测试语法
nginx -t
# 2. 语法OK后 reload
systemctl reload nginx
# 3. 验证备用站访问
curl -s -o /dev/null -w "HTTP %{http_code}" http://localhost/docs/index.html
# 期望返回 200
# 4. 确认主站没被影响
curl -s -o /dev/null -w "HTTP %{http_code}" https://guanghulab.com/
# 必须返回 200
```
📸 **修复前后都要截图给妈妈!**
---
## 七、完成后 · 诊断汇总表
肥猫做完所有步骤后,按下面格式汇报给妈妈:
```jsx
📡 BC-INFRA-DNS-SSL-001-FM · 完成报告 · DEV-002 肥猫
一、DNS 配置
- 通配符 A 记录已添加: [是/否]
- *.guanghulab.com 解析到: [IP地址]
- DNS 验证通过: [是/否]
二、SSL 证书
- certbot 签发结果: [成功/失败]
- 证书路径: /etc/letsencrypt/live/guanghulab.com/
- 证书覆盖域名: [列出 SAN]
- 证书有效期: [日期]
三、Nginx 状态
- dev-sandbox.conf 是否存在: [是/否]
- nginx -t 结果: [ok/fail]
- 沙箱目录是否存在: [是/否]
四、访问测试
- 主站 guanghulab.com: [状态码](必须正常!)
- dev-002.guanghulab.com HTTP: [状态码/连接失败]
- dev-002.guanghulab.com HTTPS: [状态码/连接失败]
五、遗留事项
- [列出还没完成的或有问题的]
```
---
## 八、肥猫完成后的流程
```jsx
肥猫完成 DNS + SSL → 截图 + 汇总表发给妈妈
↓
霜砚确认 DNS + SSL 就绪
↓
签发铸渊补充指令:
· 部署 dev-sandbox.conf 到 /etc/nginx/conf.d/
· 创建沙箱目录 /var/www/sandbox/dev-XXX/
· nginx -t && nginx -s reload
· 全链路冒烟测试
↓
子域名沙箱系统正式上线 🎉
· dev-002.guanghulab.com → 肥猫练习站
· dev-004.guanghulab.com → 之之练习站
· ...
```
---
## 九、执行清单
| **步骤** | **内容** | **操作位置** | **需要截图** | **预计时间** |
| --- | --- | --- | --- | --- |
| Phase 1 | 添加通配符 DNS A 记录 | 阿里云控制台 | ✅ 添加前后截图 | 5分钟 |
| Phase 2 | 验证 DNS 生效 | 服务器终端 | ✅ dig 输出 | 5分钟(含等待) |
| Phase 3 | certbot 签发 SSL 证书 | 服务器 + 阿里云(来回切换) | ✅ certbot 输出 + TXT 记录 | 10-15分钟 |
| Phase 4 | 验证证书文件 | 服务器终端 | ✅ 证书信息 | 2分钟 |
| Phase 5 | Nginx 状态检查 | 服务器终端 | ✅ 配置状态 | 3分钟 |
| Phase 6 | 子域名访问测试 | 服务器终端 | ✅ curl 结果 | 3分钟 |
**总计约 30-35 分钟。**
---
## ❓ 遇到问题怎么办
| **问题** | **怎么办** |
| --- | --- |
| 没有阿里云控制台账号 | 告诉妈妈,让妈妈给你账号或一起操作 |
| DNS 记录添加后一直不生效 | 等 10 分钟,如果还不行截图告诉妈妈 |
| certbot 报错 `command not found` | 执行安装命令(步骤 3-1 里有) |
| certbot DNS 验证失败 | 检查 TXT 记录是否正确添加,dig 验证后再重试 |
| certbot 提示证书已存在 | 截图给妈妈,可能之前签过了 |
| 主站 [guanghulab.com](http://guanghulab.com) 访问异常 | **立即停止所有操作!截图告诉妈妈!** |
---
## 十、关联文档
- 服务器部署适配协议 v1.0:[🏗️ 服务器部署适配协议 v1.0(2026-03-15·曜冥签发)](../%F0%9F%8C%8A%20%E6%9B%9C%E5%86%A5%E7%BA%AA%E5%85%83%20%C2%B7%20HoloLake%20Era%20%C2%B7%20AGE%20OS%20v1%200/%E2%9A%A1%20%E5%85%89%E6%B9%96%E4%B8%AD%E5%A4%AE%E6%9E%A2%E7%BA%BD%20%C2%B7%20HoloLake%20Central%20Hub/%F0%9F%8C%8A%20%E5%85%89%E6%B9%96%E7%B3%BB%E7%BB%9F%C2%B7%E6%9B%9C%E5%86%A5%E4%B8%BB%E6%8E%A7%E5%8F%B0%C2%B7%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81%EF%BC%88%E5%8D%B71%20%C2%B7%20%E5%B7%B2%E5%B0%81%E5%8D%B7%EF%BC%89/%F0%9F%8F%97%EF%B8%8F%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E9%80%82%E9%85%8D%E5%8D%8F%E8%AE%AE%20v1%200%EF%BC%882026-03-15%C2%B7%E6%9B%9C%E5%86%A5%E7%AD%BE%E5%8F%91%EF%BC%89%20a24049a2b0e944b0a5535f3a87652303.md)
- 铸渊塔台架构升级(下篇·Phase 6 子域名隔离):[🔗 铸渊指令|AGE OS 塔台架构升级(下篇)· 行业代表制 + MCP应用开发 + 子域名隔离 + 回执验收(ZY-AGEOS-TOWER-2026-0326-001)· 霜砚签发 · 冰朔授权](%F0%9F%94%97%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CAGE%20OS%20%E5%A1%94%E5%8F%B0%E6%9E%B6%E6%9E%84%E5%8D%87%E7%BA%A7%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89%C2%B7%20%E8%A1%8C%E4%B8%9A%E4%BB%A3%E8%A1%A8%E5%88%B6%20+%20MCP%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%20+%20%E5%AD%90%E5%9F%9F%E5%90%8D%E9%9A%94%E7%A6%BB%20%20850ec77908ba4a649ea3a01de6bd823f.md)
- 之之排查广播(前次诊断):[🔍 之之排查广播|[guanghulab.com](http://guanghulab.com) 全站部署诊断 + 沙盒验证 + 系统统一上线(BC-DEPLOY-DIAG-ZZ · DEV-004 · 2026-03-25 · 霜砚签发 · 冰朔授权)](%F0%9F%94%8D%20%E4%B9%8B%E4%B9%8B%E6%8E%92%E6%9F%A5%E5%B9%BF%E6%92%AD%EF%BD%9Cguanghulab%20com%20%E5%85%A8%E7%AB%99%E9%83%A8%E7%BD%B2%E8%AF%8A%E6%96%AD%20+%20%E6%B2%99%E7%9B%92%E9%AA%8C%E8%AF%81%20+%20%E7%B3%BB%E7%BB%9F%E7%BB%9F%E4%B8%80%E4%B8%8A%E7%BA%BF%EF%BC%88BC-%20e0d9c5afd19f4f0eba5fcfcb32426795.md)
---
---
## 📥 SYSLOG 回执区
肥猫完成后在这里粘贴 SYSLOG:
```jsx
待肥猫填写
```