宝塔默认“静态缓存”仅对gif/jpg/css/js等文件加expires,不缓存html和php页面;真要页面静态化需手动配置proxy_cache或使用插件。

宝塔面板里 Nginx 静态化缓存怎么配才生效
直接说结论:宝塔默认的「静态文件缓存」开关只是给 location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ 加了 expires,它不加速 HTML 页面,也不做反向代理级缓存。真要页面静态化,得手动加 proxy_cache 或用插件级方案。
常见错误现象:curl -I 看响应头没出现 X-Cache: HIT;刷新页面后服务器 CPU 依然飙升;明明开了「静态缓存」,但首页加载还是慢。
- 必须在站点配置的「配置文件」里手动添加
proxy_cache_path(全局段)和proxy_cache(server 或 location 段) -
proxy_cache_valid要按状态码分开写,比如200 301 302 10m,别只写200 10m,否则跳转页不缓存 - PHP 动态页需配合
add_header X-Cache $upstream_cache_status;才能验证是否命中 - 宝塔的「网站 > 缓存」里勾选「启用静态缓存」,本质只是插入一段固定
expires规则,对.php或无后缀路径完全无效
为什么开了 proxy_cache 还是 MISS?关键 3 个拦截点
缓存未命中不是配置漏了,大概率是请求被上游或中间层主动绕过。Nginx 的 proxy_cache_bypass 和 proxy_no_cache 默认行为很隐蔽。
- 检查 PHP-FPM 是否返回了
Set-Cookie响应头——只要存在,Nginx 默认不缓存(proxy_cache_use_stale不影响这点) - 确认浏览器请求带了
Cookie或Authorization头,这些会触发proxy_cache_bypass默认规则 - 宝塔自带的防 CC 规则、WAF 插件、或自定义的
if ($args ~ ".*") { ... }都可能提前 return,导致根本进不了 cache location
WordPress / Typecho 类 CMS 开启静态缓存要注意什么
这类系统依赖 Cookie 和动态 URL 参数(如 ?s=xxx),直接套用通用缓存配置会把搜索页、登录态全缓存,用户看到别人的内容。
- 必须排除含查询参数的请求:
proxy_no_cache $arg_s $arg_p $cookie_comment_author; - 登录用户、评论框、购物车等区域建议用 ESI 或 AJAX 动态加载,别放进主缓存
- 后台地址(如
/wp-admin/)要用独立location并禁用缓存:proxy_cache off; - 宝塔「网站 > 缓存」里的「静态缓存」对 WordPress 几乎无用,因为它的 HTML 是 PHP 渲染的,不属于「静态文件」范畴
缓存清理不及时?别依赖「一键清除」
宝塔面板右上角的「清除缓存」按钮只清 tmp 目录和部分内存缓存,对 proxy_cache_path 指定的磁盘缓存完全无效。缓存文件实际存在 /www/server/nginx/proxy_cache_dir/ 下,手动删也容易删错层级。
- 用
proxy_cache_purge模块(需编译进 Nginx)配一个 purge 接口,比如location ~ /purge(/.*) - 更新文章后,通过 API 或钩子自动触发
curl -X PURGE https://yoursite.com/your-post-slug/ - 定期用
find /www/server/nginx/proxy_cache_dir -type f -mtime +7 -delete清理过期文件(注意别误删目录结构) - 宝塔「计划任务」里加脚本比人工点「清除」靠谱得多
真正卡住的从来不是配置语法,而是动态内容和缓存策略之间的边界——比如一个 Set-Cookie 头、一次未声明的 AJAX 请求、或者某个插件悄悄改了 Cache-Control 响应头。这些地方不逐个验,缓存开着也等于没开。










