网站图片、CSS、JS、字体等静态文件所占的比例一般超过70%,如果全部由源站直接响应的话,带宽和并发连接会被迅速耗尽,页面加载速度变慢,服务器负载一直很高。把静态资源放到独立的托管节点上,这是减轻源站压力最直接有效的方法。

把不变或者很少变化的文件交给CDN或者对象存储进行分发。域名层面拆分静态域名,图片、脚本、样式表统一回源至存储桶或CDN边缘节点,源站只负责处理动态接口和渲染逻辑。CDN边缘缓存命中之后,终端请求就不会再穿透到源站了,源站的连接数、CPU以及出网带宽都会明显降低。
缓存策略要根据不同的文件类型来制定。图片、字体、PDF等可以设置较长的缓存周期,配合内容哈希命名来实现强缓存;HTML入口文件的缓存时间应该短一些,以免发布之后更新不及时。开启Gzip或者Brotli压缩,合并多余的请求,合理设置Cache-Control、Expires和Vary头,可以减少传输体积和回源次数。跨域字体要正确配置CORS,防止浏览器拦截。
对象存储可以作为源站或者二级源使用,根据实际流量计费,扩容不需要调整服务器规格。结合CDN的回源超时、失败重试以及带宽封顶配置,可以避免突发流量把源站打挂。版本发布的时候用哈希文件名来代替覆盖更新,这样可以利用长缓存,也可以保证用户能够及时得到新的文件。
上线之后要关注回源率、边缘命中率、带宽构成以及源站CPU的变化情况。当回源率一直很高的时候,就要检查缓存规则、查询参数过滤和Cookie配置。静态资源托管本身不能解决动态接口的压力问题,但是可以把服务器资源集中起来给核心业务使用,整体的可用性也就提高了。