百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

搭建自己的 CDN 的乐趣和好处 自建cdn教程

lipiwang 2024-10-20 10:10 13 浏览 0 评论

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

如你所见,我也喜欢页面能快速加载,越快越好.但在我们开始讨论之前,先要有一个清楚的认知:CDN 并不是万能的.如果因为糟糕的前端工作导致你的网站变慢,CDN 并不能帮到你太多,你需要先做好前端工作.但一旦你已经做好了所有的优化,就需要来研究一下内容传输这块了.

我碰到的主要问题是即使能通过一次 HTTP 请求来完成初始网站的加载,但因为我的服务器托管在法兰克福,在澳大利亚的人仍需要等待2-3秒后才能访问到它.超过300ms的往返延时和中间大量的服务提供商使得页面加载就跟 Wordpress 网站一样慢.

那如何解决这个问题呢? 一种解决方案是使用传统的 CDN.然而大多数商业 CDN 在从服务器请求到数据之后,都会缓存一段时间.

由于 CDN 的存在,在内容获取上稍微绕行了一下,导致在使用传统 CDN 之后,初始页面的加载反而变慢了.如果你的网站流量高,内容一直缓存着,这没什么大问题.但反过来说,如果和我一样仅仅是运行一个小博客,内容并不会常驻缓存,传统的 pull-CDN 反而会让网站变得更慢.当然,我也可以通过 push-CDN 直接上传内容,但跟我要搭建的 CDN 相比,这种成本要昂贵许多.

CDN 是如何工作的?

我们的方案很明确:为了扩大世界影响力,我们应该保证内容在任何位置都能被快速访问.这意味着内容所在位置应该尽量靠近访问者.方便的是,很多云服务商在多个地区都提供了廉价的虚拟服务器.我们是否仅需要把内容放到比如6台服务器上,就万事大吉了呢?

好吧,没那么快.那如何把用户路由到正确的服务器上呢?我们看一下实际访问网站的过程.首先,浏览器通过 DNS 查询网站的 IP 地址,获取到 IP 之后,就可以连接网站并下载请求的页面.

上层的解决方案其实很简单:需要一台智能 DNS 服务器,对请求的IP 做 GeoIP 查询并返回离它最近的 IP 地址.事实上,几乎所有的商业 CDN 都是这么做的.虽然还牵扯到许多工程学领域的内容,比如延迟测量等,但基本原理还是这个.

让 DNS 服务器快起来

接下来新的问题出现了:如何让 DNS 服务器快起来?从最近节点上访问网站仅仅解决了一半问题,如果 DNS 查找不得不绕行地球一周,还是会有极大的延迟.

事实证明,支撑互联网的基础设施非常适合解决这个问题.网络提供商使用边界网关协议来相互告知可连接的网络和跃点的多少.多数情况下,最终互联网提供商会采用最短路线来到达目标地址.

如果在多个位置使用一个 IP 地址,DNS 总是会路由到最近的节点,这就是 BGP Anycast.

为何网站下载不使用 BGP Anycast?

如果能做到,我们为何不简单使用 BGP 来路由网络流量呢?主要有三个原因.

首先,使用 BGP Anycast 需要在网络硬件上做控制,并且需要一个至少包含256个 IP 地址的池子,这超出了我们的预算.

其次,BGP 路由并不那么稳定.不同于 DNS 请求仅仅只需要向两个方向发送单个数据包,HTTP web 请求需要创建一个连接来下载内容.期间如果路由改变或者连接不稳定,HTTP 连接就会断开.对这种规模的工程来说反而增加了很多复杂性.

最后,跃点作为 BGP 路由计算基础,它数目的减小并不能保证往返延迟的减小.一个跨大洋的跃点可能仅仅是一个跃点,但却是时间最长的一个.

扩展阅读: 关于这个话题,Linkedin Engineering上有一篇非常棒的博文

创建 DNS

既然已经确认不能运行我们自己的 BGP Anycast,也意味着同样不能运行我们自己的 DNS 服务器.让我们去找找收费的!...事实证明,同时提供 BGP Anycast 和延迟路由的 DNS 提供商很难找到.我只搜索到了2个:相当昂贵的 Dyn 和非常便宜的 Amazon Route53.(更新:后来发现, DNS Made Easy 也能实现延迟路由)既然想合算,就选 Route53 了.添加域名之后开始为机器设置 IP. 我们需要设置跟我们遍布世界各地的(边缘节点)服务器同样多的 DNS 记录,每条记录设置如下:

提示:最好对每个边缘节点都创建一个健康检查以便在他们失效后进行移除.

分发内容

我们需要解决的下一个问题是分发内容.每个边缘节点都需要有相同的内容.如果你使用的是 Jekyll 这样的静态网站生成器,工作很简单:只需要将生成的 HTML 文件复制到所有的服务器上即可.一个简单的 rsync 就能搞定.

如果想使用 Wordpress 这样的内容编辑系统,工作会困难的多,因为它并不能在 CDN 上运行.当然也可以做,但免不了有缺陷,静态内容的分发仍然是一个问题.你可能必须要创建一个分布式存储才能正常工作.

使用 SSL/TLS 证书

下一个痛点是使用 SSL/TLS 证书.实际上,可以统称他们为:x509证书.每个边缘节点都需要为域名设置有效的证书.当然,最简单的解决方案是使用 LetsEncrypt 来生成不同的证书.但要注意, 我在其中一个边缘节点上碰上了 LE 有效期的问题,导致在每周限额到期之前我不得不暂时把伦敦节点下掉.

我使用 Traefik 作为我的选择代理, 它支持分布式键值存储,甚至支持 Apache Zookeeper 后端同步.虽然这需要一些程序设计,可从长远来看会更稳定一些.

结果

是时候检验一下结果了,我的 CDN 表现如何呢?使用这个工具,看一下总体数据:

如你所见,相当不错的结果.我可能还需要在亚洲和南美加两个节点来优化加载时间.

更新:在把它提交到 Hacker News 首页之后,我可以使用 Google Analytics 来收集一些实际使用数据:

结论:我确实需要一个新加坡节点.在印度的加载时间超过了预期的1秒.

常见问题

我在做这项工作的时候,人们经常问我:"你为什么要做这个呢?你这是自寻烦恼啊 ". 确实,在某种程度上,我喜欢做不同的事情来探索新方向和新技术,建立自己的 CDN 可能具有很大的意义.让我们来谈谈关于设置的一些问题.

首先申明:如果商业提供商能推出价格合理的 push CDN,让我能处理 nice URLs, SSL 和自定义头信息,我绝对乐意花钱解决问题并停掉我自己的基础设施.搭建它很有趣,但我还有很多服务器没有运行它.

为何不用 CloudFlare?

对很多人来说 CloudFlare 是一个很棒的工具,但如上所述, CDN 会从缓存中移除未使用的内容.我管理的其他网站,在正确配置的情况下缓存命中率大概能达到75%.拥有自己的 CDN 则意味着内容会常驻缓存,不会有访问远程服务器而导致的往返延时.

为何不用 S3 或 CloudFront?

Amazon S3有托管静态网站的选项,并且可以与 CloudFront 结合着使用.然而,它不允许你自定义缓存头信息,设置 nice URLs等.为此,你需要使用 Lambda@Edge, 这是一个可以让你在 CloudFront 边缘节点上运行代码的工具.但Lambda@Edge 跟 CDN 有同样的问题:如果它在一段时间内没有接收到请求,运行它的容器就会关闭,再次重启则需要一秒钟的时间.

为何不用 Google AMP?

Google AMP 只会在用户通过 Google 搜索引擎访问你的网站时才会带来效果. 而我的大部分流量并非来自 Google, 所以它并不能解决问题. 它仅仅对 Google 有效果,不管其他. 而且我完全有能力在不使用他们提供的简化 HTML 的情况下搭建一个快速网站.

谁在意? 3秒的加载时间已经很棒了!

我是一个擅长内容传输的 DevOps 工程师. 不管其他人如何,我都应该有一个全球都能快速访问的网站,不是吗?我一般都会将 Google AMP关闭,因为跟他们所期望的不同,这是一项糟糕的技术.

搭建

现在看你的了:是否要搭建你自己的 CDN? 源代码在 GitHub 上,拿去吧!

英文原文:https://pasztor.at/blog/building-your-own-cdn
译者:郭明

相关推荐

微软Office Open XML中的数字签名漏洞

MicrosoftOffice是最广泛使用的办公文档应用程序之一。对于重要文件,如合同和发票,可以对其内容进行签名,以确保其真实性和完整性。自2019年以来,安全研究人员发现了针对PDF和ODF等其...

Javaweb知识 day12 XML(javaweb中xml作用)

一、XML:1.1概念:ExtensibleMarkupLanguage可扩展标记语言*可扩展:标签都是自定义的。<user><student>1.2功能:...

易筋洗髓功——内外同修方可致远(易筋洗髓功口诀)

达摩祖师所传易筋、洗髓两经,一分为二,二实为一,无非以方便法门接引众生,而归于慈悲清净之心地。修炼《易筋经》是为强身健体,修炼《洗髓经》是为修心养性,此二者相辅相成,内外兼修,缺一不可。这是一套传统中...

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 4

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 5

道家洗髓功修炼要义,洗髓功如何做到丹田聚气?

不管是道家洗髓功,还是洗髓经,其修炼的关键点就在于得气、行气、聚气...那么,作为洗髓功修炼者,具体该怎么做呢?在实际修炼中,就洗髓功的修炼方法来讲,我们可以简单的归纳为修炼三部曲,其具体表现如下:一...

「清风聊练功」师门传我易筋经:聊聊我的学习经历和正身图感受

一个人的眼界认识,是随着是自身的知识积累和水平不断成长的。开篇为什么要说这么一句呢?是从我的学习经历上感受明显的这句话:一处不到一处迷。我们学传统武术,内功功法,也是从小白到明白一步步走的,走的越远,...

内功外练功介绍(练内功 外功)

这里介绍我练习的两套动功心得体会。是老道长的八部金刚功、长寿功和增演易筋洗髓经。八部金刚功外练奇经八脉,练出健康强壮的好身体还是可以的,长寿功也是内练功法。这部功法很好的预防效果。这个大家都认同的。说...

孔德易筋洗髓大全注解(下)(孔德易筋经教学视频)

...

《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 1

少林空悟老师珍藏

国术典籍:《增演易筋洗髓内功图说》【2024年8月编校】

《增演易筋洗髓内功图说》系养生气功著作,全书共十八卷。清周述官编撰于光绪二十一年(1895年)。清光绪十九年(1893年),僧人静一空悟将少林功法传授于周述官,并将《增益易筋洗髓内功图说》十二卷(按,...

小说:自媒体小白的修道之路-洗髓(自媒体小白运营技巧)

谁应了谁的劫,谁又变成了谁的执念。当沧海遗忘了桑田,这世间又多了一个不回家的人!异域空间中,知生缓缓起身,目光扫了一下小帝后,又转身看向画板上的那朵白色蒲公英,自言道:“白瑛,这一世我们莫要再辜负了!...

这才是少林洗髓经真相:它是静功和导引术与八段锦暗合

不少朋友误解易筋经和洗髓经,将其简单归为强力呼吸的吐纳功以及为了提升房中的关窍功。事实上易筋经和洗髓经是两部功法:易筋经主要为炼体,包含以膜论为核心的十二月怕打筋膜法,以及辅助的呼吸、导引功法;洗髓经...

孔德易筋洗髓大全注解(上)(孔德易筋经洗髓经视频)

...

洗髓经传承与心得(二)(《洗髓经》)

...

取消回复欢迎 发表评论: