
配了CDN快一周了,打开Chrome DevTools一看,图片还是从源站地址走的,缓存命中率稳稳地显示0%。这就很尴尬了——CDN的钱花了,CDN的活没干。
这种情况我遇到过不下五次,每次排查方向不一样但套路差不多。下面把最常见的三个CDN问题捋一遍,每个都带具体的排查命令,直接抄就能用。
Q1:CDN配好了但缓存一直不生效
症状:资源URL已经是CDN域名了,但每次请求都回源,X-Cache头显示MISS。
排查第一步:看响应头
curl -I https://cdn.example.com/images/logo.png关键看三个头:
X-Cache或X-Cache-Status:HIT是命中,MISS是没命中。如果一直是MISS,往下查。Cache-Control:源站返回的缓存策略。如果值是no-cache、no-store或private,CDN不会缓存。还有max-age=0也是同理。Set-Cookie:很多CDN默认不缓存带Set-Cookie头的响应。如果你的源站每个请求都返回一个session cookie,CDN会认为这个内容跟用户相关,直接跳过缓存。
排查第二步:源站吐了什么缓存头
绕过CDN直接请求源站,看源站的原始响应头:
curl -I -H "Host: www.example.com" http://源站IP/images/logo.png如果源站返回了 Cache-Control: no-store,说明问题在源站配置上。比如Nginx里写了一句:
add_header Cache-Control "no-store, no-cache, must-revalidate";这种情况改一下就行,改成:
add_header Cache-Control "public, max-age=86400";排查第三步:CDN控制台的缓存规则
各CDN厂商(阿里云、腾讯云、又拍云、Cloudflare)都有一个「缓存配置」或「缓存规则」的页面。检查三个点:
- 缓存过期时间是不是设成了0秒
- 文件类型/目录匹配规则有没有把你要缓存的资源排除在外了,比如规则里只写了
.jpg,.png但你的图片是.webp - 是否勾选了「遵循源站缓存头」——如果勾了而源站说no-cache,CDN也不会缓存
Q2:HTTPS证书配置后浏览器报不安全
症状:CDN上配了SSL证书,浏览器访问显示「您的连接不是私密连接」,或者小锁图标是灰色的还有感叹号。
先确认证书本身有没有问题:
curl -vI https://cdn.example.com/ 2>&1 | grep -E "(SSL|subject|issuer|expire)"输出里能直接看到证书的颁发者、过期时间、以及域名是否匹配。如果显示 SSL certificate problem: unable to get local issuer certificate,证书链不完整——CDN上只传了你的域名证书,忘了传中间证书。
再检查是否混合内容(Mixed Content):
这个是最容易漏的。HTTPS页面里引用了HTTP资源,浏览器就会把绿色小锁降级成灰色。排查方法:打开Chrome DevTools → Console → 看有没有 Mixed Content 警告。
常见的混入HTTP的资源:
- 文章里粘贴的外部图片链接(写的是
http://...) - 老式统计代码的script src
- CSS里的字体文件、背景图引用
修法很简单,把资源链接改成协议相对的写法://example.com/img.jpg 而不是 http://example.com/img.jpg,或者直接写成 https://。
CDN与源站证书不匹配:
还有一种情况是CDN配了HTTPS,但CDN回源时走的是HTTP。大部分CDN默认回源协议是「跟随」或「HTTP」,这本身没问题。但如果你在CDN上开了强制HTTPS回源,而源站根本没配SSL或者证书过期了,回源就会失败,CDN返回502。
排查命令:在CDN控制台找「回源配置」→「回源协议」,确认与你源站的实际配置一致。
Q3:CDN回源失败,用户看到502/504
症状:域名解析到CDN了,但访问直接502 Bad Gateway或504 Gateway Timeout。
第一步:确认源站本身能不能访问
绕过CDN,用curl直接打源站IP:
curl -v -H "Host: www.example.com" http://源站IP/如果这个都访问不了,那CDN背不了锅——源站自己挂了。
第二步:检查回源Host设置
这是CDN回源失败最常见的坑。CDN回源时带的Host头和你实际源站的server_name对不上,源站Nginx收到一个不认识的域名,直接返回了默认站点(通常是403或者欢迎页)。
验证方法:
# 模拟CDN回源请求,带上错误的Host头
curl -v -H "Host: wrong-host.example.com" http://源站IP/看源站返回了什么。如果返回的不是你的网站内容,说明Host头没对上。
修法:在CDN控制台找到「回源Host」设置,改成源站实际配置的server_name。多数情况下回源Host应该等于你的源站域名。
第三步:源站有没有做IP白名单/防火墙限制
有些源站(尤其政企客户)配置了严格的访问控制,只允许特定IP访问。CDN的回源IP不在白名单里,请求全被拦了。
各CDN厂商官网都会公布回源IP段,比如阿里云搜索「CDN回源IP段」、Cloudflare的 cloudflare.com/ips。把这些IP段加到源站白名单里。
第四步:回源超时和重试
如果访问偶尔502,不是每次都502,大概率是回源超时。CDN默认的回源超时一般是30秒,如果你的源站某些接口(比如生成报表的PHP脚本)执行超过30秒,CDN等不及就返回504了。
两个方向:
- 在CDN控制台把回源超时调大到60-120秒(不推荐调太大,用户体验差)
- 根源上优化源站响应速度——慢查询加索引、静态化、加缓存层
排查超时问题可以看CDN的访问日志,通常有 upstream_response_time 字段,能直观看到源站花了多久返回。
总结几个顺手命令
这三个问题交叉出现的概率不低,把下面几条命令存下来,出问题的时候按顺序跑一遍:
# 1. 看CDN缓存命中
curl -I https://你的CDN域名/任意资源路径 2>&1 | grep -iE "x-cache|cache-control"
# 2. 看SSL证书
curl -vI https://你的CDN域名/ 2>&1 | grep -iE "ssl|subject|issuer|expire"
# 3. 绕过CDN直连源站
curl -v -H "Host: 你的源站域名" http://源站IP/
# 4. 模拟错误回源Host
curl -v -H "Host: 随便写个域名" http://源站IP/最后说一句,CDN排查的核心思路就一个:把链路拆开,一段一段测。CDN → 源站,中间每一层都可能是锅,但用curl就能把每一层都单独拎出来验证。别一上来就想着改配置,先用命令把问题定位到具体是哪一层。
还木有评论哦,快来抢沙发吧~