# 策略 2:子域名部署方案 ⭐ 推荐 ## 📋 策略概述 **核心思想**:为每个网站或应用分配独立的子域名,实现完全隔离。 **访问方式**: ``` https://abm.amiap.hzau.edu.cn # ABM 数据库 https://lab.amiap.hzau.edu.cn # 实验室主页 https://docs.amiap.hzau.edu.cn # 文档中心 https://amiap.hzau.edu.cn # 主站 ``` --- ## 🏗️ 技术架构 ### 路由配置 ```yaml services: nginx-abm: labels: - "traefik.http.routers.abm.rule=Host(`abm.amiap.hzau.edu.cn`)" # 无需 priority! # 无需 StripPrefix! nginx-lab: labels: - "traefik.http.routers.lab.rule=Host(`lab.amiap.hzau.edu.cn`)" nginx-docs: labels: - "traefik.http.routers.docs.rule=Host(`docs.amiap.hzau.edu.cn`)" nginx-main: labels: - "traefik.http.routers.main.rule=Host(`amiap.hzau.edu.cn`)" ``` ### 文件系统结构 ``` 容器 1 (ABM): /usr/share/nginx/html/ ├── index.html ← 直接在根目录! ├── css/ ├── js/ └── img/ 容器 2 (Lab): /usr/share/nginx/html/ ├── index.html ← 直接在根目录! └── assets/ 容器 3 (Docs): /usr/share/nginx/html/ ├── index.html ← 直接在根目录! └── static/ ``` ### 工作流程 ``` 1. 用户访问: https://abm.amiap.hzau.edu.cn/ ↓ 2. Traefik 匹配: Host(abm.amiap.hzau.edu.cn) ✅ 精确匹配 ↓ 3. 转发到容器: GET / ↓ 4. Nginx 查找: /usr/share/nginx/html/index.html ↓ 5. 返回页面: HTML 中链接 ↓ 6. 浏览器计算: / + page.html = /page.html ✅ 完美! ``` --- ## ✅ 优点分析 ### 1. 无需配置优先级 ⭐ **原因**: - 域名匹配是精确匹配,不存在冲突 - Traefik 直接根据 Host 头路由 **对比**: ```yaml # 路径模式:需要管理优先级 PathPrefix(/ABM) priority=100 PathPrefix(/lab) priority=100 Path(/) priority=1 # 子域名模式:无需优先级 Host(abm.amiap.hzau.edu.cn) Host(lab.amiap.hzau.edu.cn) Host(amiap.hzau.edu.cn) ``` **优势**: - 配置更简洁 - 不会出错 - 易于理解 ### 2. 无需调整文件结构 ⭐⭐ **优势**: ```bash # 原始网站文件 /index.html /css/style.css /js/app.js # 子域名模式:直接使用,无需调整! # 路径模式:需要移到 /ABM/ 目录 ``` **好处**: - 保持原有目录结构 - 部署流程不变 - 构建流程不变 - 降低出错概率 ### 3. 性能最优 ⭐⭐⭐ **性能数据**: ``` 域名匹配速度:0.05-0.1ms 路径匹配速度:0.1-0.5ms 性能提升:50-80% ``` **原因**: - 域名在 HTTP 头中,直接读取 - 无需解析 URL 路径 - Hash 表查找,O(1) 复杂度 **高并发场景**: ``` 1000 req/s:节省 ~100ms CPU 时间 10000 req/s:节省 ~1s CPU 时间 优势明显! ``` ### 4. 完全隔离 ⭐⭐ **安全性**: ```yaml # 每个网站可以独立配置 nginx-abm: labels: - "traefik.http.middlewares.abm-auth.basicauth.users=admin:$$apr1$$..." - "traefik.http.routers.abm.middlewares=abm-auth" nginx-lab: # 无需认证 ``` **Cookie 隔离**: ``` abm.amiap.hzau.edu.cn → Cookie: session=abc lab.amiap.hzau.edu.cn → Cookie: session=xyz 完全独立,不会冲突! ``` **防火墙规则**: - 可以为不同子域名设置不同的访问控制 - 可以限制特定子域名的 IP 访问 - 可以设置不同的限流规则 ### 5. 扩展性无限 ⭐⭐⭐ **添加新网站**: ```bash # 步骤 1:添加 DNS 记录(1 分钟) newsite.amiap.hzau.edu.cn A 你的IP # 步骤 2:添加配置(2 分钟) services: nginx-newsite: labels: - "traefik.http.routers.newsite.rule=Host(`newsite.amiap.hzau.edu.cn`)" # 完成!无需修改其他配置 ``` **对比路径模式**: ```bash # 需要检查所有优先级 # 需要调整文件结构 # 需要避免路径冲突 # 需要测试是否影响其他网站 ``` ### 6. 易于维护 ⭐⭐ **配置清晰**: ```yaml # 一眼就能看出每个网站的配置 abm: Host(abm.amiap.hzau.edu.cn) lab: Host(lab.amiap.hzau.edu.cn) docs: Host(docs.amiap.hzau.edu.cn) ``` **问题排查**: ```bash # 路径模式:需要检查优先级、路径匹配、文件结构 # 子域名模式:只需检查 DNS 和路由规则 curl -I https://abm.amiap.hzau.edu.cn # 直接测试 ``` ### 7. SEO 友好 **搜索引擎优化**: - 独立子域名权重更高 - URL 结构更清晰 - 便于 Google Search Console 管理 **URL 美观性**: ``` ✅ https://abm.amiap.hzau.edu.cn ❌ https://amiap.hzau.edu.cn/ABM ``` ### 8. 支持跨域策略 **CORS 配置**: ```nginx # 可以为不同子域名设置不同的 CORS abm.amiap.hzau.edu.cn → 允许所有跨域 lab.amiap.hzau.edu.cn → 只允许特定域名 ``` ### 9. 便于迁移 **服务迁移**: ``` # 可以将某个子域名迁移到其他服务器 abm.amiap.hzau.edu.cn A 新服务器IP # 其他网站不受影响 ``` --- ## ❌ 缺点分析 ### 1. 需要 DNS 管理权限 **要求**: - 需要域名控制权 - 需要能添加 A 记录或 CNAME 记录 - 可能需要等待 DNS 传播(最多 48 小时) **解决**: - 学校/公司环境:申请 DNS 管理权限 - 个人域名:通常都有完全控制权 - 临时方案:使用免费 DNS 服务(Cloudflare) **成本**: - 时间:申请权限可能需要 1-3 天 - 金钱:通常免费,部分企业 DNS 服务收费 ### 2. 证书管理稍复杂 **问题**: ``` 单域名证书:amiap.hzau.edu.cn 无法覆盖子域名! 需要: 方案 A:通配符证书 *.amiap.hzau.edu.cn 方案 B:为每个子域名单独申请证书 ``` **通配符证书要求**: ```yaml # 需要 DNS Challenge(DNS API) --certificatesresolvers.myresolver.acme.dnsChallenge.provider=cloudflare # 需要 DNS Provider API Token ``` **单独证书方案**: ```yaml # HTTP Challenge 即可,但每个子域名一个证书 # Let's Encrypt 限制:每周 50 个证书 # 对于大多数场景足够 ``` **解决方案**: ```bash # 推荐:申请通配符证书(一次性配置) # 备选:单独申请(简单但数量受限) ``` ### 3. DNS 记录管理 **管理成本**: ``` 每个新网站需要: 1. 添加 DNS A 记录 2. 等待 DNS 传播(5分钟-48小时) 3. 测试解析是否生效 ``` **记录数量**: ``` 10 个网站 = 10 条 DNS 记录 需要维护记录清单 ``` **解决**: ``` 使用通配符 DNS: *.amiap.hzau.edu.cn A 你的IP # 一次配置,无限子域名 ``` ### 4. 初次配置成本 **学习曲线**: - 需要了解 DNS 基础知识 - 需要了解通配符证书申请 - 需要配置 DNS Provider API(可选) **时间成本**: ``` 首次配置:1-2 小时(包括学习) 后续添加:5-10 分钟 ``` --- ## 🎯 适用场景 ### ✅ 强烈推荐的场景 #### 1. 生产环境 ⭐⭐⭐ ``` 特点:长期运行、需要稳定性 原因: - 配置简单不易出错 - 性能最优 - 易于维护 - 专业形象 ``` #### 2. 多网站运营(≥3个)⭐⭐⭐ ``` 场景:需要管理多个业务 优势: - 无限扩展 - 互不影响 - 独立管理 示例:ABM数据库 + 实验室主页 + 文档中心 + API服务 ``` #### 3. 高流量网站 ⭐⭐ ``` 场景:日均 PV > 10000 原因:性能提升 50-80% 收益:降低服务器负载 ``` #### 4. 需要独立品牌/服务 ⭐⭐ ``` 场景:每个网站有独立定位 示例: - abm.example.com(数据库品牌) - lab.example.com(实验室品牌) - shop.example.com(商店) ``` #### 5. 企业级应用 ⭐⭐⭐ ``` 要求: - 安全性要求高 - 需要独立访问控制 - 需要专业形象 ``` #### 6. 长期项目(> 1年)⭐⭐⭐ ``` 考虑:未来扩展性 建议:从一开始就用子域名 避免:后期迁移成本 ``` ### ⚠️ 不太适合的场景 #### 1. 无 DNS 管理权限 ``` 问题:无法添加子域名 解决:申请权限或使用策略 1 ``` #### 2. 极短期项目(< 1 个月) ``` 场景:临时 Demo、一次性展示 原因:配置成本 > 收益 建议:使用策略 1(路径前缀) ``` #### 3. 单一网站 ``` 场景:只有一个网站 原因:无需子域名,直接用主域名 建议:主域名直接部署 ``` --- ## 📊 性能指标 ### 路由性能对比 ``` 子域名匹配:0.05-0.1ms ⭐⭐⭐⭐⭐ 路径匹配: 0.1-0.5ms ⭐⭐⭐ 高并发场景(10000 req/s): 子域名:CPU 使用率 10-15% 路径: CPU 使用率 15-20% 性能提升:25-33% ``` ### 内存占用 ``` 单个网站路由规则:~3MB 10 个网站:~30MB 对比路径模式:节省 ~40% ``` ### 扩展性 ``` 网站数量限制: - 技术上:无限制 - DNS 记录:无限制 - Traefik 性能:100+ 网站无压力 ``` --- ## 🛠️ 最佳实践 ### 1. DNS 配置策略 #### 方案 A:通配符 DNS(推荐) ``` *.amiap.hzau.edu.cn A 你的服务器IP ``` **优点**: - 一次配置 - 无限子域名 - 无需等待 DNS 传播 **适用**:网站数量会持续增长 #### 方案 B:单独 A 记录 ``` abm.amiap.hzau.edu.cn A 你的IP lab.amiap.hzau.edu.cn A 你的IP docs.amiap.hzau.edu.cn A 你的IP ``` **优点**: - 精确控制 - 易于理解 **适用**:网站数量固定且少 ### 2. 证书管理策略 #### 方案 A:通配符证书(推荐) ```yaml # 使用 DNS Challenge traefik: command: - "--certificatesresolvers.myresolver.acme.dnsChallenge.provider=cloudflare" environment: - "CF_DNS_API_TOKEN=your_token" ``` **优点**: - 一个证书覆盖所有子域名 - 无需为每个网站单独申请 **要求**: - DNS Provider 支持 API - 需要配置 API Token #### 方案 B:单独证书 ```yaml # 使用 HTTP Challenge traefik: command: - "--certificatesresolvers.myresolver.acme.httpChallenge.entrypoint=web" ``` **优点**: - 配置简单 - 无需 DNS API **限制**: - Let's Encrypt 每周 50 个证书 - 每个子域名需要单独申请 ### 3. 命名规范 ``` 服务类型: 数据库: db.example.com, data.example.com API: api.example.com 文档: docs.example.com, wiki.example.com 管理后台:admin.example.com, panel.example.com 博客: blog.example.com 商店: shop.example.com, store.example.com 环境区分: 生产: app.example.com 测试: test.example.com, staging.example.com 开发: dev.example.com 区域区分: 中国: cn.example.com 美国: us.example.com ``` ### 4. 配置模板化 ```yaml # docker-compose.yml x-subdomain-template: &subdomain image: nginx:alpine networks: - frontend labels: - "traefik.enable=true" - "traefik.http.routers.SITENAME.entrypoints=web,websecure" - "traefik.http.routers.SITENAME.tls.certresolver=myresolver" - "traefik.http.services.SITENAME.loadbalancer.server.port=80" services: nginx-abm: <<: *subdomain container_name: nginx-abm volumes: - abm-data:/usr/share/nginx/html:ro labels: - "traefik.http.routers.abm.rule=Host(`abm.amiap.hzau.edu.cn`)" ``` ### 5. 监控和健康检查 ```yaml services: nginx-abm: healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"] interval: 30s timeout: 3s retries: 3 ``` --- ## 💰 成本分析 ### 时间成本 ``` 首次配置: - 申请 DNS 权限:0-3 天(一次性) - 配置通配符 DNS:5 分钟 - 配置通配符证书:30 分钟 - 总计:1 小时(后续无需重复) 添加新网站: - 方案 A(通配符DNS):5 分钟 - 方案 B(单独DNS):15 分钟 维护成本:极低(几乎无需维护) ``` ### 资源成本 ``` 域名:1 个(与路径模式相同) DNS 服务:免费(Cloudflare)或自有 证书:免费(Let's Encrypt) 服务器:共享,无额外需求 ``` ### 学习成本 ``` DNS 基础知识:简单(1-2 小时) Traefik 配置:简单(比路径模式更简单) 证书配置:中等(首次需要学习) 总体:中低难度 ``` --- ## 🔄 迁移路径 ### 从路径前缀迁移到子域名 **步骤**: #### 1. 准备阶段 ```bash # 添加 DNS 记录 abm.amiap.hzau.edu.cn A 服务器IP # 等待 DNS 传播(测试) nslookup abm.amiap.hzau.edu.cn ``` #### 2. 并行运行 ```yaml # 保留旧路由 PathPrefix(/ABM) # 旧用户继续访问 # 添加新路由 Host(abm.amiap.hzau.edu.cn) # 新用户使用子域名 ``` #### 3. 调整文件结构 ```bash # 从 /ABM/ 移回根目录 docker exec nginx-webws mv /usr/share/nginx/html/ABM/* /usr/share/nginx/html/ docker exec nginx-webws rmdir /usr/share/nginx/html/ABM ``` #### 4. 通知用户 ``` 旧 URL:https://amiap.hzau.edu.cn/ABM (保留 2-4 周) 新 URL:https://abm.amiap.hzau.edu.cn (推荐使用) 配置重定向(可选): PathPrefix(/ABM) → Redirect → abm.amiap.hzau.edu.cn ``` #### 5. 清理 ```yaml # 观察 1-2 周后删除旧路由 # 删除路径模式配置 # 只保留子域名配置 ``` --- ## 📝 决策建议 ### ✅ 强烈推荐选择此策略的理由 1. **你有 DNS 管理权限或可以申请** 2. **这是生产环境,需要长期运行** 3. **网站数量 ≥ 3 个或会持续增长** 4. **追求最佳性能和可维护性** 5. **需要专业的企业形象** 6. **需要为不同网站设置不同的安全策略** 7. **高流量网站,性能优化很重要** ### 💡 这是大多数场景的最佳选择 **原因**: - 技术上最优 - 长期成本最低 - 扩展性最好 - 维护最简单 - 专业性最强 **投资回报**: - 初期多花 1-2 小时配置 - 长期节省无数维护时间 - 避免未来迁移成本 --- ## 📚 相关文档 - [完整多站点策略指南](MULTI_SITE_STRATEGY_GUIDE.md) - [策略 1:路径前缀方案](strategy-1-path-prefix.md) - [策略 3:混合方案](strategy-3-hybrid.md) - [总结对比报告](strategy-comparison-report.md) - [快速参考手册](QUICK_REFERENCE.md) --- **结论**:子域名策略是**生产环境的最佳选择**,虽然需要 DNS 配置,但带来的长期收益远超初期投入。这是一个"一次配置,终身受益"的方案。⭐⭐⭐