CDN回源频繁导致加载变慢,该怎么优化缓存策略?
我们网站用了阿里云CDN,但最近发现很多静态资源(比如JS和CSS)每次都要回源拉取,页面加载明显变慢。明明设置了Cache-Control: max-age=31536000,但浏览器还是经常发请求到源站。
我检查了响应头,发现CDN返回的Cache-Control确实有,但有时候又变成no-cache。是不是我哪里配置错了?我们的Nginx配置里是这样写的:
location ~* .(js|css|png|jpg|jpeg|gif|ico|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
为什么CDN还是会频繁回源?是不是需要在CDN控制台单独设置缓存规则?
先说Nginx配置的问题。你这个配置有个坑:
expires指令和add_header同时用的时候,add_header会覆盖掉expires设置的 Cache-Control,所以最后生效的是你手动写的public, immutable,这个本身没问题,但问题可能出在CDN那一边。核心问题在阿里云CDN控制台。Nginx设置的缓存头只是给CDN一个参考,CDN买不买账取决于它在控制台配置的缓存规则。阿里云CDN默认的缓存策略是按照你控制台设置的过期时间来的,跟响应头可能不一致。
解决办法很简单,去阿里云CDN控制台找到【缓存配置】-【缓存过期规则】,把你静态资源的缓存时间设置成跟Nginx一致的,比如1年。路径匹配用
/*.js、/*.css这种形式。另外你说有时候变成 no-cache,这个很可能是某些请求命中了CDN的默认规则或者你源站的某些接口没设置好缓存头。建议在CDN控制台打开【状态码缓存】功能,把404、403这些错误页面也缓存起来,避免频繁回源。
最后给你一个更稳妥的Nginx配置写法:
把 expires 那行删掉,直接用 add_header 统一控制,省得出乱子。