fastcgi_cache_lock的本质是控制缓存未命中时的并发穿透行为:仅首个请求回源,其余在Nginx层阻塞最多5秒(硬编码不可配),待缓存生成后统一返回;需协同fastcgi_read_timeout、fastcgi_cache_valid和fastcgi_cache_use_stale updating才能生效。
fastcgi_cache_lock 的本质不是“处理压力”,而是控制缓存未命中时的并发穿透行为:当多个请求同时访问一个没缓存或已过期的 URL,它只放行第一个请求去后端,其余请求在 Nginx 层阻塞等待——等缓存写入后统一返回。这能降低瞬时压力,但效果取决于配置协同是否合理。
fastcgi_cache_lock on; 后,Nginx 对同一缓存 key(如 /article/123)的并发 miss 请求做串行化:fastcgi_cache_use_stale 降级)fastcgi_ignore_headers Cache-Control Set-Cookie 等,防止因响应头导致缓存不生效fastcgi_read_timeout 设置过短(比如设为 10 秒,但 PHP 实际要 20 秒)fastcgi_cache_bypass 和 fastcgi_no_cache单靠 fastcgi_cache_lock 不够,必须配合以下三项:
fastcgi_read_timeout ≥ 后端 P95 响应时间(如 PHP 最长需 25 秒,此值至少设 30 秒)fastcgi_cache_valid 分层设置有效期,避免集中过期(例如首页 15m、分页 5m、搜索 60s)fastcgi_cache_use_stale updating error timeout http_500;updating 是核心:缓存过期时允许先返回旧内容,后台异步刷新,既保可用又防穿透不复杂但容易忽略