- 描述:在站点启用CDN后,图片在浏览器或移动端偶发或持续不显示,可能表现为404、403、空白占位或跨域拒绝等。
- 影响:影响用户体验、SEO、页面首次内容绘制(FCP)和带宽节约目的受损。
- 范围判断:先判断是全部图片不显示、部分路径不显示还是按用户区域/网络运营商出现差异。
- 优先级:以生产环境可复现问题的频率和受影响页面流量来决定排查优先级。
- 关联组件:问题往往涉及域名(DNS)、CDN配置、源站(VPS/主机)、防火墙、证书/HTTPS、缓存头与路径权限。
- 输出:初步记录受影响URL样本、时间窗口与错误码,方便后续复现与日志对比。

- CNAME/A记录错误:图片子域名(如 img.example.com)需指向CDN提供的CNAME,若误指向源站IP会绕过CDN或导致证书不匹配。
- TTL和解析延迟:DNS TTL过大或修改后未完成解析(通常几分钟到24小时),会导致部分用户访问旧记录。
- 根域CNAME限制:部分DNS提供商不允许根域使用CNAME,错误做法可能导致解析失败。
- IPv6/IPv4 混合:CDN同时有IPv4/IPv6出口,域名解析到单一不可访问的地址会导致部分用户访问失败。
- DNSSEC和解析链问题:开启DNSSEC未正确配置或中间解析器不支持,会出现解析失败。
- 检查命令举例:dig img.example.com +short; nslookup; 使用在线DNS检测工具检查全球解析一致性。
- 证书不匹配:使用CDN时需确保证书覆盖CDN域名或启用CDN的通配证书,否则浏览器会阻拦加载。
- SNI/多证书问题:老旧客户端或代理不支持SNI时,可能拿到错误证书导致资源加载失败。
- 源站证书不可达:部分CDN选项需要在回源与边缘启用HTTPS,若源站证书自签或过期,CDN与源站间回源失败。
- 混合内容阻止:页面通过HTTPS加载,若图片通过HTTP回源或URL为http,会被浏览器阻止显示。
- TLS版本与加密套件:部分CDN或浏览器对TLS版本要求不同,强制禁用TLS1.0/1.1需确保客户端兼容。
- 检查方法:curl -I -L --resolve img.example.com:443:EDGE_IP https://img.example.com/path.jpg 查看证书链与响应头。
- 缓存头缺失或设置错误:源站未返回合理Cache-Control或Expires,导致CDN不缓存或频繁回源,回源失败时图片不可用。
- 源站错误码穿透:源站返回404/403/500但CDN误配置为不缓存错误响应,用户看到错误而非缓存副本。
- 缓存清理/失效频繁:频繁使用Purge会使CDN回源压力增大,遇到源站不稳定就会造成图片加载失败。
- CDN自定义规则冲突:URL重写、Query String处理或移动端适配规则可能导致请求映射到错误资源。
- 边缘节点一致性问题:部分边缘节点缓存失效或配置未下发,会表现为地区性图片不显示。
- 下表演示常见响应与含义(示例数据):
| HTTP 状态 | 可能原因 | CDN 响应头示例 |
|---|---|---|
| 200 | 正常缓存/命中 | x-cache: HIT, Cache-Control: public, max-age=31536000 |
| 404 | 资源路径错误或被防盗链拦截 | x-cache: MISS, Cache-Control: no-store |
| 502/503 | 源站不可达或回源异常 | x-cache: ERROR, Retry-After: 30 |
- 源站IP被封禁:如果在源站防火墙(iptables、ufw)中误封了CDN回源IP,会导致CDN无法拉取图片。
- WAF规则误拦截:WAF或WAF型CDN策略可能将带有特定Referer或Header的请求识别为恶意,返回403。
- DDoS防护陷阱:激进的DDoS黑洞或速率限制可能在流量上升时丢弃部分图片请求。
- IP白名单策略:部分CDN提供了回源IP列表,需将其列入源站允许列表,否则会被阻断。
- 日志与告警:检查防火墙日志(/var/log/ufw.log、/var/log/messages)和CDN控制台的请求拦截记录。
- 示例IP操作:将Cloudflare回源IP段加入iptables:iptables -I INPUT -s 173.245.48.0/20 -j ACCEPT(示例,请按照CDN官方IP范围配置)。
- 路径映射错误:CDN配置中若设置了路径重写(如去掉前缀 /static/),可能找不到真实资源。
- 权限/文件系统问题:源站文件权限不当(如 600 而非 644)或NFS挂载延迟会导致返回403/500。
- 热链接防护:Referer白名单策略会阻止来自其它域名的图片请求,导致跨站点显示失败。
- CORS缺失:若图片通过Canvas等方式被跨域访问,浏览器要求图片响应包含 Access-Control-Allow-Origin,缺失则无法使用。
- URL签名或防盗链参数错误:带有过期签名的图片URL在CDN边缘或源站会返回403。
- 检查方法:使用浏览器开发者工具Network查看请求头、响应头、Referer与CORS相关字段。
- 步骤一:用curl或浏览器复现并记录HTTP状态与响应头:curl -I -L https://img.example.com/1.jpg -o /dev/null -w "%{http_code}\n"。
- 步骤二:DNS解析检查:dig +short img.example.com; dig +trace img.example.com; 比对是否指向CDN CNAME。
- 步骤三:回源连通性测试:从CDN控制台或外网机器执行 curl -v --resolve img.example.com:443:ORIGIN_IP https://img.example.com/1.jpg 查看回源是否成功。
- 步骤四:检查源站日志:tail -n 200 /var/log/nginx/access.log | grep "img/1.jpg";查看是否有CDN回源请求或被阻断记录。
- 步骤五:快速修复示例(Nginx 配置片段):
code:server { listen 80; server_name img.example.com; location / { root /var/www/images; add_header Cache-Control "public, max-age=31536000"; } }(将实际配置按格式写入 nginx 配置文件并重载 nginx -s reload)
- 步骤六:验证与回归:修改后清理CDN缓存并再次从多个节点验证,记录并对比加载时间与命中率。
- 案例背景:客户站点 www.case-site.com 启用Cloudflare为img.case-site.com做图片加速;源站为VPS:Ubuntu 20.04,Nginx 1.18,配置:2 vCPU,4GB 内存,公网IP 203.0.113.45。
- 故障现象:特定地区用户反馈图片不可见,浏览器显示403或空白占位。
- 排查发现:源站日志显示来自Cloudflare回源IP被iptables DROP,日志示例:Mar 10 12:00:01 kernel: DROP IN=eth0 OUT= MAC=... SRC=173.245.48.0 DST=203.0.113.45 ...。
- 解决步骤:1) 从Cloudflare官方列表下载回源IP段;2) 将所有回源IP加入iptables白名单:for ip in $(cat cf_ips.txt); do iptables -I INPUT -s $ip -j ACCEPT; done;3) 确认Nginx返回头添加缓存策略:add_header Cache-Control "public, max-age=2592000"; 4) 在Cloudflare面板清理缓存并开启缓存命中统计。
- 成果与数据:处理前平均图片加载失败率 12%,处理后失败率降至 0.5%;页面首屏加载时间(FCP)由 1.8s 降至 0.9s(测试节点:上海、北京、广州)。
- 经验小结:遇到CDN图片不显示,先从DNS->证书->回源连通->防火墙->缓存策略顺序排查,记录每步结果并在更改前备份配置与防火墙规则。