请求CDN加速资源时无法命中CDN缓存

问题描述

您使用阿里云CDN加速静态资源时,CDN会将源站上的资源缓存到距离客户端最近的CDN节点上。在配置CDN缓存后,查看详细的请求和返回的报文信息时,发现无法命中缓存。

问题原因

无法命中CDN缓存的原因如下:

  • 客户端请求是动态请求
  • 源站返回强制不缓存的HTTP头
  • 未返回响应头Etag和Last-modified
  • 全站加速未配置静态加速

解决方案

当您在使用CDN加速的缓存配置时,如无法命中CDN缓存,请根据问题原因,参见以下操作进行排查:

  • 客户端请求是动态请求
    如果请求是动态请求,则无法命中CDN缓存。当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。
  • 源站返回强制不缓存的HTTP头
    当源站配置了以下响应头时,即使配置了缓存规则,CDN也不会对该资源进行缓存,因为这些响应头在CDN缓存规则中的优先级较高。
    • 有s-maxage=0、max-age=0、no-cache、no-store、private中的任一种。
      如下图所示,源站响应了no-cache和private导致CDN无法缓存,X-Cache字段为MISS,X-Swift-CacheTime为0。这种情况需要源站删除这个HTTP响应头,具体可以参见Nginx缓存策略设置Apache缓存策略的设置IIS缓存策略的设置方法

    • 有s-maxage或s-maxage=0。
    • 有Pragma: no-cache。
  • 未返回响应头Etag和Last-modified
    当CDN未配置缓存规则时,如果静态文件未返回响应头Etag和Last-modified,则该静态文件不能缓存在CDN节点上。可在源站配置返回Etag和Last-modified,或者直接在CDN上配置缓存规则。如何配置缓存规则,请参见配置缓存过期时间
  • 全站加速未配置静态加速
    全站加速默认为动态加速,动态加速是每次回源的。如果需要进行缓存,则需要配置静态加速,如何配置静态加速请参见配置静态加速。目前配置静态加速支持按照文件类型、URI以及路径方式配置。如果全站加速没有配置静态加速的情况,则都是动态加速,全站加速节点响应的HTTP头没有X-Cache、X-Swift-CacheTime等字段,类似如下:
    image.png

相关文档

适用于

  • CDN