将子域与 Amazon EC2 公有 DNS 地址一起使用?

Posted

技术标签:

【中文标题】将子域与 Amazon EC2 公有 DNS 地址一起使用?【英文标题】:Use Subdomain with Amazon EC2 Public DNS Address? 【发布时间】:2014-01-15 08:20:13 【问题描述】:

我正在尝试对依赖于客户端子域的遗留应用程序进行一些测试。所以在实际应用中,你可以去:

clienta.domain.com

它会为客户 A 打开一个特定的区域。

对于 EC2,我试图让应用程序仅使用类似于此的公共 DNS 地址工作:

ec2-123-123-123-123.compute-1.amazonaws.com

问题是,设置我的虚拟主机 (like this post) 可以正常用于主公共 DNS 地址,但不适用于子域。

clienta.ec2-123-123-123-123.compute-1.amazonaws.com => 不工作

我想这是因为还必须创建 DNS CNAME 记录?我显然不拥有 amazonaws.com,所以没有能力这样做。

这是虚拟主机设置:

NameVirtualHost *:80

# Primary domain
<VirtualHost *:80>
    DocumentRoot "/var/www/vhosts/myapp"
    ServerName ec2-123-123-123-123.compute-1.amazonaws.com
    <Directory "/var/www/vhosts/myapp">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride All
            Order allow,deny
            Allow from all
    </Directory>
</VirtualHost>

# Wildcard Sub Domains
<VirtualHost *:80>
    DocumentRoot "/var/www/vhosts/myapp"
    ServerName clients.ec2-123-123-123-123.compute-1.amazonaws.com
    ServerAlias *.ec2-123-123-123-123.compute-1.amazonaws.com
    <Directory "/var/www/vhosts/myapp">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride All
            Order allow,deny
            Allow from all
    </Directory>

TL;DR; 在不弄乱 DNS 的情况下,有没有一种简单的方法可以

注意:我试图避免将记录添加到我们的 DNS 中,这些记录只会在短时间内使用。

更新

如果我必须使用自己的域,我该如何处理两个子域?例如,如果我创建 staging.mydomain.com 以指向 EC2 实例,那么现在我将如何访问 clienta.staging.mydomain.com

【问题讨论】:

更新了我的答案以回答您的更新问题。 【参考方案1】:

您为什么不使用自己的域名?大多数基于 EC2 的 Web 服务不使用 EC2 公共 DNS,因为公共 DNS 可能会发生变化。

您可能想要调查的是使用弹性 IP,以便为您的实例提供可以配置 DNS 的稳定 IP 地址,然后将这些弹性 IP 附加到您的 EC2 实例。

这是关于弹性 IP 的 AWS 文档:http://aws.amazon.com/articles/1346

当然,如果您计划使用负载均衡配置,那么您实际上会使用 Elastic Load Balancer 而不是 Elastic IP。在此配置中,您的 DNS 将定向到 ELB。

这里是有关 Elastic Load Balancing 的信息:http://aws.amazon.com/elasticloadbalancing/

【讨论】:

这个设置实际上是为了测试几个小时而设计的,然后就放弃了。在我自己的域的注释上,我尝试创建一个“staging.mydomain.com”并指向它,但后来我遇到了如何拥有 2 个子域的问题,如“client1.staging.mydomain.com”? @cilosis 使用弹性 IP。您可以在启动实例时附加它们,当实例停止时它们将自动分离。在您的示例中,staging.mydomain.comclient1.staging.mydomain.com 都需要 DNS,因为它们是两个独立的、不相关的子域。 弹性 IP 不是免费的。【参考方案2】:

需要使用自己的 DNS 才能使用子域。 AWS 的 DNS 在其动态分配的 DNS 上没有通配符记录。

你可以试试:

dig clients.ec2-123-123-123-123.compute-1.amazonaws.com,您将收到 0 个答案。

至于:

如果我必须使用自己的域,我该如何处理两个子域?例如,如果我创建 staging.mydomain.com 以指向 EC2 实例,那么现在我将如何访问 clienta.staging.mydomain.com?

同样,您需要一个 DNS 记录 clienta.staging.mydomain.com 指向主机的 IP 地址,然后让 Apache 或任何服务器将这些请求引导到正确的虚拟主机。但是你的clienta.staging.mydomain.com 请求永远不会知道去哪里,除非有明确的 dns 条目。一些 DNS 服务提供基于通配符的通用 DNS 条目(即*.clients.blah.com),因此如果您的 DNS 提供商支持,这可能是一个选项。

另一个建议是使用目录而不是子域。因此,与其创建新的子域,不如使用clients.domain.com DNS 条目,然后拥有clients.domain.com/clientaclients.domain.com/clientb

【讨论】:

【参考方案3】:

您可以使用其他通配符 DNS 服务,例如 nip.io

clienta.ec2-123-123-123-123.nip.io

使用host 命令查看:

$ host ec2-123-123-123-123.nip.io
ec2-123-123-123-123.nip.io has address 123.123.123.123

$ host clienta.ec2-123-123-123-123.nip.io
clienta.ec2-123-123-123-123.nip.io has address 123.123.123.123

【讨论】:

以上是关于将子域与 Amazon EC2 公有 DNS 地址一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 NodeJS 服务器端口重定向到子域或文件夹(amazon ec2)

如何在 Amazon EC2 上创建子域?

AWS VPC 实例不解析公有 DNS 名称

将多个子域映射到同一个 Amazon S3 存储桶

从 JAVA API 获取 Amazon EC2 实例的公共 DNS

Amazon RDS 终端节点内部