如何在单个 AWS EC2 实例上托管多个域和子域

Posted

技术标签:

【中文标题】如何在单个 AWS EC2 实例上托管多个域和子域【英文标题】:How to host multiple domains and subdomains on single AWS EC2 instance 【发布时间】:2016-11-21 06:51:20 【问题描述】:

我正在尝试在 AWS 中设置 2 个域(domain1.com 和 domain2.com)和几个子域(app.domain1.com),并在单个实例(Amazon Linux、phpmysql)上运行它们。

我在 AWS Route53 中设置了 3 个托管区域,配置如下。

托管区域 1: domain1.com A型 52.108.XX.YY

托管区域 2 domain2.com A型 52.108.XX.YY

托管区 3 app.domain1.com A型 52.108.XX.YY

另外,我在 VirtualHost 标签中的 http.conf 文件中添加了以下代码。

<VirtualHost *:80>   
     ServerName domain1.com   
     DocumentRoot "/var/www/html/domain1"   
     ErrorLog "logs/domain1-error_log"  
     CustomLog "logs/domain1-access_log" common  
     </VirtualHost>
     
     <VirtualHost *:80>   
     ServerName domain2.com   
     DocumentRoot "/var/www/html/domain2"  
     ErrorLog "logs/domain2-error_log"  
     CustomLog "logs/domain2-access_log" common  
     </VirtualHost>
     
     <VirtualHost *:80>  
     ServerName app.domain1.com   
     DocumentRoot "/var/www/html/app"  
     ErrorLog "logs/app.domain1-error_log"  
     CustomLog "logs/app.domain1-access_log" common  
     </VirtualHost>

但是,只有 domain1.com 和 domain2.com 得到解决。当我访问 app.domain1.com 时,它给了我一个“找不到服务器”的错误。请帮助如何设置子域 - 托管区域设置或 httpd.conf 是否有问题?

【问题讨论】:

您确定您的 app.domain1.com 解析为 52.108.XX.YY 尝试再次 ping。 能否提供三个域以便我检查问题? 你是对的,它没有解析到正确的 IP 地址。您认为我必须在 Dreamhost(注册商)上添加子域并为其提供 Hosted Zone 3 的 NS 吗? pradyotghate.com dev.pradyotghate.com 这就是为什么它没有解决添加 A 记录到 app.domain1.com 以指向 52.108.XX.YY 并且它将开始工作您的配置是正确的。您没有为此更改任何 NS。只需添加一个子域。 【参考方案1】:

好的,经过大约 2 小时的阅读各种网站和修改后,我准备好了。以下是如何执行此操作。

基本上,每个域名的托管区域 (HZ) 不应超过 1 个,否则情况会很糟糕。如果您的域名超过 1 个 HZ,请删除为子域创建的一个。

每个 HZ 将有 4 条记录 -

默认创建以下两条记录。不要编辑/删除它们。NS - 这是名称服务器记录。如果 AWS Route53 不是您的注册商,请使用 ns-servernumber.awsdns-number.com. 和其他三个(共 4 个)记录来更改您的注册商的名称服务器。SOA - 保留此记录。不要碰这个。

创建以下两个记录集(蓝色按钮)。A - 将 Name 留空。 类型选择A-IPv4 address。在 Value 中输入您的 Elastic Load Balancer 或 EC2 实例的 IP 地址。CNAME - 在 name 中添加 *(星号/通配符) > 场。从 Type 的下拉列表中选择 CNAMEValue 中输入域名。

现在创建http.conf 文件并像我在问题中那样构建虚拟主机。

现在应该可以了 :)

【讨论】:

【参考方案2】:

这可以通过在 AWS-EC2 实例上安装 Apache HTTP Server 并按照建议为每个 DNS 或 Sub-DNS 配置 VirtualHost 来完成Amazonian

为简洁起见,请阅读此thread 讨论、此官方example 和techrepublic post。


希望这有帮助!

【讨论】:

【参考方案3】:

您可以按照此链接上的教程进行操作:http://brianshim.com/webtricks/host-multiple-sites-amazon-ec2/

根据链接,一个常见的错误是:

成功了吗?如果不是,这是一个可能的原因。可能有 另一个配置文件干扰这个。检查 /etc/httpd/conf.d 中的另一个 .conf 文件。通常你的主要 httpd.conf 将在此目录中包含另一个 .conf 文件。制作 确保它没有一些干扰的虚拟主机设置 和你的。

设置好配置后,你应该运行:

sudo service httpd restart

【讨论】:

感谢分享文章。阅读。但这似乎是 Route 53 之前的文章。它规定直接将域指向 IP 地址,这不是 AWS 推荐的做法,因为它在未来无法通过 Elastic Load Balancer 进行扩展。需要有关使用 Route 53 管理 NS 进行这项工作的指导。 没有其他虚拟主机设置文件。是否重启了 Apache。 @PradyotGhate 在您的问题中,您说您正在 Route53 中设置 A 记录以直接指向 IP 地址。所以这里使用 Route53 与使用任何其他 DNS 服务没有区别。您对 Route53 的评论“未来可通过弹性负载均衡器进行扩展”似乎与讨论无关。是的,您将来可以使用 Route53 别名将根域指向 ELB,但现在您只是使用 A 记录,就像在链接文章中引用的任何其他 DNS 服务(如 Godaddy)上一样。 正确,今天不相关。但我想保持该选项(添加 ELB 并将类型 A 指向 EBL 而不是 EC2 实例)打开。这就是为什么使用 Route53 而不是直接将域名解析为 IP 地址的原因。如果我没有正确考虑这个问题,请告诉我。

以上是关于如何在单个 AWS EC2 实例上托管多个域和子域的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 上托管多个网站 - Amazon Linux EC2

Route53 中的域将根指向外部主机,在 AWS 中保留子域

如何为 AWS EC2 上托管的 Parse 服务器获取 APP_ID 和 CLIENT_KEY

单个 Pyramid 实例上的多个域和子域

AWS Elastic Beanstalk 使用 Django 在部署的 EC2 服务器上托管 PostgreSQL

在 ec2 上托管的 apache spark 中使用 AWS EMRFS