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}`;