proxy_cache_lock用于防止缓存击穿,开启后首个cache miss请求回源并写入缓存,其余同uri请求等待至缓存生成完成再返回;需配合proxy_cache_path、proxy_cache等指令使用,并注意macos下缓存目录权限及并发验证。

在 macOS 下配置 Nginx 的 proxy_cache_lock,核心目标是避免缓存未命中时多个并发请求同时回源(即“缓存击穿”),让首个请求去后端取数据并写入缓存,其余请求等待该缓存生成完成后再直接读取——这正是 proxy_cache_lock 的作用。
proxy_cache_lock 是什么?
这是一个布尔型指令,默认为 off。开启后,当多个请求同时访问一个尚未缓存的资源(cache miss),Nginx 会让第一个请求穿透到上游服务器,其余同 URI 请求会被挂起(默认最多等待 5 秒),等缓存写入成功后统一返回缓存内容。
注意:它只对 cache miss 生效;已有缓存或缓存过期但未启用 proxy_cache_use_stale 的场景不触发锁机制。
macOS 下启用 proxy_cache_lock 的关键配置
确保以下几项在 nginx.conf 或站点配置中正确设置(macOS 上常用 Homebrew 安装,配置路径通常是 /usr/local/etc/nginx/nginx.conf):
-
定义缓存区:必须先用
proxy_cache_path声明缓存路径和共享内存区(如keys_zone=my_cache:10m),proxy_cache_lock才能生效 -
启用 lock:在
location或server块中添加proxy_cache_lock on; -
设置锁等待超时(可选但推荐):
proxy_cache_lock_timeout 5s;,防止请求无限等待;超过时间后,其他请求会各自回源(可能造成重复请求) -
配合缓存指令使用:确保已启用缓存,例如
proxy_cache my_cache;、proxy_cache_valid 200 302 10m;
常见问题与 macOS 特别注意点
在 macOS 上调试时容易遇到以下情况:
-
缓存路径权限问题:Homebrew 安装的 Nginx 默认以当前用户(非 root)运行,
proxy_cache_path指定的目录(如/usr/local/var/cache/nginx)需确保该用户有读写权限,否则缓存写入失败,lock 行为异常 -
未看到 lock 效果?检查是否真的发生了 cache miss:用
curl -I查看响应头中的X-Cache-Status(需自定义日志或添加add_header X-Cache-Status $upstream_cache_status;),确认首次请求是MISST,后续并发请求是否变为MISS(未锁)或HIT(锁生效后命中) -
并发测试建议:用
ab或wrk发起 10+ 并发请求(如ab -n 20 -c 10 http://localhost/xxx),观察后端访问日志——开启 lock 后,后端应只收到 1 次请求(而非 10 次)
一个最小可用示例(macOS 兼容)
在 http 块中添加:
proxy_cache_path /usr/local/var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
在 location 中添加:
location /api/ {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_lock on;
proxy_cache_lock_timeout 3s;
add_header X-Cache-Status $upstream_cache_status;
}
然后重启 Nginx:brew services restart nginx 或 sudo nginx -s reload。










