CDN回源频繁导致加载变慢,该怎么优化缓存策略?

上官瑞珺 阅读 2

我们网站用了阿里云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控制台单独设置缓存规则?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
公孙鑫鑫
这个问题挺常见的,我来帮你排查一下。

先说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配置写法:

location ~* .(js|css|png|jpg|jpeg|gif|ico|woff2)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}


把 expires 那行删掉,直接用 add_header 统一控制,省得出乱子。
点赞
2026-03-17 17:20