fastcgi_cache_bypass仅绕过当前请求缓存,不清理旧缓存;实现发布即生效需结合bypass、主动purge及精准触发条件,如PHP钩子调用purge接口、Nginx配置安全清理路径,并辅以临时全量bypass兜底。

fastcgi_cache_bypass 本身不刷新缓存,它只让当前请求绕过缓存、直连后端 PHP 处理。所以“发布新文章时无延迟刷新全站缓存”这个需求,不能单靠 bypass 实现——它解决的是「这次请求别用旧缓存」,而不是「把所有旧缓存删掉」。
真正要达成「发布即生效、全站访问立刻看到新内容」,需要 bypass + 主动清理(purge)+ 精准触发条件 三者配合。以下是可落地的调优方案:
明确 bypass 的定位:只保「当前请求实时」
-
fastcgi_cache_bypass是请求级开关,比如用户点「立即预览」或带?preview=1时跳过缓存。 - 它对已存在的缓存文件完全无影响,不会删除、不会更新、也不会标记失效。
- 所以后台发布文章时,仅加
fastcgi_cache_bypass $arg_preview;只能让预览页实时,不影响首页、分类页、归档页等其他缓存页面。
后台发布动作必须触发全站缓存清理
Nginx 原生不支持 purge(除非编译了 ngx_cache_purge 模块),宝塔默认未启用。更轻量可靠的做法是:
-
用 PHP 主动通知 Nginx 清理:在 WordPress/ThinkPHP 等程序中,监听文章
publish钩子,向一个专用 purge 接口发请求
示例(WordPressfunctions.php):add_action('publish_post', function($post_id) { wp_remote_get('https://yoursite.com/purge-all', ['timeout' => 1]); }); - 在 Nginx 配置中暴露
/purge-all路径(仅限本地或管理员 IP 访问):location = /purge-all { allow 127.0.0.1; allow YOUR_ADMIN_IP; deny all; # 若已安装 ngx_cache_purge 模块: # fastcgi_cache_purge phpcache "$scheme$request_method$host$request_uri"; # 否则用更通用方式:清空整个缓存目录(慎用,适合中小站) alias /dev/null; content_by_lua_block { os.execute("rm -f /www/server/nginx/cache/fastcgi/*/*/*"); } }
⚠️ 注意:直接
rm -f是粗暴但有效的方式,适用于日均请求 < 5 万的站点;高流量站建议上ngx_cache_purge或用 Redis 标记缓存版本号(如X-Cache-Version: v2),再通过fastcgi_cache_bypass结合$upstream_http_x_cache_version控制。
发布期间让访客自动绕过缓存(临时兜底)
即使 purge 有毫秒级延迟,也可让「刚发布后的几分钟内」所有用户请求都 bypass,避免看到陈旧首页:
# 在 server 块中定义时间窗口判断
set $need_bypass 0;
if ($time_iso8601 ~ "^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}):\d{2}") {
set $publish_hour $2;
}
# 假设你约定每天 9–11 点是发布高峰,临时全 bypass
if ($publish_hour = "09") { set $need_bypass 1; }
if ($publish_hour = "10") { set $need_bypass 1; }
fastcgi_cache_bypass $need_bypass;
fastcgi_no_cache $need_bypass;或者更精准地读取 PHP 写入的标记文件(如 /tmp/latest_publish_time),用 map 指令做时间差判断。
关键配置检查项(避免 bypass 失效)
-
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;必须存在,否则 PHP 输出的Cache-Control: no-cache会覆盖你的 bypass 规则; -
fastcgi_cache_key必须包含$args(即查询参数),否则/article/123和/article/123?_t=12345被视为同一缓存键; -
fastcgi_cache_lock on;开启,防止并发请求重复穿透后端; - 缓存目录权限确认:
chown -R www:www /www/server/nginx/cache,否则 purge 或 bypass 后的响应根本写不进缓存。
不复杂但容易忽略。

















