nginx proxy_cache缓存需三部分协同:http块中用proxy_cache_path定义缓存区(含path、levels、keys_zone等参数),location中用proxy_cache绑定缓存区并配置proxy_cache_key和proxy_cache_valid,再通过proxy_no_cache和proxy_cache_bypass控制绕过逻辑。

Nginx 使用 proxy_cache 缓存后端响应,本质是在反向代理层建立一层本地缓存,让重复请求不必每次都打到源站。它不是开关式配置,而是三部分紧密配合才能生效:定义缓存区、启用缓存逻辑、控制缓存行为。
必须在 http 块中定义缓存存储区
这是整个机制的地基,写错位置(比如塞进 server 或 location)会导致配置无效。核心指令是 proxy_cache_path,关键参数要配全:
-
path:指定缓存文件存放的绝对路径,如/var/cache/nginx -
levels=1:2:设置两级子目录结构(如ab/cdef123...),避免单目录文件爆炸 -
keys_zone=my_cache:10m:创建共享内存区,名字(my_cache)和大小(10m)必须明确,用于快速索引缓存键 -
max_size=1g:磁盘总容量上限,超限时自动淘汰最久未用的缓存 -
inactive=60m:60 分钟内没被访问的缓存条目会被清理 -
use_temp_path=off:推荐关闭临时路径,减少一次文件移动,提升写入效率
示例:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
}
在 location 块中启用并绑定缓存
只有匹配该 location 的请求才会走缓存流程。这里需明确指定用哪个缓存区,并定义“什么算同一个请求”以及“缓存多久”。
-
proxy_cache my_cache:名称必须与keys_zone定义的一致 -
proxy_cache_key:建议显式设置,避免默认键过于宽泛导致误命中。常用组合有:-
$scheme$request_method$host$request_uri(忽略 Cookie 和查询参数) -
$scheme$request_method$host$request_uri$is_args$args(区分带参请求) -
$scheme$request_method$host$request_uri$http_cookie(按用户身份区分,适合登录态内容)
-
-
proxy_cache_valid:按响应状态码分级设置过期时间,例如:proxy_cache_valid 200 301 302 10m;proxy_cache_valid 404 1m;-
proxy_cache_valid any 5m;(兜底规则,不覆盖已明确声明的状态码)
处理绕过缓存的常见场景
不是所有请求都适合缓存,比如带调试参数、含敏感头或用户私有接口:
-
proxy_no_cache $cookie_nocache $arg_nocache $http_pragma:满足任一变量非空时,不写入缓存(但响应仍返回给客户端) -
proxy_cache_bypass $cookie_nocache $arg_nocache:满足条件时,跳过读取缓存,直接回源(常与proxy_no_cache配合使用) - 可加
add_header X-Cache-Status $upstream_cache_status always;方便调试,响应头中会显示HIT/MISS/BYPASS
不复杂但容易忽略










