在 Web 项目中,图片、视频、CSS、JavaScript、安装包等静态资源通常会消耗大量带宽。如果所有静态资源都由业务服务器直接提供,会带来几个问题:
业务服务器带宽压力变大; 用户访问速度受服务器地域影响明显; 静态资源与动态接口混在一起,不利于缓存和扩展; 文件备份、权限管理和防盗链配置复杂。
更合理的方案是将静态资源上传到腾讯云对象存储 COS,再结合 CDN 做全球或全国范围的访问加速。业务服务器只负责动态 API 和业务逻辑,静态资源交给 COS 与 CDN 承担。
推荐架构如下:
用户访问网站页面; 页面中的图片、CSS、JS 等静态资源使用 CDN 域名; CDN 节点如果有缓存,直接返回资源; 如果没有缓存,CDN 回源到 COS 获取文件; COS 作为源站存储完整资源。
访问路径可以理解为:
用户 → CDN 边缘节点 → COS 源站
这种方式可以降低源站压力,提高用户访问速度,并减少业务服务器带宽成本。
在腾讯云控制台创建 COS 存储桶时,需要注意以下配置:
存储桶地域应尽量靠近主要用户或业务系统; 访问权限根据业务场景选择私有读写或公有读私有写; 如果用于网站公开静态资源,可以结合 CDN 对外访问,而不是直接暴露 COS 默认域名; 文件目录建议按业务类型划分,例如:
/static/css/
/static/js/
/images/avatar/
/images/product/
/downloads/清晰的目录结构有助于后续做缓存策略、防盗链和生命周期管理。
开发阶段可以通过控制台上传文件,生产环境更推荐使用 SDK 或 CI/CD 自动上传。
以 Node.js 为例,可以使用 COS SDK 上传文件:
const COS = require('cos-nodejs-sdk-v5');
const cos = new COS({
SecretId: process.env.TENCENT_SECRET_ID,
SecretKey: process.env.TENCENT_SECRET_KEY,
});
cos.putObject({
Bucket: 'demo-1250000000',
Region: 'ap-guangzhou',
Key: 'static/js/app.js',
Body: require('fs').createReadStream('./dist/app.js'),
}, function(err, data) {
if (err) {
console.error(err);
return;
}
console.log('upload success', data);
});在真实项目中,不建议将 SecretId 和 SecretKey 写死在代码中,应通过环境变量、密钥管理或临时密钥方式管理。
配置 CDN 时,可以将 COS 作为源站。然后绑定自定义域名,例如:
static.example.com这样页面中引用静态资源时,就可以使用:
<link rel="stylesheet" href="https://static.example.com/static/css/app.css">
<script src="https://static.example.com/static/js/app.js"></script>
<img src="https://static.example.com/images/product/1.png">为了让资源更好地被缓存,建议对不同类型文件设置不同缓存策略:
图片、字体、版本化 JS/CSS 文件可以缓存较长时间; HTML 文件缓存时间较短; 频繁更新的配置文件可以设置短缓存或不缓存。
如果前端构建产物带 hash,例如:
app.8f3a2c1.js
style.9c21d0.css则可以安全地设置较长 CDN 缓存时间。因为每次内容变化后,文件名也会变化,用户不会拿到旧文件。
如果静态资源是公开的,但不希望被其他网站直接引用,可以配置 Referer 防盗链。允许自己的域名访问,拒绝未知域名访问。
例如允许:
example.com
www.example.com拒绝空 Referer 是否开启,需要根据业务判断。如果用户可能直接在浏览器打开图片,拒绝空 Referer 可能会影响正常访问。
对于私有文件,例如用户合同、付费资料、内部文档,不建议设置为公有读。可以使用私有存储桶加临时签名 URL 的方式访问。
示例:
https://private-bucket.cos.ap-guangzhou.myqcloud.com/file.pdf?sign=xxx签名 URL 可以设置过期时间,到期后链接自动失效。
静态资源长期积累后,存储桶中的历史文件会越来越多。对于临时文件、日志文件、转码中间文件,可以配置生命周期规则自动清理。
例如:
上传超过 30 天的临时文件自动删除; 超过 90 天的归档文件转为低频存储; 超过 180 天的备份文件转为归档存储。
合理使用生命周期规则可以降低存储成本。
第一,静态资源尽量使用独立域名,避免和主站 API 共用域名。 第二,前端构建产物建议开启文件 hash,方便长缓存。 第三,不要在前端代码中暴露永久密钥。 第四,公开资源和私有资源应使用不同存储桶或不同目录策略。 第五,重要资源开启版本控制或做好备份。 第六,结合 CDN 监控查看命中率、流量和状态码分布。
COS 与 CDN 的组合是云上静态资源托管的常见方案。COS 负责稳定、低成本地存储文件,CDN 负责将文件缓存到离用户更近的边缘节点。
通过这种方式,业务服务器可以专注处理动态请求,静态资源访问速度也能明显提升。对于官网、电商、小程序、内容社区、在线教育等场景,这都是一套简单而实用的基础架构。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。