为什么要做子域划分(先把关键点说清楚)

子域不是随便分一分就完事,它影响部署复杂度、安全边界、缓存策略、SEO 和运维成本。*想象一下*:你把测试环境的静态资源和生产用的 API 放在同一个子域,升级或回滚就会变得危险且麻烦。子域合理划分能把风险、访问控制、证书管理和监控清晰地分开。
设计原则(用费曼方法把复杂事情拆成简单块)
- 清晰优先:名字一看就知道用途(环境、服务类型、地区/租户)。
- 最小权限:不同子域代表不同信任边界,便于施加不同策略。
- 可自动化:命名规则易于脚本化,域名、证书、DNS、CDN 配置能由 CI/CD 管理。
- 性能友好:便于按子域设置独立缓存与 CDN 策略。
- SEO 与品牌:公共网站与推广页尽量在主域或明确的子域下,避免内容分散降低权重。
常见划分策略与适用场景
1. 按环境(Environment)
示例:prod.example.com、staging.example.com、dev.example.com。适合用于完全隔离部署流水线的场景,便于限制访问(VPN/ACL)。
2. 按职能/服务(Service)
示例:api.example.com、www.example.com、assets.example.com。适合单体拆分或微服务外网入口分离,方便不同证书与缓存策略。
3. 按租户/客户(Tenant)
示例:customer1.example.com、customer2.example.com。适合多租户白标或客户隔离,但要注意证书和 DNS 管理成本。
4. 按区域/语言(Region/Locale)
示例:eu.example.com、cn.example.com、jp.example.com。适合内容、合规或性能要求在不同国家/地区有差异的业务。
5. 组合模式(推荐)
把上面几种按“环境-职能-地区/租户”组合起来,例如 prod.api.eu.example.com 或 staging.www.customer1.example.com,既细粒度又有规则可追溯。
子域命名规范示例(一套可复制的规则)
下面是一套实际可用的命名规范示例,做到可读、可自动化、可管理。
| 层级 |
格式 |
说明 |
| 环境 |
prod / staging / dev |
生产、预发布、开发 |
| 职能 |
www / api / assets / admin |
网站、接口、静态资源、后台 |
| 地区/租户 |
cn / eu / us / customerX |
地理分发或客户隔离 |
| 示例完整域名 |
prod.api.eu.example.com |
生产 API 服务,部署在欧洲 |
证书与 TLS 策略
证书管理是子域设计的关键点之一。两条常见路子:
- 通配符证书(*.example.com):便于管理,适合大量二级子域,但不能匹配三级子域(如 prod.api.example.com)除非使用 *.api.example.com。
- 精确证书/自动化颁发(Let’s Encrypt 等):可以为每个主机名签发证书,配合 ACME 自动化,灵活但管理更复杂。
实际做法:对外暴露的主站可用独立证书(增加信任感),微服务或内部子域用自动化颁发+短周期续期,配合证书透明日志监控。
DNS、TTL 与 灰度发布策略
DNS 决定了你切流量的灵活度:
- 短 TTL(如 60-300 秒):适合灰度、热备;切换快但查询量大。
- 长 TTL(如 1 小时以上):适合稳定的静态资源域,利于 CDN 缓存命中。
建议:为需要快速回滚的子域使用短 TTL;静态资源使用长 TTL 并交由 CDN 管理。灰度时结合子域(例如 canary.prod.api.example.com)比直接在同一子域内切 header 更安全。
反向代理与路由(Nginx / Traefik / Envoy 常见做法)
反向代理是把子域映射到内部服务的桥梁。原则上把路由规则写清楚、配合健康检查与熔断:
- 使用主机头(Host)路由来区分子域。
- 在边车(edge proxy)处处理 TLS、限流、WAF,内部服务只处理业务。
- 为关键路径(API)开启连接池与超时策略,避免“雪崩”。
跨域、Cookie 与安全边界
子域会影响 Cookie 与 CORS 行为:
- Cookie:设置 Domain 为主域(.example.com)会在所有子域共享;若要隔离,设置为具体子域(api.example.com)。
- CORS:API 子域通常需要明确允许来源,避免放开为 *。
- 安全建议:把认证相关接口放在独立子域,配合更严格的安全策略和短期令牌。
SEO、品牌与用户体验考虑
搜索引擎把子域视为独立站点(有时),因此:
- 公开内容(博客、营销页)最好集中在主域或专门的子域(例如 www 或 blog),免得权重分散。
- 国际化优先用子目录还是子域取决于策略,但子域便于地区化托管与法律合规。
CDN 与缓存策略
为不同子域配置不同缓存策略:
- 静态子域(assets)长缓存且使用版本化 URL。
- API 子域短缓存或不缓存,并在边缘做响应缓存(有条件)。
监控、告警与运维自动化
每个子域应该有独立的监控视图与告警规则,便于快速定位问题。推荐:
- 按子域统计 5xx/4xx、延时、流量。
- 结合日志路由到不同索引,以便按子域做审计与追踪。
- 证书到期、DNS 变更也应纳入自动化巡检。
迁移与变更管理(实操步骤)
如果需要从混乱的域名结构迁移到规范结构,大致步骤:
- 制定映射表(旧域 -> 新域),并在表中标注流量比例与依赖。
- 使用 301/302、DNS 切换和反向代理做分阶段迁移(先内测、再灰度、最后全部切换)。
- 监控 SEO 与流量,确保流量无异常后收敛 TTL 与删除旧配置。
常见反模式(别这么做)
- 把所有东西都放在一个子域下,导致无法隔离风险。
- 滥用通配符证书以致无法区分更多安全级别。
- 不给子域命名规范,随意命名导致自动化脚本失效。
实战案例(几个简单的映射表)
| 子域 |
用途 |
证书建议 |
| www.example.com |
对外主站页面、SEO |
独立公信证书 |
| api.example.com |
外部 API 网关 |
自动化 ACME 证书 |
| assets.example.com |
静态资源(CDN) |
通配符或独立证书 |
| staging.api.example.com |
预发布 API 环境 |
自动化短期证书 |
小贴士(容易忽视但很有用的细节)
- 用 DNS CNAME 把子域指向 CDN 或负载均衡器,便于切换。
- GC 或 Lambda 等无服务器环境也要纳入命名规则,别在别处单独管理。
- 文档化每个子域的用途、证书到期时间和负责人。
- 在变更前后做用户流量对比和回滚演练。
结尾随想(像跟同事闲聊那种语气)
设计子域很像整理房间:把常用的东西放在容易拿到的位置,把危险品锁好,剩下的按类别收纳。没有一刀切的“最好方案”,只有“适合你团队、适合业务、能自动化”的方案。按环境-职能-地区的三层规则开始,慢慢细化到证书和监控,那些看起来繁琐的细节其实会在你需要快速回滚、扩容或排查问题时显得特别值钱。就先从把 DNS 和证书流程写进 CI 开始吧,后面你会感谢自己。