CDN

435 阅读2分钟

CDN是什么

CDN是一种分布式的网络架构,为将内容更快传给用户,将服务器部署在不同的地理位置,可以缓存和提供静态资源,包括图片、视频、JS、CSS等。当用户请求这些资源时,CDN会自动选择距离用户最近的服务器来提供资源,可减少网络延迟和带宽消耗。

CDN的工作原理

CDN的工作原理是将静态资源复制到多和服务器上,并通过DNS负载均衡技术将用户请求分配到最近的服务器上。当用户请求资源时,CDN会自动选择距离用户最近的服务器来提供资源,如果该服务器上没有缓存该资源,CDN会从源服务器上获取资源并缓存到该服务器上,下次用户请求该资源时就可以直接从缓存中获取,从而提高访问速度和稳定性

CDN的资源管理

CDN通过域名匹配资源,针对CDN资源可在URL中添加版本号参数,当资源发生变化时,修改版本号参数即视为新的URL。

使用node进行本地资源读取及上传

const fs = require('fs');
const request = require('request');

function uploadStaticResource(cdnUrl, localPath) {
  const formData = {
    file: fs.createReadStream(localPath)
  };
  request.post({ url: cdnUrl, formData }, (err, httpResponse, body) => {
    if (err) {
      console.error('upload failed:', err);
    } else {
      console.log('upload successful! Server responded with:', body);
    }
  });
}

URL预取

资源预取是指将静态资源先缓存在cdn节点上,通过目录预取及文件预取处理资源

const https = require('https');

const accessKeyId = 'your_access_key_id';
const accessKeySecret = 'your_access_key_secret';
const cdnDomain = 'your_cdn_domain';
const filePath = 'your_file_path';

const options = {
  hostname: 'cdn.aliyuncs.com',
  path: `/?Action=PushObjectCache&ObjectPath=${filePath}&ObjectType=File&DomainName=${cdnDomain}`,
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `acs ${accessKeyId}:${signature}`
  }
};

const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

req.on('error', (error) => {
  console.error(error);
});

req.end();

Authorization header

uthorization header是HTTP请求头中的一种,用于在请求中包含身份验证信息。在使用CDN的API接口进行URL预取或目录预取操作时,需要在请求头中包含Authorization header,以便进行身份验证。 Authorization header的格式一般为:Authorization: <type> <credentials>,其中type表示身份验证类型,credentials表示身份验证凭证。在CDN的API接口中,type固定为acs,credentials的格式为AccessKeyId:Signature,其中AccessKeyId表示访问密钥ID,Signature表示签名字符串。 具体来说,Authorization header的值应该为:Authorization: acs AccessKeyId:Signature,其中AccessKeyId和Signature需要根据实际情况进行替换。在使用CDN的API接口进行URL预取或目录预取操作时,需要在请求头中包含Authorization header,以便进行身份验证。

const crypto = require('crypto');

const accessKeyId = 'your_access_key_id';
const accessKeySecret = 'your_access_key_secret';

const signature = crypto.createHmac('sha1', accessKeySecret)
  .update(`POST\n\n\n\n\napplication/json\n${date}\n${canonicalizedHeaders}\n${canonicalizedResource}`)
  .digest('base64');

const authorizationHeader = `acs ${accessKeyId}:${signature}`;

使用nginx设置针对html资源的强制刷新

www.likecs.com/ask-6235283…