结结 發表於 2026-1-28 00:00:00

CDN加速是什么?如何通过CDN给你的网站加速?一文详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>CDN加速是什么?&nbsp;</li><li>CDN如何提高网站访问速度?&nbsp;<ul class="second_class_ul"><li>1. 减少延迟&nbsp;</li><li>2. 缓存静态资源</li><li>3. 提供更高的带宽</li><li>4. 动态加速</li><li>5. 减少源站负载</li><li>6. HTTP/2 和 TLS 加速</li></ul></li><li>选择 CDN<ul class="second_class_ul"></ul></li><li>配置 CDN<ul class="second_class_ul"><li>CDN 控制台配置</li><li>配置 CNAME</li></ul></li><li>CDN 流量包<ul class="second_class_ul"></ul></li><li>检查是否生效<ul class="second_class_ul"></ul></li><li>手工刷新 CDN<ul class="second_class_ul"></ul></li><li>通过接口调用的方式刷新 CDN<ul class="second_class_ul"></ul></li><li>源代码<ul class="second_class_ul"></ul></li><li>缓存预热<ul class="second_class_ul"></ul></li><li>配置 HTTPS<ul class="second_class_ul"></ul></li><li>使用CDN的优势&nbsp;<ul class="second_class_ul"></ul></li><li>小结<ul class="second_class_ul"></ul></li></ul></div><p class="maodian"></p><h2>CDN加速是什么?&nbsp;</h2>
<p>&nbsp;CDN(Content Delivery Network,内容分发网络) &nbsp;是一种分布式网络服务,通过在全球范围内部署多个边缘服务器节点,将网站的内容(例如 HTML、CSS、JS、图片、视频等静态资源)缓存在离用户最近的服务器节点上。当用户访问网站时,CDN会根据用户的地理位置将请求路由到最近的CDN节点,从而减少延迟并提高访问速度。</p>
<p>&nbsp;核心功能:&nbsp;</p>
<ul><li>1. &nbsp;内容缓存 :将静态资源缓存到分布式节点,减少请求到源服务器的次数。</li><li>2. &nbsp;负载均衡 :分流用户请求至多个节点,减轻源服务器压力。</li><li>3. &nbsp;就近访问 :用户请求会被引导到离用户最近的节点,减少网络传输延迟。</li><li>4. &nbsp;抗DDoS攻击 :隐藏源站IP,通过分布式架构抵御大规模流量攻击。</li></ul>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13012D0.png" /></p>
<p class="maodian"></p><h2>CDN如何提高网站访问速度?&nbsp;</h2>
<p>CDN通过以下方式显著提升网站的访问速度和用户体验:</p>
<p class="maodian"></p><h3>1. 减少延迟&nbsp;</h3>
<p>原因 :网站访问速度与用户到源服务器的物理距离直接相关。如果用户距离源服务器较远(例如,亚洲用户访问托管在美国的服务器),数据传输的延迟会显著增加。</p>
<p>CDN优化 :CDN会将网站资源缓存到离用户最近的服务器节点。用户请求会被路由到最近的CDN节点,从而减少跨国或长距离的网络传输时间。</p>
<p class="maodian"></p><h3>2. 缓存静态资源</h3>
<p>原因 :网站的静态资源(如图片、CSS文件、JavaScript文件等)通常占据大部分流量。</p>
<p>CDN优化 :CDN会缓存这些静态资源到边缘节点。用户请求这些资源时会直接从CDN节点返回,而不是从源站加载,显著降低加载时间。</p>
<p class="maodian"></p><h3>3. 提供更高的带宽</h3>
<p>原因 :当大量用户同时访问网站时,源服务器可能因带宽不足而导致访问速度下降。</p>
<p>CDN优化 :CDN拥有庞大的分布式基础设施,可以分担流量压力,为网站提供更高的带宽,确保高并发访问的稳定性。</p>
<p class="maodian"></p><h3>4. 动态加速</h3>
<p>原因 :动态内容(如用户登录、个性化推荐等)需要实时生成,且无法被缓存。</p>
<p>CDN优化 :通过智能路由、协议优化(如HTTP/2、QUIC)等技术,加速动态内容的传输。</p>
<p class="maodian"></p><h3>5. 减少源站负载</h3>
<p>原因 :高访问量会给源站服务器带来巨大的压力,可能导致宕机或响应变慢。</p>
<p>CDN优化 :大部分用户请求直接由CDN节点处理,源站只需处理未缓存的动态请求,从而降低负载。</p>
<p class="maodian"></p><h3>6. HTTP/2 和 TLS 加速</h3>
<p>原因 :传统的HTTP/1.1协议在处理大量并发请求时效率较低,TLS加密也会增加延迟。</p>
<p>CDN优化 :CDN支持 HTTP/2、HTTP/3(QUIC)协议,使资源加载更快速,同时优化了TLS加密的性能。</p>
<p class="maodian"></p><h2>选择 CDN</h2>
<p>目前国内很多云服务器厂商都提供 CDN 服务:</p>
<ul><li>阿里云:https://www.aliyun.com/product/cdn</li><li>腾讯云:https://cloud.tencent.com/product/cdn</li><li>百度云:https://cloud.baidu.com/product/cdn.html</li><li>华为云:https://www.huaweicloud.com/product/cdn.html</li><li>&hellip;</li></ul>
<p>一般来说自己的服务器在哪个厂商,就用哪个厂商的 CDN,这样会方便一点。关于 CDN 的选择,能展开来说很多,后续有机会再聊。</p>
<p>注意,大部分 CDN 是要付费的。如果想要使用免费 CDN,则需要考虑其跑路、倒闭的问题,这个按需选择。</p>
<p class="maodian"></p><h2>配置 CDN</h2>
<p>这里先说明下配置完后,用户访问博客的整体步骤,便于理解后续的配置是做什么的:</p>
<ul><li>你搭建了一个网站</li><li>你购买了 CDN,CDN 厂商会给你一个 cname 域名</li><li>你配置你的加速域名,改为解析到这个 cname 域名</li><li>用户访问你的加速域名,例如 www.peterjxl.com</li><li>DNS 会解析这个域名,这个域名会解析到 cname 域名,也就是厂商提供给你的域名</li><li>CDN 厂商会选择就近的一个节点,该结点负责返回数据给用户</li></ul>
<p class="maodian"></p><h3>CDN 控制台配置</h3>
<p>这里简单说明下配置过程,以华为云为例,购买了 CDN 服务后,就进入到了配置环节。我们登录云服务器的 CDN 控制台(我这里已经配置好了,可以忽略我的配置结果):</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13012I5.png" /></p>
<p>先点击添加域名,会出下面的表单:</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13012L5.png" /></p>
<p>加速域名:举个例子,我的域名是 peterjxl.com,我希望用户后续访问的时候是通过 www.peterjxl.com,因此我填写了 www.peterjxl.com</p>
<p>业务类型:我这里主要是博客,选择了网站加速</p>
<p>服务范围:按需选择</p>
<p>源站类型:就是要提供源站的地址,例如你的服务器 IP,或者服务器域名等等</p>
<p>源站校验:简单来说就是要确认这个源站是你的,或者你负责的,就是上传一个 txt 文件后上传到服务器上即可</p>
<p>配置完成后,就能看到如下界面,我们需要复制 CNAME 的值:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13014309.png" /></p>
<p class="maodian"></p><h3>配置 CNAME</h3>
<p>去到我的云服务器解析商, DNS 解析里,添加一个 CNAME 记录,将 www 的记录指向上面的 CNAME:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13014E2.png" /></p>
<p>以上,配置就完成了。修改 CNAME 记录后要一定的时间后才能生效。</p>
<p>当配置生效后,用户访问 www.peterjxl.com,DNS 会解析,然后会通过 CNAME 记录解析到华为云的 CDN 服务商,由华为的 CDN 返回内容给访客。</p>
<p class="maodian"></p><h2>CDN 流量包</h2>
<p>CDN 是付费服务,按流量计费的。</p>
<p>此外,我们可以购买流量包(或者叫资源包),更划算,例如 500G,66 元这样子,此外不同地区的收费也不同。</p>
<p>如果你没有国外流量,就可以只买全国通用类型的。此外要注意,如果没有买国外的,并且有国外的流量,则不会使用流量包,而是直接扣费,如果你控制台余额不足则会不能使用。</p>
<p>如果不知道是否有国外的流量,可以先不买,然后在控制台的流量监控功能(一般各厂商都有)分析是否有国外的流量再决定买不买,买多少。</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q130145V.png" /></p>
<p class="maodian"></p><h2>检查是否生效</h2>
<p>我们可以用 nslookup 或 ping 命令来检查是否生效。一般来说,ping 了后会返回 CDN 的节点 IP,而不是你服务器的 IP:</p>
<div class="dxycode"><pre class="brush:bash;">&gt;ping www.peterjxl.com
Pinging www.peterjxl.com.w.cdngslb.com with 32 bytes of data:
Reply from 121.207.229.244: bytes=32 time=18ms TTL=55
Reply from 121.207.229.244: bytes=32 time=19ms TTL=55
Reply from 121.207.229.244: bytes=32 time=19ms TTL=55
Reply from 121.207.229.244: bytes=32 time=18ms TTL=55
Ping statistics for 121.207.229.244:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 18ms, Maximum = 19ms, Average = 18ms</pre></div>
<p class="maodian"></p><h2>手工刷新 CDN</h2>
<p>有时候我们的网站内容有更新了,但是 CDN 没有更新,此时就得更新 CDN 缓存(一般 30 天过期,到期自动刷新)里的内容。</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13014329.png" /></p>
<p>然后提交要刷新的 URL 即可。</p>
<p>如果配置遇到了什么不懂得或者问题,也可以咨询对应的云服务器厂商,毕竟我们是付钱了,他们得给我们解决问题。</p>
<p class="maodian"></p><h2>通过接口调用的方式刷新 CDN</h2>
<p>如果要刷新缓存,每次都登录并且输入 URL,就太麻烦了。因此华为 CDN 也提供了接口的方式,也就是可以在本地调用一个 jar 包的方法去实现刷新。</p>
<p>我们可以先测试下接口,没问题后就下载 jar 包和代码,然后在本地运行。</p>
<p>点击预热刷新&ndash;然后点击调用 API 接口:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q130152F.png" /></p>
<p>然后点击 API Explorer:</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13015O2.png" /></p>
<p>填上我们的加速域名(例如&nbsp;https://www.peterjxl.com/,注意最后有个斜线/),就可以调用接口进行测试了:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13015632.png" /></p>
<p>可以看到响应体里有任务 ID,有的话一般就是正常的(如果有错误会返回),也可以在控制台里查看调用的历史和是否成功:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13015639.png" /></p>
<p>成功后,我们就可以下载代码,然后添加依赖了:</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301B15.png" /></p>
<p>查看依赖信息:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301Ab.png" /></p>
<p>这里可以看到是使用了 Maven(其他语言就不演示了)</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13016424.png" /></p>
<p>最后我们还需要密钥,因为我们是加速域名的主人,只有我们才有权限去刷新缓存,因此得有密钥,相当于一个密码用来证明你的身份。点击查询 AK 信息:</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13016326.png" /></p>
<p>点击添加密钥,就可以下载密钥文件,包含 AK/SK(Access Key ID/Secret Access Key):</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q13016240.png" /></p>
<p>注意,只能下载一次,要好好保管!</p>
<p>然后新建一个 Java 项目,代码里写上刚刚复制的代码,并且配置 Maven,密钥写上下载后的密钥,点击运行就可以调用华为云提供的 jar 包里的方法,实现接口刷新了。</p>
<p class="maodian"></p><h2>源代码</h2>
<p>本人将缓存刷新和缓存预热的代码整合到了一起,仅供参考</p>
<div class="dxycode"><pre class="brush:java;">package com.peterjxl;
import com.huaweicloud.sdk.core.auth.ICredential;
import com.huaweicloud.sdk.core.auth.GlobalCredentials;
import com.huaweicloud.sdk.core.exception.ConnectionException;
import com.huaweicloud.sdk.core.exception.RequestTimeoutException;
import com.huaweicloud.sdk.core.exception.ServiceResponseException;
import com.huaweicloud.sdk.cdn.v1.region.CdnRegion;
import com.huaweicloud.sdk.cdn.v1.*;
import com.huaweicloud.sdk.cdn.v1.model.*;
import java.util.List;
import java.util.ArrayList;
public class CDNRefreshAndPreheat {
    public static String ak = "这里替换成你的ak";
    public static String sk = "这里替换成你的ak";
    public static ICredential auth = new GlobalCredentials().withAk(ak).withSk(sk);
    public static CdnClient client = CdnClient.newBuilder().withCredential(auth).withRegion(CdnRegion.valueOf("cn-north-1")).build();
    public static void main(String[] args) {
      CreateRefreshTasksSolution();
      CreatePreheatingTasksSolution();
    }
    // 缓存刷新
    public static void CreateRefreshTasksSolution(){
      CreateRefreshTasksRequest request = new CreateRefreshTasksRequest();
      RefreshTaskRequest body = new RefreshTaskRequest();
      List&lt;String&gt; listRefreshTaskUrls = new ArrayList&lt;&gt;();
      listRefreshTaskUrls.add("https://www.peterjxl.com/"); //这里替换成你的域名
      RefreshTaskRequestBody refreshTaskbody = new RefreshTaskRequestBody();
      refreshTaskbody.withType(RefreshTaskRequestBody.TypeEnum.fromValue("directory"))
                .withUrls(listRefreshTaskUrls);
      body.withRefreshTask(refreshTaskbody);
      request.withBody(body);
      try {
            CreateRefreshTasksResponse response = client.createRefreshTasks(request);
            System.out.println(response.toString());
      } catch (ConnectionException e) {
            e.printStackTrace();
      } catch (RequestTimeoutException e) {
            e.printStackTrace();
      } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
      }
    }
    //缓存预热
    public staticvoid CreatePreheatingTasksSolution(){
      CreatePreheatingTasksRequest request = new CreatePreheatingTasksRequest();
      PreheatingTaskRequest body = new PreheatingTaskRequest();
      List&lt;String&gt; listPreheatingTaskUrls = new ArrayList&lt;&gt;();
      listPreheatingTaskUrls.add("https://www.peterjxl.com/v1.0/cdn/content/preheating-tasks");//这里替换成你的域名
      PreheatingTaskRequestBody preheatingTaskbody = new PreheatingTaskRequestBody();
      preheatingTaskbody.withUrls(listPreheatingTaskUrls);
      body.withPreheatingTask(preheatingTaskbody);
      request.withBody(body);
      try {
            CreatePreheatingTasksResponse response = client.createPreheatingTasks(request);
            System.out.println(response.toString());
      } catch (ConnectionException e) {
            e.printStackTrace();
      } catch (RequestTimeoutException e) {
            e.printStackTrace();
      } catch (ServiceResponseException e) {
            e.printStackTrace();
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
      }
    }
}</pre></div>
<p class="maodian"></p><h2>缓存预热</h2>
<p>什么是缓存预热?比如用户访问内容,但节点发现内容已经过期了,或者此时有新的内容。那么此时节点需要去源站获取内容,然后再将内容放到自己的缓存里,然后再返回给用户,这样访问时间会变长(因为需要去源站拿数据再返回给用户);</p>
<p>而缓存预热就是在用户访问之前,提前将内容刷新到结点的缓存里,这样就用户访问的时候就能直接获取缓存里的内容了,缩短了用户的访问时间。</p>
<blockquote><p>就好比深夜回家时,提前跟家里人说,家里人会提前将饭菜热好,这样回到家就可以直接吃了,不用再等待热饭的时间。</p></blockquote>
<p>读者可以尝试,在刷新缓存后,马上去访问域名,可以体验到加载速度是比较慢的,因为要去源站读取数据。当然,只有首次访问会慢一点,后续访问都会挺快的。</p>
<p>特别注意:已咨询过华为云的技术人员,华为云 CDN 所提供的缓存预热功能,是仅仅针对具体 URL 的,而不是针对整个缓存!例如 https://www.peterjxl.com/1.mp4,这种具体的 URL。也就是说该缓存预热是针对一些大型的文件之类的进行预热。</p>
<p>所以如果我们想要解决首次访问加载速度慢的问题,只需在刷新后自己马上去访问,就能将结点里的缓存刷新:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301J20.png" /></p>
<p>和缓存刷新同理,也可以通过接口的方式实现预热,这里不再赘述了</p>
<div class="dxycode"><pre class="brush:xml;">&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;groupId&gt;com.peterjxl&lt;/groupId&gt;
&lt;artifactId&gt;vuepressblog&lt;/artifactId&gt;
&lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
&lt;packaging&gt;jar&lt;/packaging&gt;
&lt;name&gt;vuepressblog&lt;/name&gt;
&lt;url&gt;http://maven.apache.org&lt;/url&gt;
&lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
&lt;/properties&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.huaweicloud.sdk&lt;/groupId&gt;
      &lt;artifactId&gt;huaweicloud-sdk-cdn&lt;/artifactId&gt;
      &lt;version&gt;3.1.9&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;junit&lt;/groupId&gt;
      &lt;artifactId&gt;junit&lt;/artifactId&gt;
      &lt;version&gt;3.8.1&lt;/version&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;
&lt;/project&gt;</pre></div>
<p class="maodian"></p><h2>配置 HTTPS</h2>
<p>如果你的网站使用了 HTTPS,则在 CDN 里也要设置。点击设置:</p>
<p><img alt="" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301Jc.png" /></p>
<p>这里要上传下证书的公钥:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301N19.png" /></p>
<p>注意回源方式选择协议跟随:</p>
<p><img alt="在这里插入图片描述" src="https://zhuji.jb51.net/uploads/allimg/20260128/2-26012Q1301O26.png" /></p>
<p class="maodian"></p><h2>使用CDN的优势&nbsp;</h2>
<ul><li>1. &nbsp;加速全球访问 :CDN分布式节点覆盖全球,显著提升跨区域访问速度。</li><li>2. &nbsp;减少服务器压力 :缓存静态资源,大幅降低源站服务器的流量压力。</li><li>3. &nbsp;提升用户体验 :页面加载速度更快,降低跳出率。</li><li>4. &nbsp;提升SEO排名 :Google等搜索引擎将页面加载速度作为排名因素之一。</li><li>5. &nbsp;增强网站安全性 :CDN提供DDoS防护、WAF(Web应用防火墙)和IP隐藏功能。</li></ul>
<p class="maodian"></p><h2>小结</h2>
<p>CDN通过分布式缓存、就近访问、智能路由等技术,显著提高了网站的加载速度和用户体验。要利用CDN提升网站性能,需选择合适的服务商、正确配置缓存规则、启用HTTPS,并根据实际需求优化动态加速和负载均衡。通过结合CDN的强大功能,您可以为用户提供快速、安全、稳定的访问体验,同时降低源站的运维压力。</p>
<p>以上就是CDN加速是什么?如何通过CDN给你的网站加速?详细内容,更多相关资料请阅读琼殿技术社区其它文章!</p>
頁: [1]
查看完整版本: CDN加速是什么?如何通过CDN给你的网站加速?一文详解