AWS Cloudfront需要在外部网站进行哪些配置?

3
我有一个公开的https网站,托管在linodes web hosting公司上。我在我的AWS账户中为此网站创建了Cloudfront分发,但它显示没有活动,好像什么都没有发生。是否需要对我的网站进行一些操作?如果是这样,我需要做什么?
假设我的分发的cloudfront URL是abcxyz.cloudfront.net,我的网站是mysite.com,是https网站。
补充:
没有活动意味着当我访问mysite.com时,在我的cloudfront分发中没有生成数据或日志,这意味着内容来自mysite.com而不是cloudfront缓存。当我访问abcxyz.cloudfront.net时,它显示mysite.com的内容。

mysite.com是一个动态的Java网站,HTML内容是动态生成的,用户可以与mysite.com上的搜索功能进行交互。它是一个房地产网站,展示了许多物业的图片。所有图片URL都是动态生成的,看起来像这样:https: // www.mysite.com/photos/properties/5eef42ca5366c1485ad8693c/thumb/2500-feet-4.4-residential-for-sale-DSC_0001.JPG

我尝试在Linode.com(我的Web托管公司)登录后,在CNAME DNS设置中添加CNAME记录(abcxyz.cloudfront.net),但没有任何区别。

已经超过2周了,但这个CloudFront分发仍然没有任何指标,而mysite.com每天从世界各地获得2或3个访问者。


2
你是否已经更新了DNS以解析到CloudFront的CNAME? - Chris Williams
不好意思,我不知道如何做。謝謝。 - ace
这个将会在你的DNS提供商那里设置,根据你的DNS提供商不同,他们应该有相应的说明文档 :) - Chris Williams
3个回答

6
我决定删除原回答并为您提供详细步骤。我创建了两个完全相同的网页,称为fast.html和slow.html;它们唯一要做的事就是加载9个非常大的图片,我从这里获取https://effigis.com/en/solutions/satellite-images/satellite-image-samples/,总共335兆字节。slow.html网页将从我的计算机上的images目录中加载图像。fast.html网页将从CloudFront分发中加载图像,该分发又从我上传图像的S3存储桶中获取图像。所以,逐步操作如下:
  1. 创建名为cf-big-images的S3存储桶,并在存储桶内创建名为images的文件夹。

  2. 将图像上传到存储桶中。我使用命令aws s3 cp . s3://cf-big-images/images --recursive从Apache web服务器根目录下的images文件夹中复制了它们。

  3. 进入S3存储桶中的images文件夹,并将其设为公共读取,对于公共用户只能进行只读访问。

  4. 在CloudFront中创建一个分发。您只需要填写“源域名”字段。单击该字段,您将在其中看到S3存储桶“cf-big-images.s3.amazonaws.com”,然后选择它。[注意:我在原始消息中犯了这个错误]

  5. 完成。单击“创建分发”并等待。需要一段时间。

  6. 更改fast.html网页。在我的slow.html网页上,我有:

<img src="images/Img15.jpg">
<img src="images/Img16.jpg">
<img src="images/Img17.jpg">
<img src="images/Img18.jpg">
<img src="images/Img34.jpg">
<img src="images/Img41.jpg">
<img src="images/Img48.jpg">
<img src="images/Img58.jpg">
<img src="images/Img100.tif">

在 fast.html 网页上,我有如下内容:

<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img15.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img16.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img17.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img18.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img34.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img41.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img48.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img58.jpg">
<img src="https://d1pqzepyfmpq4.cloudfront.net/images/Img100.tif">
7. 然后,每次清除缓存后,我导航到slow.html和fast.html页面进行一些测试; CloudFront 显然更快,但这不是一项受控测试。以下是一些图片:enter image description hereenter image description hereenter image description hereenter image description here 希望现在已经讲得很清楚了。

感谢详细说明。在我的情况下,所有图像都小于120kb,缩略图图像大约为4k或5k。我注意到在您的截图中,对于小图像快速和慢速之间没有太大差异。 - ace
使用这样小的图像不会有任何区别。我同意。 - Dan M
那么,您的解决方案不需要更改托管mysite.com的Linode的DNS设置。这正确吗? - ace
那么对于mysite.com上动态生成的大型HTML页面怎么办?mysite.com每天都会添加新图片并删除已移除的属性图片。这意味着我每天都必须手动复制和删除s3上的图片吗?有没有自动化的解决方案? - ace
在我设置Cloudfront之前,我的印象是Cloudfront会自动处理动态外部网站的所有事情,而我所要做的就是与我的托管公司一起设置DNS设置。 - ace
您可以使用 CloudFront 来提供托管在 Amazon S3 上的静态网站。请访问此链接 https://aws.amazon.com/premiumsupport/knowledge-center/cloudfront-serve-static-website/ 查看是否有适合您需求的选项,但如果您只是提供少量内容,我不认为有什么优势;当然,我没有完整的情况。 - Dan M

1
这是一般流程的工作方式:
  1. 用户访问网站 https://example.com
  2. example.com 解析到 yourcdn.cloudfront.net
  3. cloudfront 检查规则(这里有很多要解决的问题,但假设它是可缓存内容)
  4. cloudfront 代表用户访问您网站的服务器并存储返回的内容
  5. cloudfront 然后将响应返回给用户
对于下一个用户,运行步骤1、2、3和5。您的网站不再接收流量。
为此设置需要以下内容:
  1. DNS www.example.com 和 @.example.com 指向 yourcdn.cloudfront.net

WWW

  • www只是一个CNAME记录,游戏结束

@

  • @ is the apex domain, which is the tricky part if you're not using aws's route53

  • @ only accepts A records, which you don't have for your cloudfront entpoint.

  • @ if you are using Route53 aws provides you with an ALIAS CNAME, which solves this dilema

  • if you are not using Route53, things get more complicated. You will have to find a way (either a hosted service or third party) that will let you point @.example.com to their IP, and redirect to www.example.com

  • you could have a static nginx rule that only redirects to www.example.com

    server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
    }
    

我觉得这并不能解决所有人的问题,有一些情况下人们也会使用CDN分发作为对抗互联网的屏障,这可以被称为WAF(Web应用程序防火墙),旨在使您远离互联网威胁。在某些情况下,如cloudfront + aws,它还可以为您提供额外的保护、流量过滤等功能。放弃服务器IP用于顶级域名,有点违反了这种方法。

现在,您已经准备好接收流量并定义规则了!这是有趣的部分。

待续


如果后续请求中跳过了第4步,CloudFront 如何知道内容已更改并应刷新它? - ace
似乎如果我设置AWS Route 53,整体设置会更简单。对于linode.com上的DNS设置,我必须为CNAME记录输入主机名和别名。我不知道什么是别名,所以我只是将其设置为与主机名相同,即yourcdn.cloudfront.net。 - ace
这是一个基于Java的动态网站,使用Nginx作为前端Web服务器。供您参考。 - ace
第4步将被跳过,直到缓存过期,这可以根据每种内容类型自定义规则进行设置。例如,您可以将CSS文件缓存365天,而HTML文件(动态页面)可以缓存30分钟。 - Magus
是的,Route53的设置要简单得多,因为顶级域名只接受A记录,即IP地址。如果Linode的DNS允许您将顶级域名设置为指向CloudFront域名的别名,那么您就可以了。 - Magus
你需要思考 CDN 的方式是,你可以缓存 HTML 页面数小时,所有动态内容,例如用户名、评论、产品定价、用户通知等,“短暂”的内容会从 JavaScript 中获取和更新。而更“静态”的内容,例如博客文章、产品描述、用户个人资料,则可以长时间缓存。 - Magus

0

只有在托管公司允许 DNS 管理的情况下,您才能这样做。(如果是,则可以这样做)。检查您的真实服务器 URL。(或者在映射您的域名的 DNS 中)一旦您获得该值,您需要尝试创建一个 Cloudfront 分发,并将该源映射到 Cloudfront URL。

或者您可以转移到 DNS 管理到 Route 53。您必须在路由 53 记录中创建多个记录。让我解释一下。

  1. 您需要创建一个公共托管区域。(您将获得名称服务器)并在 DNS 管理(mysite.com)中创建名称服务器映射
  2. 您需要将 Mysite.com 映射到 CloudFront 分发。稍后,您需要将网站的托管链接(基本上是公共服务器)映射到 CloudFront 源。
  3. 如果不可能,您需要创建一个与您的域名相同的 S3 存储桶,并将所有内容重定向到真实服务器的公共 URL。

谢谢

Ashish


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接