![许多域名/网站托管在同一台服务器上,使用 CNAME 替代方案是否可以避免在 DNS 中写入相同的 IP?](https://linux22.com/image/606662/%E8%AE%B8%E5%A4%9A%E5%9F%9F%E5%90%8D%2F%E7%BD%91%E7%AB%99%E6%89%98%E7%AE%A1%E5%9C%A8%E5%90%8C%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%EF%BC%8C%E4%BD%BF%E7%94%A8%20CNAME%20%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E5%9C%A8%20DNS%20%E4%B8%AD%E5%86%99%E5%85%A5%E7%9B%B8%E5%90%8C%E7%9A%84%20IP%EF%BC%9F.png)
我有很多网站(每个网站都有自己的域名),都在同一个 cPanel 托管服务器上(假设服务器 IP 是1.1.1.1
,服务器主域名是myserver.com
)
所有这些域名都使用第三方 DNS(不是 cPanel 托管的),我将每个域的 DNS 设置为指向服务器 IP。每个域 DNS 当前设置的示例:
domainx.com -> A -> 1.1.1.1
domainx.com -> MX -> mail.domainx.com
mail.domainx.com -> A -> 1.1.1.1
www.domainx.com -> CNAME -> domainx.com
ftp.domainx.com -> CNAME -> domainx.com
这种情况迫使我为每个域名重复数百次服务器 IP 1.1.1.1
。如果服务器 IP 发生变化,我将不得不检查每个域名的 DNS,用新 IP 更新记录。
所以我想为什么不使用 CNAME 来避免到处重写服务器 IP?!我可以像下面这样设置每个域的 DNS:
domainx.com -> CNAME -> myserver.com
domainx.com -> MX -> mail.myserver.com
mail.domainx.com -> CNAME -> myserver.com
www.domainx.com -> CNAME -> myserver.com
ftp.domainx.com -> CNAME -> myserver.com
但我读到那domainx.com -> CNAME -> myserver.com
是邪恶的,明白了吗这和这。
但是我有什么其他方法可以避免到处重写服务器 IP?
答案1
但我读到 domainx.com -> CNAME -> myserver.com 是邪恶的
CNAME 并不邪恶。但是,将 CNAME 用于二级域名会破坏这些域名的 DNS。您不能在与 CNAME 记录相同的级别添加 MX、TXT 或任何其他记录。从rfc1912:
CNAME 记录不允许与任何其他数据共存。换句话说
,如果 suzy.podunk.xx 是 sue.podunk.xx 的别名,您
就不能同时拥有 suzy.podunk.edu 的 MX 记录、A 记录,甚至
TXT 记录。尤其是不要尝试将 CNAME 和 NS
记录合并在一起
从技术上讲,这可能有效,但将 CNAMES 与其他记录混合可能会混淆其他 DNS 服务器,这将导致奇怪的故障并带来管理上的麻烦。
答案2
尽管域名的 CNAME 很邪恶,但存在一个鲜为人知的 DNAME,它可以做几乎完全符合您的要求(并且它的目的就是如此)。它还允许覆盖子域中的某些条目(例如 spf 文本记录等...,如果您需要的话) - 请参阅此问题我的回答就是一个例子。
答案3
为什么不在 BIND 中使用单个区域文件?
您创建一个名为 的区域文件virtual_hosts
,并将 A 记录、MX 记录等放入其中。然后在文件中将named.conf
每个“简单”域指向同一个区域文件。
zone "domainx.com" IN {
type master;
file "virtual_hosts";
allow-update { none; };
};
zone "domainy.com" IN {
type master;
file "virtual_hosts";
allow-update { none; };
};
zone "domainz.com" IN {
type master;
file "virtual_hosts";
allow-update { none; };
};
答案4
对指向同一 IP 的记录使用通配符 (*)
例如 test.com 就是您的域名:
$ORIGIN test.com.
* A 1.1.1.1
在这种情况下,每个子域名都会有 A 记录 1.1.1.1,包括 www