Skip to content

CDN 做了什么? ​

CDN 把静态资源放到离用户更近的节点上。用户解析到的 IP 往往是附近节点,而不是源站。节点有缓存就直接返回,没有再回源,并按规则缓存响应。

原理 ​

接入通常是把资源域名 CNAME 到 CDN。DNS 按地理位置或调度策略返回节点 IP。节点用 URL 和缓存键决定能不能复用响应。缓存键一般包含路径,有时包含查询字符串和协商头,配置错了会造成该缓存的不缓存,或不该共享的响应对别人可见。

带内容哈希的 JS、CSS、图片适合长时间缓存。HTML 入口缓存要短,否则用户一直拿到指向旧资源的页面。见 HTTP 缓存。

私有接口不要无条件放进共享 CDN 缓存。带 Cookie 的个性化响应如果被缓存,可能串数据。用单独的静态域名,并且缓存规则排除需要鉴权的路径。

回源失败时,节点可能短暂提供过期副本。这是可用性策略,要知道用户可能看到稍旧的静态文件,动态接口不应该靠这个兜底。

追问 ​

和浏览器缓存的关系?

浏览器缓存省掉用户到 CDN 的请求。CDN 缓存省掉节点到源站的流量。两层都要设 Cache-Control。刷新后浏览器重新验证,CDN 仍可能命中。

怎么确认命中了?

看响应头里服务商提供的命中标记,以及资源 IP 是不是边缘节点。不要只看状态码 200。

易错点 ​

  • 把 HTML 和带哈希的资源设成同样的超长缓存。
  • 查询参数被忽略,不同版本的 URL 拿到同一份缓存。
  • 动态接口走了 CDN 却允许共享缓存。

相关 ​