CNAME 应该用于子域吗?

Jos*_*ant 88 domain-name-system cname-record

我管理当前具有以下 DNS 配置的多个网站:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - CNAME    - example.com
beta.example.com - CNAME    - test.example.com
dev.example.com  - CNAME    - test.example.com
Run Code Online (Sandbox Code Playgroud)

这是对 CNAME 记录的适当使用吗?我在网上查了一下,没有找到明确的答案。有些人声称 CNAME 记录是错误的(但是他们并不清楚为什么会这样)并提出以下设置:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - A Record - Production Server IP
beta.example.com - A Record - Test Server IP
dev.example.com  - A Record - Test Server IP
Run Code Online (Sandbox Code Playgroud)

其中哪一种是更好的方法(以及为什么)?

注意:子域不需要自己的 MX 记录,因此这不是问题。

Jes*_*r M 92

是的,这是对 CNAME 的适当使用。在我参与的讨论中,争论往往是这样的:

针对 CNAME:

  • 有一个(微小的)性能损失,因为下游 DNS 缓存需要执行 2 次 DNS 查找,一次用于 CNAME,另一次用于 CNAME 指向的 A-Record。
  • 关于 CNAME 具有较少“权威”或兼容性问题的模糊、虚假的论点。

支持 CNAME:

  • 它们在硬件(物理服务器)和服务之间提供了清晰的抽象。
  • 它们简化了 DNS 管理——当服务器移动时,您只需要更改一条记录。

在尝试了几种不同的方法后,我现在有了个人最喜欢的风格。这是:

  • 每个物理服务器一个 A 记录;TTL 相当低(可能是 30 分钟);给服务器一个人性化的名字
  • 每个服务一个 CNAME;具有高 TTL(可能是 24 小时);指向上述服务器名称。
  • 作为上述规则的唯一例外,域根是一个 A 记录,指向网络服务器/网络负载均衡器。(@ 必须是 A 记录。)

我发现这个设置效果很好。它保持对 CNAMES 的额外 DNS 查找;如果服务器崩溃,我仍然可以相当快地更改公共 DNS。

这是BIND 语法中的(即兴的)示例

;name     ttl   class rr     value 
server01  30m   IN    A      192.168.0.3
server02  30m   IN    A      192.168.0.4

webmail   24h   IN    CNAME  server01
extranet  24h   IN    CNAME  server02
ftp       24h   IN    CNAME  server02
Run Code Online (Sandbox Code Playgroud)

  • @不需要有A记录;相反,禁止使用 CNAME。 (4认同)
  • @Marco Demaio:关于“域根 A 记录”:像 `company.com` 这样的二级域是一个区域顶点。它需要一个 SOA 记录。因此它必须是 A 记录而不是 CNAME - 请参阅 http://serverfault.com/questions/170194/why-cant-a-domains-root-be-a-cname (2认同)

Chr*_*s S 13

是的,很合适。

很多人分享的我的最佳实践,就是为每个服务器IP创建1个A记录;并将 CNAMES 用于其他任何事情。

一个常见的例子是:

server1.example.com.      IN A      192.168.0.1
server2.example.com.      IN A      192.168.5.2
www                       IN CNAME  server1
ftp                       IN CNAME  server1
beta                      IN CNAME  server2
Run Code Online (Sandbox Code Playgroud)