Jare.io, an Instant and Free CDN

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

CDN 指的是内容分发网络。从技术上讲,它是位于不同国家和大陆的一组服务器。你将你的 logo.gif 给它们,它们会给你一个 URL,这个 URL 会根据尝试解析它的用户而解析到不同的服务器上。因此,文件总是接近最终用户,你的网站加载速度比没有 CDN 的情况下要快得多。听起来不错,但所有 CDN 供应商都需要为他们的服务收费,通常还需要相当复杂的设置和注册过程。我的个人项目 jare.io 是一个免费的 CDN,非常容易配置。它利用 AWS CloudFront 资源。

首先,让我展示一下它是如何工作的,然后如果你对细节感兴趣,我将解释它是如何在内部完成的。假设你有以下 HTML:

我希望通过CDN传送这个logo.svg。这需要两个步骤。首先,我在jare.io注册我的域名:

然后,我更改我的HTML代码:

That’s it.

尝试使用您自己的资源,您会发现加载速度会快得多。

这是完全免费的,但我要求您要合理使用。如果您的流量很大,您需要在CloudFront或其他地方拥有自己的账户。我的服务适用于小型项目。

现在,对于更多技术细节,如果您想了解这个解决方案的技术原理。首先,让我们讨论CDN是什么以及它是如何工作的。

当您的浏览器想要加载一张图片时,它会有一个URL,就像上面的例子一样。这就是URL:http://www.teamed.io/image/logo.svg。这个地址有三个重要部分。第一个是http,即协议。第二个是www.teamed.io,即主机名,以及尾部的/images/logo.svg,它是路径。为了加载这张图片,浏览器必须打开一个套接字,连接您的计算机和存储图片的服务器。为了打开套接字,浏览器需要知道服务器的IP地址

在该URL中没有这样的地址。为了找到IP地址,浏览器正在进行所谓的查找操作。它连接到最近的名称服务器,并询问:“www.teamed.io的IP地址是什么?”答案通常包含一个IP地址:

在撰写本文时,“www.teamed.io”的IP地址为“199.27.79.133”。

当地址已知时,浏览器会打开一个新的套接字并通过它发送一个HTTP请求。

服务器以一个HTTP响应作出回应:

那就是我们正在寻找的SVG图像。浏览器在网页上渲染它,就是这样。

目前为止都还不错,但是如果你的浏览器与该IP地址之间的距离相当大,加载图像将需要很长时间。嗯,数百毫秒。试着加载这张图片,它位于捷克共和国的布拉格市托管的服务器上(我正在使用curl,如此处所建议)。

我试图从加利福尼亚州的帕洛阿尔托做这件事,那里距离布拉格隔了半个地球。正如你所见,需要超过500毫秒的时间。这太长了,尤其是如果一个网页包含很多图片的话。总体而言,页面加载可能需要几秒钟,只是因为服务器离我太远了。无论我们将它托管在哪里,它都将不可避免地离一些用户太远。如果我们将其托管在加利福尼亚州,它将离我足够近,图片将立即加载(少于50毫秒)。但对于布拉格的用户来说,它将会太慢。

如果服务器以某种独特的方式动态生成图片或页面,并且我们无法在不同国家和大陆安装多个服务器,那么这个问题就没有解决方案。但在大多数情况下,比如我们的徽标示例,这不是一个问题。这个徽标不需要为每个用户都是独一无二的。它是一个非常“静态”的资源,只需要创建一次,然后传递给每个人,不做任何更改。

那么,我们在加利福尼亚某处安装一个服务器,让加利福尼亚的用户连接到它怎么样?当一个对logo.gif的请求发送到其中一个“边缘”服务器时,它将连接到布拉格的中央服务器并加载文件。这将只发生一次。之后,边缘服务器将不再从中央服务器请求文件。它将立即从其内部缓存中返回文件。

我们需要有许多边缘服务器,最好分布在我们的用户可能所在的所有国家。第一个请求会花费更长的时间,但所有其他请求都会更快,因为它们将从最近的边缘服务器提供服务。

现在,问题是浏览器如何知道哪个边缘服务器是最近的,对吧?我们只需欺骗域名解析过程。根据询问者的身份,DNS将给出不同的答案。以cf.jare.io为例(它是负责在AWS CloudFront中传送我们内容的所有边缘服务器的名称,是djk1be5eatcae.cloudfront.net的CNAME)。如果我从加利福尼亚查询它,我会得到以下答案:

位于旧金山的边缘服务器的IP地址是54.230.141.211。这离我相当近,距离不到50英里。如果我从弗吉尼亚的服务器执行相同的操作,我会得到一个不同的响应:

位于华盛顿的边缘服务器具有IP地址52.85.131.217,它离我很远,但离我进行查找的服务器非常近。

全球有成千上万个名称服务器,它们都有关于cf.jare.io边缘服务器实际位置的不同信息。根据询问者的身份,答案也会不同。

CloudFront 是最简单的 CDN 解决方案之一。要通过它们的边缘节点开始传递内容,您只需创建一个“分发”并进行配置即可。分发基本上是内容源和边缘服务器之间的连接:

skinparam componentStyle uml2 浏览器 -right-> [边缘服务器] [边缘服务器] -right-> [中央服务器] [中央服务器] -right-> [源服务器]

边缘服务器之一收到一个 HTTP 请求。如果它的缓存中已有该 logo.svg,它会立即返回一个带有内容的 HTTP 响应。如果它的缓存为空,边缘服务器会向中央服务器发出一个 HTTP 请求。中央服务器了解“分发”及其配置。它与源服务器建立一个 HTTP 连接,源服务器是 www.teamed.io,并要求它返回 logo.svg。完成后,图像会返回到边缘服务器,然后被缓存。

这看起来相当简单,但并非免费且配置起来并不那么快速。您需要在 CloudFront 上创建一个帐户,注册您的信用卡并获得批准。然后您需要创建一个分发并进行配置。您还应该在您的域名服务器中创建该 CNAME。如果只是为一个网站这样做,那没什么大不了的。但如果有十几个网站,这将是一个耗时的操作。

Jare.io 是该图表中的一个额外组件,可以让您的生活更轻松:

skinparam componentStyle uml2 浏览器 -right-> [边缘] [边缘] -right-> [中央] [中央] -down-> [中继] [中继] -right-> [源]

Jare.io 有一个”中继”,它充当 CloudFront 的源服务器。所有到达 cf.jare.io 的请求都会被派发到中继。中继根据 HTTP 请求 URI 中的信息决定如何处理这些请求。例如,来自浏览器的请求具有以下 URI 路径:

请记住,请求是发送到cf.jare.io,这是边缘服务器的地址。这个确切的URI到达relay.jare.io。URI包含足够的信息来决定返回哪个文件。中继器向www.teamed.io发出新的HTTP请求并检索图像。

这种解决方案的美妙之处在于它很容易。对于小型网站来说,这是一个免费且快速的CDN。

顺便说一下,当我们通过jare.io(和CloudFront)查询相同的图像时,它返回得更快:

大部分工作由AWS CloudFront完成,而jare.io只是一个中继,使其配置更加方便。此外,jare.io是免费的,因为它得到了Zerocracy的赞助。换句话说,我的公司将为您使用CloudFront付费。如果您能牢记这一点,并不将jare.io用于流量密集的资源,我将不胜感激。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:29

sixnines availability badge   GitHub stars