前阵子有个人说他企业网站太慢了,客户打不开,问我是不是该升级服务器。
他把网址发过来。打开首页一看,好家伙,一张 banner 图 12MB。一张图比我整个网站还大。问他这图哪来的,他说设计师给的,直接传上去了。
这种事儿遇到的太多了。很多人觉得网站慢就是服务器不行,其实慢的原因经常不在服务器上,而在别的地方。今天聊聊这个。
很多网站首页的横幅大图,随便看看都是 5MB、8MB,十几兆的也不少。一个用户打开你网站,先要下载这张图,才能看到内容。12MB 在大多数网络情况下光下载就要好几秒,这还只是一张图。首页通常还有好几张图、CSS、JS,全加一起,用户还没看清页面长什么样就已经不想等了。
问题是,这种大图根本不必要。
一张 1920px 宽的网页横幅,存成 JPEG 质量 80%,通常也就 300-500KB。如果要更小,转 WebP 格式,同样画质能再砍一半到 150-250KB。12MB 跟 300KB,差了 40 倍,但图片质量肉眼很难分辨区别。而用户对网站速度的感知差别就是你网站跟别人网站的差别。
但很多人不懂这个:
能,也没完全能。
CDN 可以让你 12MB 的图从离用户最近的节点传输,确实比从源站跨省传输快一些。但 12MB 就是 12MB,数据量不变。
就像快递。CDN 相当于仓库从广州搬到了你隔壁城市。同样一个 12MB 的文件,从隔壁城市送过来肯定比从广州快,但它还是 12MB,该搬多久还是得搬多久。
先把图片缩小、格式搞对,这是基础。图片控制在合理大小之后,再上 CDN,效果才明显。跳过第一步直接上 CDN,属于浪费。
假如图片你已经优化好了,每张图就两三百 KB,但你还是觉得有些地方的客户反馈慢。
这就要看你的服务器在哪儿、客户在哪。
曾经遇到过这样的案例,服务器在广州,老板在北京。他自己打开后台就感觉比在广州的同事慢半拍。不是因为服务器配置不行,纯粹是物理距离。北京到广州,网络延迟大概 30-40ms,一个页面几十个请求,每个请求多几十毫秒,叠加起来体感就明显了。
这还不是最夸张的。如果你的用户在国外,比如做跨境电商的,服务器在国内,美国用户打开网站延迟能到 200ms 以上。再加上页面资源数量多,加载时间翻好几倍。
下面的内容我会以内容分发网络 CDN 产品为例,具体说说这个问题怎么判断、怎么解决。
CDN,内容分发网络,名字听起来挺唬人,说白了就是把你的静态文件——图片、CSS、JS、视频、字体这些——提前复制到全国甚至全球各地的节点服务器上。
用户访问你的网站时,CDN 调度系统会根据用户的网络位置,自动把请求导到离他最近的节点。文件直接从那个节点返回,不用千里迢迢去源站拉。
举个例子。你的服务器在广州,北京用户请求一张首页 banner 图:
这里有个重要的概念叫回源。
CDN 节点不是一开始就有你的文件的。第一个用户访问的时候,节点发现自己没有缓存这个文件,就去你的源站取一次,存下来,再返回给用户。第二个用户访问就直接从缓存拿了。这个过程是自动的。
回源策略可以配置。比如:
这些配置直接影响加速效果,但很多买 CDN 的人根本不设置,直接用默认配置,效果当然一般。
还有一个功能叫预热。如果你的网站刚更新了一批文件,或者刚上线,可以手动把主要资源推送到各节点,这样第一个访问的人就不会踩「冷缓存」的坑。
日常使用不是必须的,重大更新时顺手做一下就行。
为了让你有个直观感受,模拟一个典型企业官网首页在不同情况下的加载表现。
假设首页有:
资源类型 | 数量 | 大小 |
|---|---|---|
HTML 文档 | 1 个 | 10KB |
图片 | 5 张 | 每张 200KB(已压缩) |
CSS 样式 | 3 个 | 合计 150KB |
JS 脚本 | 4 个 | 合计 300KB |
图标和字体 | 若干 | 合计 100KB |
总共大概 1.5MB 的数据量。服务器在广州。
HTML 先从广州传过来,浏览器解析后发现需要 CSS 和 JS,又去广州取。CSS 解析完发现有背景图片,再去广州取。来来回回,每个文件都要跨半个中国。
根据公开的性能测试数据,类似规模和结构的页面,首屏完全加载大概需要 2-3 秒。这还是网络状况好的时候,遇到晚高峰或者跨运营商,4-5 秒也正常。
HTML 还是从源站(广州)返回——保守估算,假设 HTML 不走缓存。但 CSS、JS、图片、字体这些静态资源,全部从北京的 CDN 节点直接拿。
每个文件延迟大幅降低,而且 CDN 节点通常带宽很大,多个文件可以更高效地并行传输。首屏加载可以压到 1-1.5 秒。
这个差距在用户量大的时候更明显:
就算有 CDN,一张 12MB 的图从北京节点传到北京用户,也要两三秒。首屏还是慢。
这就是为什么一直强调:先优化再加速。CDN 帮你省的是路上的时间,不是文件本身的时间。
坑一:大图不改,直接上 CDN。
CDN 是帮你送快递更快,不是帮快递减重。文件该多大还是多大,源头不解决,加 CDN 效果很有限。
坑二:以为 CDN 万能。
网站慢的原因很多——程序代码效率低、数据库查询慢、第三方接口调用超时、某些插件拖累渲染。CDN 只管静态资源的分发,动态请求该走源站还是走源站。
坑三:买了不配置。
CDN 大体上可以说有默认通用设置,但也可以更详细精确设置:
有些人不看文档直接默认,发现没效果就觉得 CDN 没用。
坑四:开了 CDN 网站样式乱了。
通常是缓存了旧版本的 CSS,新版本没生效。刷新 CDN 缓存或者在文件名上加版本号(像 style.css=v1)就能解决。这是运维习惯问题,不是 CDN 本身的问题。
坑五:不安全访问。
整站已经 HTTPS 的话,CDN 也必须配 HTTPS,否则浏览器会报混合内容警告,用户看到锁没了还以为你网站有问题。
如果你网站打开慢,按这个顺序来:
CDN 不是什么高端技术,就是帮你把文件提前放到离用户近的地方。理解了这个本质,你就知道什么时候该用、怎么用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。