当你输入 google.com,浏览器怎么知道要去哪个 IP 地址?这就是 DNS(Domain Name System)做的事——把人类可读的域名翻译成机器可用的 IP 地址。
如果互联网是座城市:
mysaas.com)mysaas.com 翻译成 104.21.35.186)这是新手最容易混淆的点:
从浏览器输入 URL 到页面加载,DNS 经历了什么?
dscacheutil -flushcache).com 的 TLD 服务器地址(全球 13 组)example.com 的权威 DNS 服务器地址| 缓存层 | 典型 TTL | 控制方 | 清除方式 |
|---|---|---|---|
| 浏览器 | 跟随 DNS TTL | 浏览器 | 清除浏览器缓存 / 隐身模式 |
| 操作系统 | 跟随 DNS TTL | OS | ipconfig /flushdns / dscacheutil -flushcache |
| 递归解析器 | 跟随 DNS TTL | ISP / 1.1.1.1 | 等 TTL 过期 / 部分支持刷新 |
| 权威 DNS | N/A(源头) | 你自己 | 修改记录即生效 |
DNS 记录是域名系统的"数据行",每条记录告诉世界一个关于你域名的事实。
将域名指向一个 IPv4 地址。最基础、最常用的记录。
# 使用 dig 查询
dig A example.com +short
# 104.21.35.186
# 使用 nslookup
nslookup -type=A example.com
和 A 记录一样,但指向 IPv6 地址。双栈部署时同时配置 A + AAAA。
将一个域名指向另一个域名。常用于子域名指向 CDN / SaaS 平台。
example.com 不能直接 CNAME(RFC 规范不允许根域名与 MX/NS 等记录共存)。解决方案:用 A 记录指向,或使用 Cloudflare 的 CNAME Flattening。指定接收该域名邮件的邮件服务器。优先级数值越小越优先。
存储任意文本信息。用途广泛:域名验证、SPF/DKIM/DMARC、安全认证。
指定哪些 DNS 服务器负责解析该域名。在注册商处配置,指向你的 DNS 托管商。
服务定位记录,指定特定服务的服务器和端口。
格式:优先级 权重 端口 目标主机
证书授权记录,指定哪些 CA 可以为你的域名签发 SSL 证书。防止未授权签发。
反向 DNS 记录,IP → 域名。主要用于邮件服务器信誉(防垃圾邮件)。
起始授权记录,定义域名的管理信息(主NS、管理员邮箱、序列号、刷新间隔)。由 DNS 托管商自动生成。
域名注册商是你"买域名"的地方。选择标准:价格透明度、续费价格、域名转移政策、隐私保护。
| 注册商 | .com 注册价 | .com 续费价 | WHOIS 隐私 | DNS 托管 | 特点 |
|---|---|---|---|---|---|
| Cloudflare Registrar | ~$9.77 | ~$9.77 | ✅ 免费 | ✅ 内置 | 推荐 批发价无加价,与 DNS/CDN 一体 |
| Namecheap | ~$5.98 | ~$13.98 | ✅ 免费 | ✅ 内置 | 首年便宜,续费贵,界面友好 |
| Porkbun | ~$5.99 | ~$10.99 | ✅ 免费 | ✅ 内置 | 价格透明,续费合理,UI 简洁 |
| Google Domains | 已出售给 Squarespace,不推荐新用户 | ||||
| GoDaddy | ~$2.99 | ~$21.99 | ❌ 付费 | ✅ 内置 | 避坑 首年超低,续费极高,Upsell 严重 |
| 阿里云(万网) | ¥55 | ¥69 | ❌ 付费 | ✅ 内置 | 国内备案必备,.cn 域名首选 |
| 腾讯云 DNSPod | ¥55 | ¥69 | ❌ 付费 | ✅ 内置 | 国内解析速度快,API 强大 |
.com — 首选,认知度最高.io — 开发者/科技圈流行,价格贵.dev — Google 管理,强制 HTTPS.app — 同 .dev,强制 HTTPS.ai — AI 产品标配,$70+/年.co — startup 常用,易和 .com 混淆DNS 托管商决定你的解析速度、可用性和安全防护能力。
| 特性 | Cloudflare | AWS Route 53 | DNSimple | 腾讯云 DNSPod | NS1 (IBM) |
|---|---|---|---|---|---|
| 全球解析点 | 300+ | 60+ | 30+ | 50+(国内密集) | 30+ |
| 免费计划 | ✅ 无限查询 | ❌ 按查询计费 | ❌ 最低 $8/月 | ✅ 有限免费 | ❌ 企业定价 |
| 解析速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐(国内) | ⭐⭐⭐⭐ |
| DDoS 防护 | ✅ 免费 | ✅ Shield Advanced(付费) | ❌ | ✅ 基础 | ✅ |
| DNSSEC | ✅ 一键启用 | ✅ 需手动配置 | ✅ 一键启用 | ✅ 支持 | ✅ |
| CNAME Flattening | ✅ 免费计划 | ❌ | ✅ | ❌ | ✅ |
| API 质量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Terraform Provider | ✅ 官方 | ✅ 官方 | ✅ 官方 | ✅ 社区 | ✅ 官方 |
| 价格 | 免费 / $20/月(Pro) | $0.50/区域 + $0.40/百万查询 | $8-250/月 | 免费 / ¥99/月(专业) | 联系销售 |
| 适用场景 | 首选 大多数 SaaS | AWS 生态深度用户 | 简单易用、开发者友好 | 国内业务首选 | 流量调度/智能路由 |
# Cloudflare DNS API 示例 — 创建 A 记录
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" \
-H "Authorization: Bearer {api_token}" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "app.mysaas.com",
"content": "104.21.35.186",
"ttl": 300,
"proxied": true
}'
# 查询现有记录
curl "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" \
-H "Authorization: Bearer {api_token}"
# Terraform — Route 53 托管区域 + A 记录
resource "aws_route53_zone" "main" {
name = "mysaas.com"
}
resource "aws_route53_record" "app" {
zone_id = aws_route53_zone.main.zone_id
name = "app.mysaas.com"
type = "A"
ttl = 300
records = ["104.21.35.186"]
}
# Alias 到 ALB(推荐,不收费)
resource "aws_route53_record" "app_alias" {
zone_id = aws_route53_zone.main.zone_id
name = "app.mysaas.com"
type = "A"
alias {
name = aws_lb.app.dns_name
zone_id = aws_lb.app.zone_id
evaluate_target_health = true
}
}
CDN(Content Delivery Network)将你的内容缓存到全球边缘节点,用户从最近的节点获取数据,大幅降低延迟。
| CDN | 免费额度 | 全球节点 | 国内节点 | 特点 | 适合 |
|---|---|---|---|---|---|
| Cloudflare | 无限流量(有速率限制) | 300+ | ❌ 无 | DNS+CDN+WAF 一体,免费计划慷慨 | 首选 海外 SaaS |
| Vercel | 100GB/月 | 100+ | ❌ 无 | 与 Next.js 深度集成 | Next.js 项目 |
| jsDelivr | 无限(开源库专用) | 1500+ | ✅ 有 | npm/GitHub 开源资源 CDN | 开源库分发 |
| AWS CloudFront | 1TB/月(首年) | 400+ | ❌ 无 | 与 S3/Lambda 深度集成 | AWS 生态用户 |
| 又拍云 | 有免费计划 | 500+(国内密集) | ✅ 密集 | 国内老牌 CDN,价格低 | 国内业务 |
| 阿里云 CDN | 按量付费 | 2800+(国内密集) | ✅ 密集 | 国内节点最多,ICP 备案后可用 | 国内大型业务 |
# Cloudflare Page Rules — 缓存策略示例
# 静态资源:强缓存
# URL: *mysaas.com/_next/static/*
# Cache Level: Cache Everything
# Edge Cache TTL: 1 month
# Browser Cache TTL: 1 year
# API 接口:不缓存
# URL: *mysaas.com/api/*
# Cache Level: Bypass
# HTML 页面:短时缓存
# URL: *mysaas.com/*
# Cache Level: Cache Everything
# Edge Cache TTL: 4 hours
# Nginx 配置 — 源站设置缓存头
location /_next/static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location /api/ {
add_header Cache-Control "no-store, no-cache, must-revalidate";
add_header Pragma "no-cache";
}
location / {
expires 4h;
add_header Cache-Control "public, s-maxage=14400";
}
# Cloudflare API — 清除缓存
# 清除所有
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
# 按文件清除
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
--data '{"files":["https://mysaas.com/index.html"]}'}
# 按 Tag 清除(需 Pro 计划)
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
--data '{"tags":["product-123"]}'
HTTPS 不再是可选——Google 将 HTTPS 作为排名因素,Chrome 对 HTTP 页面标记"不安全"。
| 类型 | 验证方式 | 签发时间 | 价格 | 适用场景 |
|---|---|---|---|---|
| DV(Domain Validation) | 自动(DNS/文件验证) | 几分钟 | 免费(Let's Encrypt) | 首选 99% 的 SaaS |
| OV(Organization Validation) | 人工验证组织信息 | 1-3 天 | $100-400/年 | 金融、政府,需要显示公司名 |
| EV(Extended Validation) | 严格人工验证 | 3-7 天 | $200-800/年 | 高安全要求,浏览器地址栏显示公司名(已逐渐淡出) |
# 安装 Certbot
apt install certbot python3-certbot-nginx
# 首次获取证书(Nginx 插件自动配置)
certbot --nginx -d mysaas.com -d www.mysaas.com
# DNS 验证(适用于无公网访问的内部服务)
certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d mysaas.com -d '*.mysaas.com'
# 通配符证书
certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
-d '*.mysaas.com' -d 'mysaas.com'
# 自动续期(Certbot 自动添加 cron)
certbot renew --dry-run # 测试续期流程
# 查看证书信息
certbot certificates
# /etc/nginx/sites-enabled/mysaas.com
server {
listen 443 ssl http2;
server_name mysaas.com www.mysaas.com;
# 证书路径(Certbot 自动管理)
ssl_certificate /etc/letsencrypt/live/mysaas.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysaas.com/privkey.pem;
# SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS(慎用!先短时间测试)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
# 会话复用
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTP → HTTPS 重定向
server {
listen 80;
server_name mysaas.com www.mysaas.com;
return 301 https://$host$request_uri;
}
| 模式 | 用户→CF | CF→源站 | 安全性 | 适用场景 |
|---|---|---|---|---|
| Off | HTTP | HTTP | ❌ 无加密 | 仅开发/测试 |
| Flexible | HTTPS | HTTP | ⚠️ 半程加密 | 不推荐 源站无证书时 |
| Full | HTTPS | HTTPS | ✅ 加密但不验证 | 自签证书可用 |
| Full (Strict) | HTTPS | HTTPS + 验证证书 | ✅ 端到端安全 | 推荐 生产环境 |
DNSSEC 通过数字签名确保 DNS 响应的完整性和真实性,防止 DNS 缓存投毒和劫持攻击。
| 操作 | Cloudflare | Route 53 | DNSPod |
|---|---|---|---|
| 启用方式 | 一键启用 + 复制 DS 到注册商 | 手动配置 KSK + DS | 控制台一键 |
| 密钥轮换 | 自动 | 手动 | 手动 |
| 多签名者 DNSSEC | ✅ 支持 | ❌ | ❌ |
SaaS 产品必须配置邮件 DNS,否则发出的邮件会被当成垃圾邮件。三个核心记录:
声明哪些服务器可以代表你的域名发送邮件。
# SPF 记录(TXT 类型)
# 允许 Google Workspace 发送
"v=spf1 include:_spf.google.com ~all"
# 允许 SendGrid + 自己的服务器
"v=spf1 ip4:1.2.3.4 include:sendgrid.net ~all"
# 多个服务
"v=spf1 include:_spf.google.com include:sendgrid.net include:mailgun.org ~all"
# 修饰符说明:
# +all → 允许所有(❌ 危险!)
# ~all → 软拒绝(可疑但不丢弃,推荐入门)
# -all → 硬拒绝(严格,推荐生产)
# ?all → 中立(等于没有 SPF)
include 每个算一次,超过 10 次会导致 SPF 验证失败(PermError)。用 ip4/ip6 直接指定 IP 更高效。用加密签名验证邮件内容确实来自你,且未被篡改。
# DKIM 记录示例(SendGrid)
# 名称:s1._domainkey.mysaas.com
# 类型:TXT
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
# Google Workspace DKIM
# 名称:google._domainkey.mysaas.com
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
# 多个 DKIM 选择器(不同邮件服务商用不同前缀)
# s1._domainkey → SendGrid
# google._domainkey → Google Workspace
# mailgun._domainkey → Mailgun
告诉接收方:如果 SPF/DKIM 都没过,怎么处理。同时提供报告机制。
# DMARC 记录
# 名称:_dmarc.mysaas.com
# 类型:TXT
# 阶段 1:监控模式(只收报告,不拒绝)
"v=DMARC1; p=none; rua=mailto:dmarc@mysaas.com; ruf=mailto:dmarc@mysaas.com; pct=100"
# 阶段 2:隔离模式(可疑邮件进垃圾箱)
"v=DMARC1; p=quarantine; rua=mailto:dmarc@mysaas.com; pct=50"
# 阶段 3:拒绝模式(不合格邮件直接拒绝)
"v=DMARC1; p=reject; rua=mailto:dmarc@mysaas.com; pct=100"
# 参数说明:
# p=none|quarantine|reject — 策略
# rua= — 聚合报告接收地址
# ruf= — 法证报告接收地址
# pct= — 应用策略的百分比(逐步推进用)
~all)+ DKIMp=none,开始收集报告-all,DMARC 改为 p=quarantine; pct=25p=reject,邮件安全完成 🎉SaaS 产品的域名架构不是"一个域名打天下",而是精心设计的层级系统。
# 主站
mysaas.com → 营销主页 / Landing Page
www.mysaas.com → 301 重定向到 mysaas.com
# 应用
app.mysaas.com → 主应用(前端 + API)
api.mysaas.com → API 网关(独立域名方便 CORS + 限流)
# 文档
docs.mysaas.com → 文档站(Mintlify / Docusaurus)
status.mysaas.com → 服务状态页(Betteruptime / Instatus)
# 基础设施
cdn.mysaas.com → CDN 源站(如需自定义域名)
ws.mysaas.com → WebSocket 服务
admin.mysaas.com → 管理后台(IP 白名单)
# 邮件
mail.mysaas.com → 邮件服务器(PTR 反向解析用)
# 多租户(自定义域名)
tenant.com → CNAME → app.mysaas.com(SaaS 提供自定义域名)
# 内部
staging.mysaas.com → 预发布环境
dev.mysaas.com → 开发环境
SaaS 产品让客户绑定自己的域名是核心功能。实现步骤:
# 客户侧配置(你提供给客户的说明)
# 1. 客户在自己的 DNS 添加 CNAME:
app.customer.com → CNAME → cname.mysaas.com
# 2. 你这边需要:
# - 自动签发 SSL 证书(Let's Encrypt / Cloudflare)
# - 在反向代理中识别 Host 头
# - 查询数据库匹配域名 → 租户
# Nginx 配置 — 通配符 Server Name
server {
listen 443 ssl http2;
server_name ~^(?.+)\.mysaas\.com$ app.*.com;
# SSL 证书(SNI)
ssl_certificate /etc/letsencrypt/live/$host/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$host/privkey.pem;
location / {
# 查询租户信息
set $tenant_id "";
access_by_lua_block {
local host = ngx.var.host
local tenant = ngx.shared.tenants:get(host)
if tenant then
ngx.var.tenant_id = tenant
else
ngx.exit(404)
end
}
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Tenant-ID $tenant_id;
}
}
# 自动签发证书的脚本思路
# 1. 客户添加 CNAME 后,你验证 CNAME 指向你的服务
# 2. 调用 Let's Encrypt DNS-01 验证签发证书
# 3. 证书自动安装到 Nginx/Caddy
# 4. 定时续期
*.mysaas.coma.b.mysaas.com)更换 DNS 托管商或迁移服务器时,零停机是目标。
# 零停机迁移 DNS 托管商
# === 第 1 步:准备(提前 48 小时) ===
# 1. 在新 DNS 托管商创建所有记录(镜像旧记录)
# 2. 验证新记录正确性
dig @new-nameserver.example.com mysaas.com A
# === 第 2 步:降低 TTL(提前 24 小时) ===
# 在旧 DNS 托管商,把所有记录的 TTL 降到 300 秒
# 等待旧 TTL 过期(最长 24-48 小时)
# === 第 3 步:切换 NS 记录 ===
# 在域名注册商处,修改 NS 记录指向新托管商
# 旧:ns1.old-dns.com, ns2.old-dns.com
# 新:ns1.cloudflare.com, ns2.cloudflare.com
# === 第 4 步:双活期(72 小时) ===
# 保持旧 DNS 托管商的记录不删除
# 全球 NS 缓存逐步更新(最长 48 小时)
# === 第 5 步:验证完成 ===
# 检查全球 DNS 解析是否全部指向新托管商
dig mysaas.com NS +short
# 应该返回新的 NS 记录
# === 第 6 步:清理 ===
# 确认全球切换完成后,删除旧 DNS 托管商的记录
# 恢复 TTL 到正常值(3600)
# 零停机更换源站 IP
# 1. 降低 TTL → 300 秒(提前 24-48h)
# 2. 新服务器部署完毕,验证可用
curl -H "Host: mysaas.com" http://new-ip/
# 3. 修改 A 记录指向新 IP
# 4. 等待 TTL 过期 + 全球缓存更新
# 5. 旧服务器保持运行 48 小时
# 6. 确认无流量后关闭旧服务器
# 7. 恢复 TTL 到 3600
DNS 问题是最令人头疼的——因为缓存无处不在,改了不一定生效。以下是系统排查方法。
# dig — 最强大的 DNS 查询工具
# 基本查询
dig mysaas.com A
dig mysaas.com A +short # 只显示 IP
dig mysaas.com CNAME # 查 CNAME
dig mysaas.com MX # 查邮件
# 指定 DNS 服务器查询
dig @1.1.1.1 mysaas.com A # 用 Cloudflare DNS 查
dig @8.8.8.8 mysaas.com A # 用 Google DNS 查
dig @223.5.5.5 mysaas.com A # 用阿里 DNS 查(国内)
# 追踪解析路径
dig mysaas.com A +trace
# 查 NS 记录
dig mysaas.com NS
# 查 DNSSEC
dig mysaas.com A +dnssec
# nslookup — 简单查询
nslookup mysaas.com
nslookup -type=MX mysaas.com
# host — 最简洁
host mysaas.com
host -t CNAME www.mysaas.com
# whois — 查域名注册信息
whois mysaas.com
# 检查全球 DNS 传播状态
# https://www.whatsmydns.net/
# 在线工具,可查看全球各地区的 DNS 解析结果
| 症状 | 可能原因 | 排查方法 |
|---|---|---|
| 域名无法访问 | NS 未指向正确托管商 | dig example.com NS + whois example.com |
| 修改记录后不生效 | TTL 缓存未过期 | dig @1.1.1.1 example.com A 对比权威服务器结果 |
| 部分地区能访问部分不能 | DNS 传播未完成 / NS 缓存不一致 | whatsmydns.net 检查全球状态 |
| HTTPS 证书错误 | 证书过期 / SNI 不匹配 / CAA 阻止 | openssl s_client -connect example.com:443 -servername example.com |
| 邮件进垃圾箱 | SPF/DKIM/DMARC 未配置或错误 | 发送测试邮件到 mail-tester.com |
| Cloudflare 502 错误 | 源站不可达 / SSL 模式错误 | 检查源站是否运行 + CF SSL 模式是否匹配 |
| 无限重定向循环 | CF Flexible 模式 + 源站 301 | CF SSL 模式改为 Full (Strict) |
| CNAME 不生效 | 根域名不能 CNAME | 改用 A 记录 或 Cloudflare CNAME Flattening |
-all)p=none)在 Agent 深度研究中,DNS 和域名配置是多个项目的关键基础设施:
dns.lookup 缓存);(2) 使用 HTTP/2 连接复用减少 DNS 查询;(3) 关键 API 用 IP 直连 + 定期 DNS 刷新作为 fallback。