返回博客列表

图片多的网站怎么用CDN?缓存、格式和加载速度怎么测

CdnChart 技术团队发布于 2026-09-2717 分钟阅读
图片多的网站怎么用CDN?缓存、格式和加载速度怎么测

图片站、电商网站、作品集和资讯网站接入CDN以后,最容易出现一种错觉:图片已经从CDN节点返回,缓存状态也是HIT,网站就应该很快。

实际打开页面,却还是要等。商品列表一张张往外蹦,首屏大图半天才出现,手机流量下尤其明显。

这并不矛盾。CDN解决的主要是“从哪里把图片传给用户”,但一张图片最终多久显示出来,还取决于它有多大、浏览器下载了哪个尺寸、是否命中缓存、什么时候开始请求,以及页面同时抢带宽的资源有多少。

所以,图片多的网站使用CDN,不能只完成“把图片域名接入CDN”这一步。真正有效的方案应该同时处理三层问题:

  1. 交付层:图片有没有从离用户较近的CDN节点返回;

  2. 文件层:图片的尺寸、格式和压缩质量是否合理;

  3. 页面层:首屏图片有没有被优先加载,非首屏图片有没有延后请求。

如果只优化其中一层,测试结果往往会出现“节点挺快,页面还是慢”。

先说答案:图片多的网站应该怎样接入CDN

一套比较稳妥的做法是:

  • 使用独立图片域名,例如img.example.com,并让页面中的图片地址真正指向这个域名;

  • 在CDN上缓存公开图片,稳定不变的图片使用较长缓存时间;

  • 图片内容更新时更换文件名或版本号,不依赖用户手动清理缓存;

  • 按页面展示宽度生成多个尺寸,避免手机加载桌面大图;

  • 照片优先评估WebP或AVIF,同时保留兼容格式;

  • 首屏主图不要懒加载,屏幕下方的图片再使用loading="lazy";

  • 用真实图片URL分别测试冷缓存、热缓存、不同地区和不同运营商;

  • 最后回到浏览器检查LCP、图片总字节、请求顺序和布局偏移。

这里面没有哪一条特别神秘,难点在于它们必须配合。比如,一张4000像素、3MB的商品图即使命中附近节点,也不适合直接塞进宽度只有360像素的手机卡片里。

不同图片,不应该使用同一套策略

图片多的网站通常不是只有一种图片。Logo、商品缩略图、首屏横幅和高清原图的用途不同,缓存和加载方式也应该不同。

图片类型

典型特点

更合适的处理方式

Logo、图标

文件小、修改少、全站重复使用

长缓存;文件名带版本或内容哈希;图标可评估SVG

列表缩略图

数量多、展示尺寸固定

预生成少量标准尺寸;WebP/AVIF;非首屏懒加载

商品主图、内容封面

对转化和阅读很重要

保证清晰度;按容器输出尺寸;优先加载首屏主图

首页横幅、Hero图

常常是LCP元素

不要懒加载;控制文件大小;必要时提高请求优先级

图集、详情大图

用户滚动后才会看到

懒加载;逐步加载;避免页面初始阶段全部下载

用户上传原图

尺寸与格式不可控

上传后转码、纠正方向、去除不必要元数据并生成衍生图

高清下载原图

文件大,但用户主动获取

与页面预览图分离;按需下载;检查Range请求与流量成本

最常见的浪费,是为了省事只保存一份原图:列表页、详情页、弹窗和手机端全部引用它。这样虽然URL管理简单,却会让用户在每个场景都为最大尺寸买单。

图片域名接入CDN后,先确认流量真的走了节点

网站配置了img.example.com的CNAME,不代表所有图片都已经获得加速。旧页面可能仍引用源站地址,CSS背景图可能使用另一个域名,第三方编辑器上传的图片也可能绕过新域名。

接入后至少检查四件事:

页面是否真的使用CDN图片地址

打开浏览器开发者工具的Network面板,筛选Img,查看图片请求的Host。也可以查看页面源代码,搜索旧的源站域名。

需要特别留意:

  • HTML中的src和srcset;

  • CSS中的background-image;

  • JavaScript运行后插入的图片;

  • Open Graph分享图和结构化数据中的图片;

  • 富文本内容里历史遗留的绝对地址。

DNS是否已经指向CDN

可以查看CNAME链:

dig img.example.com CNAME +short
dig img.example.com A +short

不同网络和地区可能被调度到不同节点IP,这是CDN的正常工作方式,并不要求全球用户得到同一个IP。如果需要判断当前域名是否已经接入CDN,可使用CDNChart的CDN检测工具,再结合服务商控制台中的CNAME状态核对。

HTTPS证书和访问权限是否正常

图片域名需要正确的HTTPS证书。页面本身使用HTTPS时,如果图片仍通过HTTP加载,浏览器可能拦截混合内容。

如果图片配置了防盗链、签名URL或Referer白名单,还要测试正常页面、搜索引擎抓取、社交分享和需要展示图片的第三方渠道。不要因为防盗链规则过严,让真实用户或搜索引擎拿到403。

响应来自节点还是源站

查看响应头中的缓存状态、Age、Via或服务商自定义头,再对照源站日志。如果每次访问都回源,即使域名经过CDN,源站压力和访问延迟也不会真正降下来。

关于接入验证的完整步骤,可以参考《CDN加速有没有生效?接入后这样检查》。

图片缓存怎么设置,既快又不会更新失败

图片通常适合缓存,但“缓存时间越长越好”只说对了一半。长缓存的前提是:图片内容变了,URL也跟着变。

不再修改的图片,可以使用长缓存

如果文件名中带有版本或内容哈希,例如:

/products/sku-1280.a84f2c.webp
/assets/logo.v5.svg

文件内容发生变化时会生成新URL,旧文件就可以安全地设置较长缓存:

Cache-Control: public, max-age=31536000, immutable

这里的31536000是一年。它适合“同一个URL下内容永远不变”的静态资源,不应该不加判断地用于所有图片。

同名图片会被覆盖,就不要盲目设置一年

如果后台上传新商品图后仍然使用:

/products/123.jpg

浏览器和CDN可能继续使用旧缓存。此时有三种办法:

  • 推荐:更新图片时改成新文件名或新的版本路径;

  • 次选:URL增加可控版本,例如123.jpg?v=20260919;

  • 临时处理:上传后调用CDN刷新接口,并配合相对较短的TTL。

版本参数是否进入缓存键,要按CDN配置核实。如果CDN忽略查询参数,?v=2和?v=3可能仍被视为同一个缓存对象;如果CDN把所有参数都纳入缓存键,无意义的追踪参数又可能制造大量重复缓存。

图片处理参数必须进入缓存键,但不能无限组合

动态图片服务常见这样的URL:

/photo/123.jpg?w=640&format=webp&q=80

宽度、格式和质量改变了返回内容,通常必须参与缓存键。否则,请求640像素WebP的用户可能拿到1280像素JPEG,甚至出现响应格式和Content-Type不匹配。

但也不要允许任意尺寸。攻击者或爬虫可以不断请求w=641、w=642、w=643,生成大量衍生文件和缓存对象。更稳妥的做法是将尺寸限制在几个业务档位,例如:

320 / 480 / 640 / 960 / 1280 / 1920

质量也可以固定为少量预设,而不是接受任意数字。这样既提高缓存复用率,也方便估算图片处理和存储成本。

检查妨碍缓存的响应头

如果图片一直显示MISS或绕过缓存,重点检查:

  • Cache-Control: private、no-store或no-cache;

  • 响应中不必要的Set-Cookie;

  • CDN规则是否只缓存特定后缀;

  • 请求是否带鉴权信息;

  • URL参数是否导致每次生成新缓存键;

  • 源站是否返回错误状态或不稳定的重定向。

不同服务商对这些响应头的默认处理并不完全相同。例如,Cloudflare在其默认缓存行为文档中列出了常见可缓存文件扩展名,也说明了private、no-store、no-cache、max-age=0和Set-Cookie等情况对默认缓存行为的影响。实际部署时仍应以你所使用CDN的官方文档和当前规则为准。

如果不确定HIT、MISS和Age分别代表什么,可继续阅读《CDN缓存命中怎么看?HIT、MISS和Age怎么理解》。

JPEG、PNG、WebP和AVIF应该怎么选

图片格式不是越新越好,也不是把所有图片批量转成WebP就结束了。应该比较的是:在用户可以接受的画质下,哪个格式的文件更小、生成成本合理,并且目标浏览器能够正常显示。

JPEG:照片类内容仍然实用

JPEG兼容性好,适合照片和连续色调图片。它不支持透明通道,反复编辑和重新保存也会积累有损压缩痕迹。

如果现有图片已经是经过合理压缩的JPEG,不必为了“格式统一”强行放大、重新编码多次。先看最终字节数和视觉效果。

PNG:适合透明或需要无损的内容,但容易过大

PNG适合透明图、界面截图和需要无损保真的内容。对于摄影照片,大尺寸PNG通常非常重。

一个常见问题是设计软件导出了一张带透明背景的超大PNG,但页面实际背景固定且不需要透明。这类图片改用JPEG、WebP或AVIF,往往比调CDN参数更能减少下载量。

WebP:兼顾照片、透明和广泛兼容性

WebP支持有损、无损和透明通道。Google的WebP官方说明介绍了它的压缩能力和相关工具。对多数面向现代浏览器的网站,WebP通常是容易落地的一档格式。

但不要根据宣传比例直接估算自己的节省量。商品图、插画、文字截图和已经高度压缩的JPEG,转换后的收益可能完全不同。

AVIF:体积可能更有优势,但必须用真实图片试

AVIF在一些照片和复杂图像上能得到更小文件,但编码时间、解码表现、画质参数以及你的图片处理服务能力都需要评估。对于后台即时生成大量衍生图的网站,还要看转码CPU成本和首次生成延迟。

实用的选择方法不是争论“WebP和AVIF谁更先进”,而是从真实业务图片中抽样:人像、商品、深色图、细节丰富的照片、文字截图各选一些,在相近视觉质量下比较文件大小和生成时间。

SVG:适合Logo和图标,不适合所有图片

SVG在矢量Logo、图标和简单插画上很有优势,可以在不同分辨率下保持清晰。用户上传的SVG可能包含脚本或外部引用,必须进行安全清洗,不能把它当作普通图片无条件开放上传和展示。

只转换格式还不够,图片尺寸往往更重要

如果页面中的图片只显示为360×240像素,却下载了一张4000×2667像素的原图,即使换成WebP,仍然可能浪费大量流量。

浏览器提供了srcset和sizes,可以根据屏幕与布局选择更合适的候选图片。一个同时提供AVIF、WebP和JPEG后备格式的示例是:

<picture>
  <source
    type="image/avif"
    srcset="/images/product-640.avif 640w,
            /images/product-1280.avif 1280w">
  <source
    type="image/webp"
    srcset="/images/product-640.webp 640w,
            /images/product-1280.webp 1280w">
  <img
    src="/images/product-1280.jpg"
    srcset="/images/product-640.jpg 640w,
            /images/product-1280.jpg 1280w"
    sizes="(max-width: 768px) 100vw, 50vw"
    width="1280"
    height="853"
    loading="lazy"
    decoding="async"
    alt="黑色双肩包正面和侧面细节">
</picture>

这段代码里有几个容易被忽略的点:

  • srcset告诉浏览器有哪些图片尺寸可选;

  • sizes描述图片在不同布局下大约占多宽,而不是图片文件本身多宽;

  • width和height帮助浏览器提前预留比例,减少图片出现时页面跳动;

  • alt应该描述图片内容和用途,不能为了SEO堆砌“图片CDN加速”等无关关键词;

  • JPEG的src和srcset为不支持新格式的环境提供后备。

MDN的响应式图片说明详细介绍了srcset、sizes和picture的工作方式。上线前最好在手机、平板和桌面不同视口下检查浏览器实际选择的文件,而不是只确认页面“能显示”。

懒加载不是越多越好,首屏主图尤其不能乱用

对于屏幕下方的图片,原生懒加载可以减少首屏阶段的请求:

<img
  src="/images/gallery-960.webp"
  width="960"
  height="640"
  loading="lazy"
  decoding="async"
  alt="产品内部结构展示">

但首屏横幅、商品主图或文章封面如果是页面的最大内容元素,很可能参与LCP。给它加上loading="lazy",可能让浏览器更晚才开始下载,反而拖慢用户看到主要内容的时间。

首屏关键图片可以正常加载,并在确有必要时谨慎使用:

<img
  src="/images/hero-1280.webp"
  width="1280"
  height="720"
  fetchpriority="high"
  alt="秋季新品系列展示">

fetchpriority="high"不是给所有首屏图片统一加的“加速开关”。优先级过多就等于没有优先级,还可能挤占CSS、字体或其他关键资源的带宽。web.dev在浏览器原生图片懒加载说明中明确建议,不要对首屏可见图片使用懒加载;其LCP优化指南也强调,LCP资源需要尽早被发现并开始加载。

如果主图藏在CSS背景中或等JavaScript运行后才插入,浏览器发现它的时间也会变晚。这时即使CDN节点响应很快,LCP仍可能不好看。

图片CDN测速,至少要测四类对象

只测一张几十KB的Logo,不能代表图片网站的真实体验。建议从线上业务中选择:

  • 一张10KB至50KB的小图标或小缩略图;

  • 一张常见列表图;

  • 一张首屏主图;

  • 一张详情页大图或高清预览图。

这些文件不需要刻意凑到某个大小,应该代表真实用户最常下载的内容。测试时记录URL、文件类型、像素尺寸和文件字节数,避免过几天图片被替换后还拿新旧结果直接对比。

第一次和第二次请求要分开看

第一次请求可能是冷缓存,需要CDN回源;第二次请求可能已经命中节点。两者都重要,但回答的问题不同:

  • 冷缓存反映回源链路、源站处理和缓存填充速度;

  • 热缓存反映边缘节点向用户交付图片的能力。

连续请求同一个公开图片URL,可以快速查看响应头与耗时:

curl -sS -D /tmp/image-headers.txt -o /dev/null \
  -w 'remote_ip=%{remote_ip}\ncontent_type=%{content_type}\nsize=%{size_download}\ndns=%{time_namelookup}\nconnect=%{time_connect}\ntls=%{time_appconnect}\nttfb=%{time_starttransfer}\ntotal=%{time_total}\n' \
  'https://img.example.com/products/sku-1280.webp'

sed -n '1,30p' /tmp/image-headers.txt

重点查看:

  • Content-Type是否与实际格式一致;

  • Content-Length或实际下载字节是否符合预期;

  • Cache-Control是否允许需要的缓存;

  • Age是否增长;

  • 服务商的缓存头是否从MISS变为HIT;

  • Vary是否与格式协商方式匹配;

  • ETag或Last-Modified是否合理;

  • TTFB和总耗时在多次请求中是否稳定。

不要为了避免缓存而每次给URL加随机参数,再据此判断CDN速度。随机参数可能创建新缓存对象,测到的始终是回源表现。

不要只在办公室测一次

北京联通访问快,不代表广州移动、成都电信或海外用户也快。图片CDN测试至少应该覆盖真实用户集中的地区、运营商和访问高峰。

可以把代表性图片URL放入CDNChart网站测速,观察不同地区和网络下的连接、TTFB、下载耗时与成功情况。测试时建议保留:

  • 测试时间与时区;

  • 测试地区和运营商;

  • 解析或连接到的IP;

  • HTTP状态码;

  • 缓存状态;

  • TTFB、总耗时和下载字节;

  • P50、P95以及失败请求。

一次最快结果只能说明“某次请求很快”。要判断图片交付是否稳定,应连续采样,并把缓存HIT与MISS分组。具体方法可参考《网站有时快有时慢,CDN测速应该怎么测》。

CDN图片很快,为什么页面看起来还是慢

单张图片测速关注的是一个URL,页面加载却是几十甚至几百个资源共同竞争的过程。二者不能互相代替。

在浏览器开发者工具中打开Network面板,建议检查:

页面一共下载了多少图片

分别查看请求数量、传输字节和资源原始大小。压缩率不错但页面一次请求200张图,首屏仍然可能被挤占带宽。

首屏主图什么时候开始请求

如果HTML解析很久以后才发现主图,或要等待一段JavaScript执行后才插入,CDN无法补回前面失去的时间。瀑布图中,主图请求开始时间往往比单看下载时长更有价值。

手机上是否下载了桌面大图

切换不同视口后检查图片的实际URL和Content-Length。页面CSS把4000像素图片缩成300像素显示,不等于浏览器只下载了300像素版本。

LCP元素是不是一张图片

如果LCP元素是首屏大图,就应继续分解:服务器响应是否慢、图片是否很晚才被发现、下载是否过大、下载后是否还因脚本或动画延迟显示。

图片出现时页面有没有跳动

图片缺少明确尺寸时,浏览器开始布局时不知道要预留多少空间。图片加载后,文字和按钮被挤走,就会造成布局偏移。给图片提供正确的宽高或aspect-ratio,通常比单纯提高CDN速度更直接。

CDN测速与整页测速解决的问题不同,二者的边界可以参考《CDN测速和网站测速有什么区别?分别能测出什么》。

一张排查表:从现象找到真正的问题

看到的现象

更可能的原因

下一步检查

缓存是HIT,但图片仍加载很久

文件太大、节点吞吐不足或网络拥塞

比较下载字节、下载耗时、不同地区P95

TTFB很低,页面主图仍出现很晚

图片发现太晚、被懒加载或前面有资源竞争

查看浏览器瀑布图和LCP资源开始时间

每次都是MISS

TTL、响应头、Cookie、缓存规则或缓存键有问题

检查Cache-Control、Set-Cookie和CDN规则

手机上特别慢

下载了桌面尺寸,或移动运营商节点表现差

检查srcset/sizes和移动网络实测

更新图片后仍显示旧图

同名覆盖、浏览器与节点仍有旧缓存

改用版本化URL或执行精准刷新

一些浏览器图片打不开

格式回退、Content-Type或协商配置错误

检查picture后备格式、响应头和目标浏览器

图片数量一多就卡

首屏请求过多,非关键图片没有延后

只优先首屏关键图,非首屏启用懒加载

CDN缓存对象和账单暴增

任意尺寸、质量和参数组合造成缓存碎片

限制尺寸档位,规范参数并收紧缓存键

图片加载后文字和按钮移动

没有预留图片尺寸

设置width/height或aspect-ratio

本地测试快,真实用户仍投诉

测试地区、网络和时段不代表用户

增加真实地区、运营商、P95和RUM数据

一套可以落地的改造顺序

如果网站已经在线,不建议第一天就把全站图片格式、域名和URL规则全部改掉。变化太多时,一旦图片无法显示,很难快速确定是哪一层出了问题。

可以先选访问量较高、结构比较稳定的一类页面做小范围改造:

  1. 统计该页面当前的图片请求数、总字节、LCP和主要图片耗时;

  2. 选出Logo、缩略图、首屏主图和详情图四类资源;

  3. 让图片URL真正经过CDN,并验证证书、状态码和缓存头;

  4. 为高频展示位置生成固定尺寸,先避免明显的超规格下载;

  5. 对真实样本比较JPEG、WebP和AVIF的画质、字节与转码成本;

  6. 给不会原地修改的文件使用版本化URL和长缓存;

  7. 首屏关键图取消懒加载,非首屏图片再分批延后;

  8. 重复进行单图、多地区和完整页面测试;

  9. 确认搜索抓取、社交分享、防盗链和图片更新流程没有被破坏;

  10. 指标稳定后再逐步覆盖其他页面。

前后对比时,除了平均加载时间,还应记录图片总字节、缓存命中、不同地区P95、LCP和失败率。否则,很容易因为测试当天网络较好,把一次偶然波动当成改造收益。

常见问题

图片放到对象存储后,还需要CDN吗?

对象存储解决的是文件保存和源站访问,CDN负责将可缓存内容分发到更靠近用户的位置。用户分布广、图片访问量大或源站距离较远时,CDN通常仍有价值。是否值得接入,要用真实用户地区、缓存命中、回源流量和费用共同判断。

图片缓存时间设置多久合适?

没有适用于所有网站的固定答案。文件名带内容哈希或版本、同一URL内容永不变化时,可以设置很长的缓存时间;同名图片经常覆盖,则应使用版本化URL,或采用更短TTL并建立可靠的刷新流程。不要只给出“缓存30天”却不考虑更新机制。

WebP和AVIF一定比JPEG小吗?

不一定。结果与原图内容、编码器、质量参数和原JPEG压缩程度有关。正确做法是在相近视觉质量下对真实样本比较,不要只看文件扩展名。

图片已经HIT,为什么TTFB还是高?

可能连接到的节点较远、节点负载或网络路由不理想,也可能缓存状态头代表的是上层缓存而非最靠近用户的边缘层。记录响应IP、地区、运营商和多次P95,再判断是偶发波动还是持续问题。

所有图片都应该懒加载吗?

不应该。屏幕下方的图片适合懒加载,首屏主图或可能成为LCP的图片通常应该尽早请求。首屏图被懒加载,是“CDN很快但页面看起来慢”的常见原因之一。

图片CDN应该测Ping还是HTTP下载?

Ping只能提供基础网络往返时间线索,不能代表HTTPS握手、缓存、TTFB和文件下载。图片加速应以真实图片URL的HTTP请求为主,同时记录文件大小、缓存状态、TTFB、下载耗时和成功率。

图片用了CDN,会直接提升SEO排名吗?

CDN本身不是一个可以保证排名提升的开关。它可能改善图片交付速度、稳定性和用户体验,但页面是否获得搜索流量还取决于内容质量、抓取与索引、移动端体验、图片语义、内部链接等多种因素。图片alt应准确描述内容,不要为了关键词密度写成一串搜索词。

当图片网站出现加载慢时,可以先拿一张首屏主图做完整检查:它从哪个域名请求、解析到哪个节点、是HIT还是MISS、下载了多少字节、在瀑布图里何时开始、是不是LCP元素。把这一条链路看清楚,通常比一开始就批量调整所有CDN参数更容易找到真正的瓶颈。

  • 图片CDN加速
  • 网站图片加载慢
  • 图片缓存怎么设置
  • 图片加载速度测试
  • 图片CDN测速
  • WebP和AVIF
  • CDN图片缓存