外观
CDN 做了什么?
CDN 把静态资源放到离用户更近的节点上。用户解析到的 IP 往往是附近节点,而不是源站。节点有缓存就直接返回,没有再回源,并按规则缓存响应。
原理
接入通常是把资源域名 CNAME 到 CDN。DNS 按地理位置或调度策略返回节点 IP。节点用 URL 和缓存键决定能不能复用响应。缓存键一般包含路径,有时包含查询字符串和协商头,配置错了会造成该缓存的不缓存,或不该共享的响应对别人可见。
带内容哈希的 JS、CSS、图片适合长时间缓存。HTML 入口缓存要短,否则用户一直拿到指向旧资源的页面。见 HTTP 缓存。
私有接口不要无条件放进共享 CDN 缓存。带 Cookie 的个性化响应如果被缓存,可能串数据。用单独的静态域名,并且缓存规则排除需要鉴权的路径。
回源失败时,节点可能短暂提供过期副本。这是可用性策略,要知道用户可能看到稍旧的静态文件,动态接口不应该靠这个兜底。
追问
和浏览器缓存的关系?
浏览器缓存省掉用户到 CDN 的请求。CDN 缓存省掉节点到源站的流量。两层都要设 Cache-Control。刷新后浏览器重新验证,CDN 仍可能命中。
怎么确认命中了?
看响应头里服务商提供的命中标记,以及资源 IP 是不是边缘节点。不要只看状态码 200。
易错点
- 把 HTML 和带哈希的资源设成同样的超长缓存。
- 查询参数被忽略,不同版本的 URL 拿到同一份缓存。
- 动态接口走了 CDN 却允许共享缓存。