做海外市场的朋友,最头疼的问题之一就是用户说网站打开慢。图片转半天,视频一直缓冲,用户体验直接打折扣。AWS CloudFront 就是干这个的——说白了就是一套全球分发网络,把内容提前放到离用户最近的服务器上,让访问速度提上来。
CloudFront 到底怎么加速?
原理不复杂。你源站(比如EC2或S3存储桶)可能在新加坡或美西,一个伦敦用户来看你网站,数据要跨半个地球,当然慢。CloudFront 在全球有200多个边缘节点,用户请求会被路由到离他最近的节点。如果那个节点已经缓存了你网站的内容,就直接返回,不用回源站取数据,响应时间能大幅缩短。
但有个细节值得留意:路由到哪个边缘节点,不只看地理位置远近,CloudFront 还会综合网络条件和可用性来做判断。有时候看似更远的节点反而链路质量更好,这都是服务自动做的优化,不用你操心。
基础配置:先把“门禁”设好
创建分发(Distribution)的时候,几个关键点得盯住。源站地址填你的服务器或S3存储桶地址。如果源站是S3,记得启用“源访问控制”(OAC),相当于给CloudFront发了一张专属门禁卡,让它可以访问你的S3,同时把S3桶对外公开权限关掉,这样东西存在S3里是私密的,只有CloudFront能取,安全性高很多。
缓存行为(Cache Behavior)里,默认TTL(Time To Live,即内容在边缘节点上保留多久再回源检查更新)设多久?按文件类型来:图片、CSS、JS这类静态资源,设长一点(比如86400秒,也就是一天),命中率高,回源少;API接口这类动态内容,TTL设短(比如300秒)甚至不缓存。
让你的内容尽可能留在边缘缓存里
缓存命中率越高,源站压力越小,用户访问也越快。这里有几个实操技巧:
一个是用好缓存键(Cache Key)策略。缓存键就是区分不同内容的“身份证号码”。如果同一个URL后面带着一堆无关的查询参数(比如UTM跟踪参数),默认会把每个不同参数都当成不同内容来缓存,导致缓存碎片化,命中率下降。可以在缓存策略里把这些无关参数排除掉,只保留真正影响内容的参数做缓存键。
另一个是开启“分层缓存”(Tiered Caching)。CloudFront 的架构分两层:离用户最近的边缘节点(POP)缓存容量较小,热数据放这儿;再往上一层是区域边缘缓存(Regional Edge Cache),容量大很多。开启分层缓存后,POP没命中的请求会先去区域缓存找,找不到才回源站,这样大大减少了直接回源的次数,对源站友好得多。
如果用户只在特定区域,可以省点钱
默认情况下,CloudFront 用全球所有边缘节点。如果你的目标用户只在北美或欧洲,可以把“价格类别”(Price Class)从“全球”改成“仅北美和欧洲”,排除掉费用更高的边缘区域,账单能降下来。性能不会受影响,因为原本用户也只在那些区域访问。
动态内容怎么办?用 Lambda@Edge 在边缘处理
不是所有内容都能缓存。用户登录、购物车、个性化数据,这些得回源站。但可以在边缘节点上用 Lambda@Edge 做预处理。比如根据用户设备的 User-Agent 头,在边缘就判断好该返回 PC 版还是移动版页面,不用每次都回源站去判断。或者根据请求来源国家,在边缘直接做地理位置重定向。
中国大陆用户访问的特殊性
如果你的业务覆盖中国大陆用户,有几点得注意:CloudFront 中国区有四个边缘节点(北京、上海、中卫、深圳),但中国区不能用默认的 *.cloudfront.cn 域名提供服务,必须绑定已完成 ICP 备案的自定义域名。而且中国区暂时不支持 AWS 的证书管理服务(ACM),得自己找第三方 CA 机构申请 SSL 证书,然后上传到 IAM 里使用。这一步容易踩坑,提前准备。