cdn加速效果取决于源站响应头配置,尤其是cache-control和expires;宝塔需手动添加响应头、反代缓存及sni设置,否则缓存失效、回源频繁或出现502错误。

CDN 加速必须配好源站响应头,否则缓存形同虚设
宝塔面板本身不生成 CDN 缓存策略,它只负责把响应发出去;而 CDN(比如阿里云、腾讯云、Cloudflare)是否缓存、缓存多久,**完全取决于你网站返回的 HTTP 响应头**,尤其是 Cache-Control 和 Expires。如果源站没设或设错了,CDN 可能直接回源、不缓存,或者缓存几秒就失效——你花了钱/配了 CNAME,但加速效果几乎为零。
常见错误现象:
– CDN 控制台显示“命中率<10%”
– 同一图片反复触发回源请求(看 CDN 日志或源站 Nginx access.log)
– 浏览器 DevTools 的 Network 标签里,资源状态码是 200 而非 304 或 200 (from disk cache),且响应头里没有 Cache-Control: public, max-age=...
- 静态资源(.js/.css/.png/.woff2 等)建议统一加
Cache-Control: public, max-age=31536000(1年),CDN 会优先信任这个 - HTML 页面通常要禁用长期缓存,可设
Cache-Control: no-cache, must-revalidate,避免用户看到旧版页面 - 宝塔中修改位置:站点 → 【设置】→ 【配置文件】,在
location ~ .*\.(js|css|png|jpg|gif|woff2)$块内追加add_header Cache-Control "public, max-age=31536000"; - 注意:如果用了反向代理(自建 CDN 场景),
add_header在 proxy_pass 后仍生效;但若启用了 Nginx 缓存模块(proxy_cache),则需额外确认缓存键(proxy_cache_key)是否包含请求头变量,否则可能缓存错版本
反向代理自建 CDN 时,Nginx 缓存配置比响应头更关键
当你用一台宝塔服务器(IP b.b.b.b)反代另一台源站(a.a.a.a),这台宝塔机就是你的“边缘节点”。此时 CDN 效果不靠第三方,而靠它本地的 proxy_cache 是否启用、路径是否持久、key 是否合理。
- 缓存路径必须独立挂载且有足够空间,推荐设在
/www/wwwroot/cache并chown www:www,避免因权限问题导致缓存写失败(日志里会出现open() "/www/wwwroot/cache/..." failed (13: Permission denied)) - 在站点配置文件开头添加缓存区定义:
proxy_cache_path /www/wwwroot/cache levels=1:2 keys_zone=mycache:100m inactive=7d use_temp_path=off; - 在
location /块中启用缓存:proxy_cache mycache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; - 务必加
proxy_set_header Host $host;,否则源站收到的 Host 头是 IP 或默认值,可能导致 SSL 重定向异常或 WordPress 站点链接出错 - 不要漏掉
proxy_ignore_headers Cache-Control Expires Set-Cookie;——否则源站返回的no-cache会直接让本地缓存失效
HTTPS 站点开启 CDN 后,502 错误大概率是证书或 SNI 配置翻车
源站用 HTTPS,而反代层(宝塔站点)也绑了同一域名的证书,看似合理,但实际容易触发 502 Bad Gateway。根本原因不是证书过期,而是 Nginx 在建立上游连接时无法正确传递 SNI 信息,导致源站 TLS 握手失败。
- 检查点:在宝塔站点配置文件的
proxy_pass https://a.a.a.a;上方,必须加上proxy_ssl_server_name on;,否则 Nginx 默认不发 SNI - 如果源站是泛域名证书(如
*.example.com),而反代用的是精确域名(example.com),没问题;但如果反代用了www.example.com,而源站证书没覆盖该子域,也会 502 - 临时验证方法:在反代服务器上执行
curl -vI https://a.a.a.a --resolve "example.com:443:a.a.a.a",看是否返回200;若失败,说明上游 HTTPS 连通性本身就有问题,先别急着调 CDN - 宝塔防火墙必须开启【CDN 模式】,否则它会把 CDN 回源 IP(比如阿里云的
100.64.x.x段)当成攻击源直接拦截
CDN 生效后,刷新缓存和排查命中的真实路径是两件事
很多人以为点了 CDN 控制台的“刷新 URL”,浏览器就能立刻看到新内容——其实那只是清掉了 CDN 节点上的副本;如果你的源站响应头还带着 max-age=3600,CDN 会在 1 小时后自动再缓存一份,你刷一次没用。
- 真正要强制更新:改源站响应头(比如把
max-age=3600改成max-age=1),等 CDN 下次回源拿到新头,再配合刷新才可靠 - 查是否命中缓存:看响应头里有没有
X-Cache: HIT(腾讯云)或X-Cdn-Request-ID+X-Cache-Lookup: Hit From MemCache(阿里云);没有?说明还在回源 - 用
curl -I https://yourdomain.com/test.jpg最直接,比浏览器 DevTools 更干净,不会受本地 service worker 或磁盘缓存干扰 - 注意:Cloudflare 免费版默认不缓存 HTML,即使你写了
Cache-Control: public,它也会无视——得升级到 Pro 或手动在 Page Rules 里加规则










