![如何使用指令使用 EC2 实例、ELB 和 CloudFront 托管多个站点?](https://linux22.com/image/789691/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E4%BD%BF%E7%94%A8%20EC2%20%E5%AE%9E%E4%BE%8B%E3%80%81ELB%20%E5%92%8C%20CloudFront%20%E6%89%98%E7%AE%A1%E5%A4%9A%E4%B8%AA%E7%AB%99%E7%82%B9%EF%BC%9F.png)
这几天我一直在为此苦苦挣扎,不知所措。事情是这样的。
我在 ELB 和 CloudFront 发行版后面有一个 EC2 实例 (Amazon Linux 2023),我想使用该VirtualHost
指令托管两个(或最终更多)子域。但是,无论我做什么,任何请求(无论子域是什么)始终都会直接转到默认文档根目录 ( /var/www/html
)。
我在类似设置中找到的所有信息都始终注意将 Route 53 设置为服务器的公共 IP 地址,但我再次尝试通过 CloudFront/an ELB 执行此操作。我不想为我的实例使用公共 IP 地址;我想使用我挑选的常规子域。
这是我的设置:
- Route 53 作为
A
两个子域的记录,均指向 CloudFront 分发 URL - CloudFront 指向我的 ELB
- ELB 有规则将
firstsd.mysite.com
或发送secondsd.mysite.com
到相关的 EC2 实例 mysite.com
我已经为域设置了安全证书
我尝试过多种不同的方法。
首先,我尝试VirtualHost
在一系列不同的配置中直接将指令添加到 httpd.conf。我尝试将 VirtualHost 块保持简单,如下所示:
<VirtualHost *:80>
ServerName firstsd.mysite.com
DocumentRoot "/var/www/html/firstsd"
</VirtualHost *:80>
<VirtualHost *:80>
ServerName secondsd.mysite.com
DocumentRoot "/var/www/html/secondsd"
</VirtualHost>
当这不起作用时,我尝试将其修改为:
<VirtualHost *:80>
ServerName firstsd.mysite.com
DocumentRoot "/var/www/html/firstsd"
<Directory "/var/www/html/firstsd">
DirectoryIndex index.html index.php
Require all granted
AllowOverride all
Options Indexes FollowSymLinks
</Directory>
</VirtualHost *:80>
<VirtualHost *:80>
ServerName secondsd.mysite.com
DocumentRoot "var/www/html/secondsd"
<Directory "/var/www/html/secondsd">
DirectoryIndex index.html index.php
Require all granted
AllowOverride all
Options Indexes FollowSymLinks
</Directory>
</VirtualHost>
我也尝试了上述操作,将其更改为*:80
并*:443
复制以覆盖两个都 *:80
和*:443
。
我接下来尝试的是按照指南创建新的 .conf 文件位于此处。我仍然得到了相同的结果:我最终进入了服务器的默认主目录。
最后,我尝试为每个子域创建一个全新的 CloudFront 分发,并将/firstsd
和/secondsd
添加到源路径选项。我没有访问默认目录,而是收到了 403 错误(诚然,这在某种程度上感觉像是一个进步)。
任何帮助都将不胜感激。谢谢!
答案1
确保您的 Route 53 记录已正确设置为指向您的 CloudFront 分配。确认 CloudFront 分配已正确配置以将请求转发到 ELB。您的 Apache VirtualHost 配置应同时包含两个子域的 *:80 和 *:443。您可以使用以下模板。
<VirtualHost *:80>
ServerName firstsd.mysite.com
DocumentRoot "/var/www/html/firstsd"
# Additional configuration for the first subdomain
</VirtualHost>
<VirtualHost *:80>
ServerName secondsd.mysite.com
DocumentRoot "/var/www/html/secondsd"
# Additional configuration for the second subdomain
</VirtualHost>
<VirtualHost *:443>
ServerName firstsd.mysite.com
DocumentRoot "/var/www/html/firstsd"
# Additional configuration for the first subdomain over HTTPS
</VirtualHost>
<VirtualHost *:443>
ServerName secondsd.mysite.com
DocumentRoot "/var/www/html/secondsd"
# Additional configuration for the second subdomain over HTTPS
</VirtualHost>
检查 ELB 和 EC2 实例上的安全组,确保它们允许端口 80 和 443 上的流量。此外,请确保 EC2 实例的防火墙未阻止传入流量。
确保您的 SSL 证书与 CloudFront 分发正确关联。(对于初学者来说,这可能相当具有挑战性,我自己也曾多次陷入其中)
最后,如果问题仍然存在,请检查 Apache 错误日志(/var/log/httpd/error_log)和访问日志(/var/log/httpd/access_log)是否存在任何错误或意外行为。此外,请检查 CloudFront 和 ELB 日志是否存在任何问题。(如果我处于您的位置,我会从检查日志开始,这是一种可以提高您的专业知识的做法)