内容分发网络 (CDN)

内容交付网络用于托管静态媒体文件,如图像、.css.js 文件以及音频和视频文件。这些文件存储在服务器位于不同地点的地理网络上。然后,这些文件会根据请求的位置,从特定的服务器向请求提供服务。

CDN 提供以下功能:

  • 由于内容是静态的,不会经常变化,因此 CDN 将其缓存在内存中。当有人请求访问某个文件时,CDN 会直接从缓存中发送文件,这比从磁盘加载文件并发送到浏览器要快。

  • CDN 服务器位于不同地点。根据 CDN 的设置,所有文件都存储在不同的位置。当浏览器请求到达 CDN 时,CDN 会从离请求位置最近的可用位置发送请求内容。例如,如果 CDN 在伦敦、纽约和迪拜都有服务器,而请求来自中东,CDN 将从迪拜服务器发送内容。这样,由于 CDN 从最近的地点发送内容,响应时间就缩短了。

  • 每个浏览器向一个域同时发送请求都有限制。大多数情况下是三个请求。当一个请求得到响应时,浏览器会向同一个域发送更多请求,从而导致页面加载延迟。CDN 提供子域(可以是自己的子域,也可以是主域的子域,使用主域的 DNS 设置),这样浏览器就能对从不同域加载的相同内容发送更多并行请求。这样,浏览器就能快速加载页面内容。

  • 一般来说,动态内容的请求较少,而静态内容的请求较多。如果您的应用程序的静态内容托管在单独的 CDN 服务器上,这将大大减轻服务器的负载。

使用 CDN

那么,如何在应用程序中使用 CDN 呢?最佳做法是,如果您的应用程序流量很大,最好在 CDN 上为每种内容类型创建不同的子域。例如,可以为 CSS 和 JavaScript 文件创建一个单独的域,为图像创建一个子域,为音频/视频文件创建另一个单独的子域。这样,浏览器就会为每种内容类型发送并行请求。比方说,我们为每种内容类型创建了以下 URL:

现在,大多数开源应用程序都在其管理控制面板中提供了设置 CDN URL 的设置,但如果您碰巧使用的是开源框架或自定义构建的应用程序,您可以将前面的 URL 放入数据库或全局加载的配置文件中,从而定义自己的 CDN 设置。

在我们的示例中,我们将把前面的 URL 放在配置文件中,并为它们创建三个常量,如下所示:

Constant('CSS_JS_URL', 'http://css-js.yourcdn.com/');
Constant('IMAGES_URL', 'http://images.yourcdn.com/');
Constant('MEDiA_URL', 'http://css-js.yourcdn.com/');

如果我们需要加载 CSS 文件,可以按如下方式加载:

<script type="text/javascript" src="<?php echo CSS_JS_URL?>js/file.js"></script>

对于 JavaScript 文件,可以按如下方式加载:

<link rel="stylesheet" type="text/css" href="<?php echo CSS_JS_URL?>css/file.css" />

如果我们加载图片,可以在 img 标签的 src 属性中使用之前的方式,如下:

<img src="<?php echo IMAGES_URL ?>images/image.png" />

在前面的示例中,如果我们不需要使用 CDN 或想更改 CDN URL,只需在一个地方进行更改即可。

大多数知名 JavaScript 库和模板引擎都将其静态资源托管在自己的 CDN 上。Google 在自己的 CDN 上托管了查询库、字体和其他 JavaScript 库,可以直接在应用程序中使用。

有时,我们可能不想使用 CDN,或者负担不起。为此,我们可以使用一种称为域共享的技术。使用域分片,我们可以在同一服务器和应用程序上创建子域或将其他域指向我们的资源目录。该技术与前面讨论的相同,唯一的区别是我们将其他域或子域指向我们自己的媒体、CSS、JavaScript 和图片目录。

这看似没什么问题,但并不能为我们提供 CDN 的最佳性能。这是因为 CDN 会根据客户的位置、广泛的缓存和文件优化来决定内容的地理可用性。