AWS CloudFront 分布在与 Web 服务器相同的域下

Posted

技术标签:

【中文标题】AWS CloudFront 分布在与 Web 服务器相同的域下【英文标题】:AWS CloudFront distributions under same domain as web server 【发布时间】:2013-02-25 04:15:11 【问题描述】:

目前我的网络服务器位于 mydomain.com,两个 CDN 位于 static.mydomain.com 和 media.mydomain.com。

是否可以将所有内容都放在 mydomain.com 下?例如

mydomain.com - 网络服务器

mydomain.com/static - 静态 CDN

mydomain.com/media - 媒体 CDN

【问题讨论】:

【参考方案1】:

此配置应该可以结合使用 Route 53 的别名功能、S3 重定向和 CloudFront 行为。

1 配置具有多个来源和路径匹配行为的 CloudFront 分配

看起来您有三个不同的内容来源,“网络服务器”内容、“静态”内容和“媒体”内容。 CloudFront 应该能够为同一域名后面的每个来源提供内容。要进行此设置,您需要 在您的 CloudFront 分配中配置三个不同的源。 这是创建 CloudFront 分配的指南,我在下面提供了概述: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CreatingDownloadDistributions.html

在创建分发时将“网络服务器”设置为源 创建分发后,导航到分发设置并单击源选项卡 再添加两个来源,一个用于静态,一个用于媒体 点击行为标签 使用 /static/* 的路径模式创建一个新行为,并选择您刚刚创建的“静态”内容来源。重复这些步骤,为 /media/* 路径创建第二个行为,并将此行为指向“媒体”内容源。与这两种补丁模式不匹配的任何内容都将退回到默认行为,并将提供来自您的“网络服务器”来源的内容。

2 配置 CloudFront 以使用您的域名

当您创建 CloudFront 分配时,您会在“cloudfront.net”域下获得一个分配名称。为了让 CloudFront 与您自己的域名结合使用,您需要配置一个 CNAME,将“www.mydomain.com”域指向 CloudFront 分配 DNS 名称。然后,您需要将 CloudFront 分配配置为在看到对 www.mydomain.com 域的请求时做出响应。

文档:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html

编辑您的 CloudFront 分配,并导航到分配详细信息的“常规”选项卡。单击编辑按钮并将“www.mydomain.com”添加到备用名称列表中 在 Route 53 的“mydomain.com”托管区域中,创建一个新的 RRSet 作为 CNAME 类型,将名称设置为 www.mydomain.com,并将值配置为分配给 CloudFront 的“域名”您已经创建的发行版。您可以在分发详细信息的常规选项卡中找到分发“域名”。

此时,当您浏览 www.mydomain.com 时,您将被路由到最近的 CloudFront 边缘站点,并且根据请求的路径,返回的内容将来自三个不同的内容来源之一。但您也希望 'mydomain.com' 的行为方式相同。您可以通过使用 Route 53 别名和 S3 重定向创建 www-lyzer 来实现此目的。

3 使用 Route 53 别名和 S3 重定向在“mydomain.com”的区域顶点创建 www-a-lizer

这篇博文很好地介绍了 Route 53 别名和 S3 重定向,对于这个示例,我们需要在以下步骤中进行一些调整:

http://aws.typepad.com/aws/2012/12/root-domain-website-hosting-for-amazon-s3.html

使用 S3 控制台创建一个名为“mydomain.com”的新 S3 存储桶 配置“mydomain.com”存储桶以将所有请求重定向到“www.mydomain.com”。请注意,因为我们需要重定向到 S3 存储桶以外的东西,所以我们必须使用重定向规则而不是“重定向所有请求”选项。因此,在您的存储桶属性中,单击“启用网站托管”单选按钮。展开“编辑重定向规则”并添加以下规则配置:
<RoutingRules>
    <RoutingRule>
        <Redirect>
            <HostName>www.mydomain.com</HostName>
        </Redirect>
    </RoutingRule>
</RoutingRules>
使用 Route 53 控制台,打开您的“mydomain.com”托管区域并创建一个新的 RRSet,如下所示:

名称:'mydomain.com'

类型:'A'

别名:“是”

在值字段中,您应该会看到刚刚创建的存储桶。选择“mydomain.com”存储桶。

回复评论:

第三步的目标是确保对“mydomain.com”的请求通过 CloudFront 分配进行定向。理想情况下,我们可以按照步骤 2 中的说明使用 CNAME,但是不能在区域顶点使用 CNAME。就目前而言,这意味着我们必须跳过一些障碍。

可以在 S3 中使用扩展的重定向规则,根据路径匹配重定向到不同的来源。这意味着您的所有用户请求都会在重定向到 CDN 或直接到您的源之前到达 S3。这会给每个请求增加一点延迟。要从 CDN 获得最佳性能,您将希望您的用户尽可能直接地连接(最好不要重定向)。上面提出的解决方案基于这样一个事实,即重定向只发生一次(当用户请求“mydomain.com”时),所有后续用户请求都直接转到“www.mydomain.com”。

关于通过 CloudFront 的 POST 和身份验证。 CloudFront 会将 cookie 和查询字符串传回给源,如果它配置为这样做的话。如果您的身份验证系统可以利用这些方法中的任何一种进行令牌传递,您应该能够通过 CloudFront 传递您的身份验证请求。目前,CloudFront 不会将 POST 请求传递到源。如果您使用客户端脚本进行 POST,那么您可以使用不同的 DNS 名称围绕 CloudFront 进行 POST。例如'post.www.mydomain.com'。

【讨论】:

我不太清楚你为什么需要第三步。如果只是为了将 www.mydomain.com 重定向到 mydomain.com,涉及 S3 存储桶似乎是一种肮脏的黑客行为。有没有更好的方法?其次,如果您将您的网站托管在 CloudFront 分配后面作为源服务器,您将如何处理 POST 和身份验证?您可以使用第三步以某种方式将 www.mydomain.com/auth/ 和 www.mydomain.com/post 直接重定向到网络服务器源服务器吗? 我可能在这里遗漏了一些东西,但是如果我们 1) 将分发的来源设置为 www.mydomain.com,然后 2) 设置 DNS/S3 以将 www.mydomain.com 的请求发送到指向云端分发,那么来自分发的请求如何到达真正的源服务器?他们不会只是走出发行版的后门,然后回到前门吗? @wade - 最后,mydomain.com/static/file1.jpg 仍将路由到 static.mydomain.com/STATIC/file1.jpg,对吗? “原始”文件不太可能位于子目录结构中的子域上,因此您仍然需要将所有文件移动到它们各自的 /static/ 或 /media/ 子目录中,这将是一个重要的,如果不是,不可能的改变一些设置【参考方案2】:

简短回答:不。

长答案:虽然有可能,但效率极低。您可以设置代理服务器(例如在 nginx 中)或为自定义路径规则设置 HAProxy,但这会使您的带宽成本加倍(CDN -> 代理 -> 客户端,而不是 CDN -> 客户端)。此外,这没有任何意义,因为首先使用 CDN 基本上没有任何好处。

这是基于mydomain.com 确实提供动态内容的假设。如果没有,您也可以在 S3 上托管整个域 (mydomain.com)。

【讨论】:

Tim,为什么不:源服务器 -> 代理 -> CDN -> 客户端? CDN 位于您的用户和您的代理之间,因此您仍然可以获得 CDN 的好处。仍然很乱,但它可以工作。

以上是关于AWS CloudFront 分布在与 Web 服务器相同的域下的主要内容,如果未能解决你的问题,请参考以下文章

AWS:如何为自定义域名配置 Cloudfront

AWS CloudFront CNAME 和分发域名关系不明确

AWS国际版的Route 53和CloudFront

AWS Cloudfront 到 EC2 的混合 PHP 和静态内容

使用Cloudfront而不是单个EC2实例的AWS ELB设置有什么意义?

是否可以通过 CloudFront CDN 进行 AWS 内容路由?