关于在Dreamhost主机上使用CloudFront的一些说明

上一篇文章中,介绍了为托管在Dreamhost主机上的博客空间使用CloudFront充当CDN加速服务器的大致做法。不过当时因为不太了解这种服务,有些疏漏,因此用这篇文章进行进一步解释说明。

先说说具体情况,本博客的域名是在GoDaddy注册的,但空间托管在Dreamhost的主机上。由于DH本身对这个功能的介绍不是太清楚,我以为直接在后台输入必要的CloudFront信息后,其他东西全部都不用管了,都可以自动进行,但实际上并不是这样。因此前几天,我以为我的网站已经被加速了,但其实根本没有,也许是心理作用才让我觉得速度快了吧。

为了让CDN正常生效,依然需要做下列几件事情:

  1. 通过某种机制,将网站指定内容统一复制到S3的某个Bucket中。
  2. 在域名服务器上修改DNS记录,添加一条CNAME记录,并指向CloudFront的分发点。
  3. 在网站上,通过URL Rewriting技术,将Bucket中存在的内容的链接进行替换。

下面分别介绍。

将内容从源复制到S3 Bucket

这一步可以在DH的后台进行。从左侧树形图中依次点击“Goodies – Amazon CloudFront”。输入必要的信息,其中第一行的“cdn”是指希望别人用于访问CDN中内容时使用的子域名,可以随意设置,但必须是要使用的网站域名下的子域名。随后第二行设置要将哪些内容复制到S3中。按照我的选择,我将该网站下的所有内容都复制了过去,但实际上如果有不同需求,也可以复制某个具体的目录。随后填写两个Key,并点击按钮添加。

在Dreamhost后台设置要复制的内容,以及复制到的目标

这个过程中,DH的后台程序会使用提供的Key,自动在S3中创建Bucket,并在CloudFront中自动创建分发。随后会自动将指定目录下的所有文件都复制到Bucket中。这些操作都不需要手工干预。此处的Bucket默认会创建到US-Standard的数据中心内,这个数据中心的各种费用也是最便宜的,但并没有使用低冗余存储。

接着用AWS帐户登录到AWS控制台,然后展开Amazon S3选项卡,并选中针对CloudFront创建的Bucket,例如下图中的“cdn.xieyidian.com”。单击“Properties”按钮展开这个Bucket的属性窗格,在“Permissions”选项卡下,单击“Add more permissions”,添加“Everyone”并为其分配“View Permissions”。

为Bucket设置必要的属性

随后切换到CloudFront选项卡下,这里应该已经创建好一个分发。单击选中,下方的属性窗格会显示出必要的信息。这里面需要注意,如果状态显示为“Deployed”,证明相关的设置操作已经完成,该分发点已经生效了。随后需要在下方的属性窗格中记下“Domain Name”显示的信息,例如本例中显示的是“d2q7gy996ell99.cloudfront.net”,这个信息将用于添加域名的CNAME记录,非常重要。

查看有关分发点的必要信息

至此Amazon这里的操作和设置全部完成。

为域名添加CNAME记录

这一步需要在域名服务器的所有者那里进行。例如虽然我的域名是在GoDaddy注册的,但因为主机在DH这里,因此在GoDaddy那里我直接设置了DH提供的名称服务器(NS)地址。所以这种情况下要添加CNAME记录,就必须在DH这里进行。

再次打开DH的后台界面,从左侧树形图中依次进入“Domains – Manage Domains”,随后这里列出了当前帐户下添加的所有域名。找到目标域名,并点击“DNS”链接。

选择要添加CNAME记录的域名

随后需要添加CNAME记录(什么是CNAME记录)。Name这里,只需要输入要使用的二级域名即可,例如本文第一张图片里设置的“Sub-Domain”是“cdn”,因此这里只需要输入“cdn”。随后需要选择该记录的类型,这里必须选择“CNAME”。接着是值,这个值实际上就是CloudFront分发点创建好后,在AWS控制台里显示的“Domain Name”,也就是上文强调过的那个“d2q7gy996ell99.cloudfront.net”。这个信息一定要正确。同时这里还有一个问题需要注意,取决于不同的DNS服务器设置,有些NS服务器,例如DH的,要求在这个“.net”之后再输入一个英文句点“.”但据说有些NS服务器并不需要。具体情况请查阅NS服务器的说明信息,或者两种情况挨个尝试一下。设置完毕后单击按钮添加记录,添加好的记录会显示在“Custom DNS Records”类别下。

添加一条CNAME记录

至此域名这里的操作已经完成,不过DNS的改动在全球全面生效需要一段时间,最长可能需要48小时,因此可能需要等待一段时间才能看到最终结果。

重写URL

最后一步,就是将网站内容中的URL进行替换,这样浏览器才知道需要通过“cdn.xieyidian.com”这个域名(在CDN的缓存服务器中)找到所需内容,而不会去“www.xieyidian.com”的域名下获取内容(虽然也能找到,但这就等于没有用到CDN的加速功能)。

还是以WordPress为例,这次我换了一个插件,用的是OSSDL CDN Off-linker,这个插件唯一的用途就是重写URL,因此比较简单,也好上手。通过WordPress的后台界面安装,并激活后,在左侧树形图中打开“设置”,并点击OSSDL CDN Off-linker,随后即可看到配置界面。

配置URL的重写规则

首先需要在“off-site URL”这里输入上文添加的CNAME记录对应的地址,即“http://cdn.xieyidian.com”,域名结尾处不能输入“/”斜线,同时必须包含“Http://”或“Https://”,以代表要使用的具体协议。

“include dirs”选项,则对应了要重写的内容所在目录。以上图为例,这里列出了“wp-content,wp-includes”这两个目录,因此如果网站页面上包含了位于“https://www.xieyidian.com/wp-content/”或“https://www.xieyidian.com/wp-includes/”目录下的内容(这些内容可以位于这两个目录下的子目录中),那么该插件就会自动将完整连接中的“www.xieyidian.com”域名替换为“cdn.xieyidian.com”域名。对于WordPress来说,这两个目录下几乎包含了网站的一切内容,例如文章插图、主题文件、脚本文件、CSS文件等。

“exclude if substring”选项则决定了要排除,不进行重写的内容类型,我觉得没啥用,保留默认设置即可。

至此,最后一步工作终于完成了。

还有问题?

通过上述设置,再等待一段时间,让DNS记录传遍全球后,所有操作就全部执行完毕了。

不过对于Dreamhost主机的用户还有一个问题。本文涉及的方法是通过DH后台提供的页面和功能,将文件内容从原始位置复制到Amazon S3中的,但问题是,该功能只能手工执行,而不能自动按时执行。也就是说,如果以后发布了新的内容,这些内容将无法自动同步到CDN服务器上,而相关内容的链接已经被重写过了,因此将导致新发布的文章无法显示出插图(如果文章包含插图,并且插图并不是直接引用网上现有文件的话)。此时唯一的解决方法就是在DH的后台去,打开本文开头处第一张截图的界面,然后点击“Rescan Now”按钮,手工触发一次同步。

所以如果您的网站内容更新频繁,这种方法就不太合适了。不过对于我来说,我的个人站点,本身可能好几天,甚至好几周才添加一篇新内容,这个问题的影响并不是很严重,姑且这样用吧。不过我打算给DH提提建议,如果他们能提供自动定时同步功能,那当然最好了。

分享:

《关于在Dreamhost主机上使用CloudFront的一些说明》上有18条评论

    1. 嘿嘿,最近可写的东西比较多,所以也就写得多了。有时候也一个多月感觉没啥可以写的。不过正好,这证明最近我有很多有趣的东西可以玩啊,呵呵

  1. CloudFront 已经支持Custom Origins,也就是说不必再将自己网页的内容上传到S3了,CloudFront可以直接从我们的网站获取内容进行分发。刚刚试用,我准备另写一篇介绍一下这个特性。

    1. 呵呵,前几天收到Amazon的通知邮件后就已经开始使用了。这个改进实在是太好了,之前我最头疼的就是怎样把内容从Origins复制到S3,这下简单多了

  2. 测试了下你的网站,从中国访问过去的流量大部分都给分到amazon的西雅图机房去了,这个很奇怪,不知道您自己测试过没?

    1. 可能和测试时的网络状态有关吧,刚开始使用这个服务的时候我测试过,并且让很多外地的朋友帮我测试过,走新加坡和日本机房的比较多,但也有走美国的。而且根据账单来看,这几个月,也都是亚太地区数据中心的请求数量和费用最多,美国的请求和数量第二多,欧洲的最少

  3. 我刚刚问过DH的人,说DH会自动去scan的指定目录里面的所有文件,然后传到S3的。

    另外有一个很外行的问题问各位,如果我的bucket放在东京,采用cloudfront之后,我的CDN的数据只从东京进行分发,还是采用了CDN后不管的Bucket在哪里,都会根据访客的位置从最近的进行分发。

    1. 现在已经没必要这样了,CF经过更新后,可以绕过S3,直接从原始网站拉取内容,不需要先传S3,然后再从S3到CF。

      第二个问题的话,CF本身就是涵盖全球的CDN网络,所以只要你的内容进入CF中,就会被自动分发到全球不同位置的缓存服务器上,这样才能为不同地理位置的访客提供加速服务,这是没得选的。

  4. 您看看我现在的站,貌似好像fast.liuyouhui.com还没有东西,CSS和图片全无,应该是CF上没有东西吧,或者是我需要有权限方面的设置。

    或者我需要等24个小时,等:
    – fast.liuyouhui.com 的解析生效
    – CF上内容已经有了。

  5. 看起来你的网站本身已经完全正常了,但CF还没有生效。

    你可以登录到CF的后台,看看你建立的这个fast分发点开始生效没有,一般要等一等,最慢24小时左右就差不多了。

    在我这里测试,nslookup fast.liuyouhui.com可以返回 d14kia02u2j95d.cloudfront.net,证明你的设置也没问题。不过CF的内容依然显示不出来。

    不知你在CF的后台建立分发的时候,你选择了HTTP还是HTTPS?如果是后者,建议改成HTTP试试看

  6. 问个问题,如果我想www.doamin.com指向主站动态内容,www.domain.com/static挂到cloudfront,即不采用子域名,能实现吗?

    很疑惑,谢谢!

    1. 没这样试过,但我估计是不行的,因为CF是通过对域名进行解析实现CDN加速的,不使用子域名的话,那就和你的主域名冲突了啊

    1. CF我曾经用过一段时间,不过后来感觉速度慢,主要是国内不同地区访问速度不一样,有些快有些慢,所以最后就没有用了。不过如果用的话,CF是自动包含全球多个节点,根据访客位置自动重定向到最近的节点的。不是只能使用固定一个位置的,用哪个,取决于你在哪里。

      目前我用的是Dreamhost为用户免费提供的CloudFlare

发表评论

电子邮件地址不会被公开。 必填项已用*标注

发表评论前,先做个简单的数学题吧: * Time limit is exhausted. Please reload CAPTCHA.