如何使用指令使用 EC2 实例、ELB 和 CloudFront 托管多个站点?

如何使用指令使用 EC2 实例、ELB 和 CloudFront 托管多个站点?

这几天我一直在为此苦苦挣扎,不知所措。事情是这样的。

我在 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 日志是否存在任何问题。(如果我处于您的位置,我会从检查日志开始,这是一种可以提高您的专业知识的做法)

相关内容