使用 apache 为域提供基于 CNAME 的不同服务器吗?

使用 apache 为域提供基于 CNAME 的不同服务器吗?

我在 serverfault 上查找了一些内容,但似乎找不到任何与我的问题相关的内容(可能是因为我不知道要搜索什么)。

无论如何,我的问题是我有 2 个服务器。一个主服务器用于显示我的网站,另一个用于电子邮件,我们还可以在上面查看电子邮件等。(目前只需输入 IP 地址即可)

我希望“mail.domain.com”的子域名重定向到我们的邮件服务器,而“www.domain.com”重定向到显示网站的主服务器。这也是 domain.com 指向的服务器。

我尝试编辑配置文件,并在指向“www.domain.com”的服务器上添加了一个包含以下代码的 vhost.conf 文件。此外,这两个服务器都是 amazon linux ami。

   <VirtualHost domain.com:*>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/html/"
    ServerName domain.com    
    ServerAlias www.domain.com

    <Directory "/var/www/html/">
        ServerSignature Off
        Options Indexes FollowSymLinks IncludesNoExec
        AllowOverride All

        # Insert the following:
        Require all granted

    </Directory>

</VirtualHost>

我的问题是:

可以为另一台服务器提供服务吗?因此附加配置看起来像这样......

   <VirtualHost mail.domain.com:*>
    ServerAdmin [email protected]
    DocumentRoot 128.02.12.12 #ipAddressOfOtherServer
    ServerName domain.com    
    ServerAlias mail.domain.com

</VirtualHost>

答案1

是的,您可以让 www.domain.com 和 mail.domain.com 两个域名在同一个 IP 地址上工作。步骤 1:确保 subdomain1.domain.com 和 subdomain2.domain.com 指向您的服务器 IP。步骤 2:根据您的要求添加虚拟主机条目。

CNAME 信息:

使用 CNAME 的主要优势在于,如果我们更改一个 A 记录的 IP 地址,则指向该主机的任何 CNAME 记录也会更改。DNS 将系统的域名解析为其 IP 地址,但有时多个域名会解析为同一个 IP 地址,这时 CNAME 就派上用场了。一台机器可以拥有无​​限数量的 CNAME 别名,但每个别名都必须在数据库中有单独的 CNAME 记录。

虚拟主机信息:

DocumentRoot /var/www/html ServerName subdomain1.domain.com

DocumentRoot /var/www/html ServerName subdomain2.domain.com https://httpd.apache.org/docs/2.4/vhosts/examples.html

答案2

简短的回答是:

切勿在多个 VirtualHost 块中指定相同的域名。应如下所示:

<VirtualHost *:80>
    ServerName domain.com
    ServerAlias www.domain.com
    DocumentRoot /var/www/domain.com
    ...
</VirtualHost>
<VirtualHost *:80>
    ServerName mail.domain.com
    DocumentRoot /var/www/mail.domain.com
    ...
</VirtualHost>

mail.domain.com 是 CNAME domain.com 这一事实与 Apache 完全无关。您可以将其配置为直接 A 记录,而不是 CNAME。

长答案:

您混淆了域名的两个不同方面。

CNAME 是 DNS 术语。它是告诉请求客户端寻找另一条记录以获取所请求信息的方式,即创建该 DNS 资源记录的别名。它通常用于 A 记录,在这种情况下,您实际上有两个指向同一 IP 地址的名称。这与使用 A 记录代替 CNAME 的效果完全相同。

Apache VirtualHost 是一个 Apache 术语,对于基于名称的虚拟主机,它对应于 HTTP Host 标头。Apache(以及任何其他 Web 服务器)并不关心您如何将主机名解析为 IP 地址。当您向它发送特定的 HTTP 请求时,您已经连接到某个 IP 地址。Web 服务器根本不关心您如何知道该 IP 地址,它是从具有该名称的 DNS A 记录中获取的,还是从指向其他 A 记录的 DNS CNAME 中获取的,还是从本地“hosts”文件中获取的,或者其他什么。

对于 Web 服务器,唯一会考虑您连接的 IP 地址的地方是,如果您设置了基于 IP 的虚拟主机,则使用的服务器 IP 必须与请求的虚拟主机设置为响应的 IP 地址相匹配。(即,VirtualHost IP 和 ServerName 或某个 ServerAlias 必须都匹配,才能选择此 VirtualHost 来处理请求。)如果您在 VirtualHost 指令中使用“*”代替 IP 地址,则它根本不会关心特定的 IP 地址。它只关心您放入 HTTP 请求的 Host 标头中的主机名。它选择一个特定的 VirtualHost,其 ServerName 或 ServerAlias 的值与请求的 Host 标头中的值相同。

另一方面,Web 浏览器也不关心 IP 是如何解析的。它是直接获取的,因为您使用的主机名有 A 记录,还是它是另一个 A 记录的 CNAME,或者甚至根本没有使用 DNS,而是使用本地“hosts”文件解析该主机名 - 这并不重要。系统解析器为提供的主机名返回一些 IP 地址,然后 Web 浏览器连接到该解析的地址并将提供的主机名放入请求主机标头中。

因此,DNS 组织与 Web 服务器配置的内部无关。您不必在配置中反映它。DNS 只是了解服务器 IP 地址的方式,服务器通常只使用主机名,而从不考虑它们在 DNS 中的表示方式。

相关内容