CDN配置常见问题排查:缓存不生效、HTTPS证书、回源失败

王尘宇 问题解答 34

CDN配置常见问题排查:缓存不生效、HTTPS证书、回源失败-第1张图片-王尘宇

配了CDN快一周了,打开Chrome DevTools一看,图片还是从源站地址走的,缓存命中率稳稳地显示0%。这就很尴尬了——CDN的钱花了,CDN的活没干。

这种情况我遇到过不下五次,每次排查方向不一样但套路差不多。下面把最常见的三个CDN问题捋一遍,每个都带具体的排查命令,直接抄就能用。

Q1:CDN配好了但缓存一直不生效

症状:资源URL已经是CDN域名了,但每次请求都回源,X-Cache头显示MISS。

排查第一步:看响应头

curl -I https://cdn.example.com/images/logo.png

关键看三个头:

  • X-CacheX-Cache-Status:HIT是命中,MISS是没命中。如果一直是MISS,往下查。
  • Cache-Control:源站返回的缓存策略。如果值是 no-cacheno-storeprivate,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就能把每一层都单独拎出来验证。别一上来就想着改配置,先用命令把问题定位到具体是哪一层。

标签: CDN 缓存 https 回源 问题排查

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~