nginx 缓存动态页面需先在 http 块定义 proxy_cache_path 创建缓存区,再在 location 中配置 proxy_cache、proxy_cache_valid、proxy_cache_key 等指令,并结合 proxy_no_cache/proxy_cache_bypass 控制绕过条件,同时可选择性尊重后端 cache-control 头。

要在 Nginx 中缓存后端动态页面,核心是启用 proxy_cache 并合理设置缓存策略,关键不在“能不能缓”,而在“缓什么、缓多久、怎么更新”。动态内容默认不缓存,必须显式配置才能生效。
缓存区域必须先定义(http 块)
缓存不能直接启用,得先在 http 块里声明一个缓存区,这是所有缓存操作的基础:
-
路径与层级:用
proxy_cache_path指定存储位置和目录结构,例如:proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
其中keys_zone=my_cache:10m是必填项,表示分配 10MB 内存存缓存索引;inactive=60m表示 60 分钟未被访问的缓存条目会被自动清理。 -
权限与初始化:确保 Nginx 工作进程(如 www-data 或 nginx 用户)对
/var/cache/nginx/my_cache目录有读写权限;首次启动时该目录会自动创建,无需手动mkdir。
location 中启用并控制缓存行为
在具体 location 块中,把请求交给后端的同时,告诉 Nginx “这个响应可以缓存”:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
启用缓存区:添加
proxy_cache my_cache;(名称需与keys_zone一致) -
设定缓存有效期:用
proxy_cache_valid按状态码区分缓存时间,例如:proxy_cache_valid 200 301 302 10m;—— 成功响应缓存 10 分钟proxy_cache_valid 404 1m;—— 404 页面只缓存 1 分钟,避免长期返回错误页 -
跳过缓存的条件:动态页面常需绕过缓存,比如带登录态或含参数的请求:
proxy_no_cache $cookie_sessionid $arg_token $arg_preview;proxy_cache_bypass $cookie_sessionid $arg_token $arg_preview;
这两行配合使用,当存在指定 cookie 或参数时,既不读缓存也不写缓存。
缓存键要能区分不同动态结果
默认缓存键可能把带不同参数的请求当成同一个 URL,导致混用缓存。需显式定义更精确的键:
- 推荐写法:
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
比默认值多加了$is_args$args,确保/api/user?id=1和/api/user?id=2不共用缓存。 - 若需按用户身份隔离(如会员/非会员看到不同内容),可加入 cookie 或 header:
proxy_cache_key "$scheme$request_method$host$request_uri$cookie_user_role";
让后端配合控制缓存逻辑
缓存策略最终由后端响应头与 Nginx 规则共同决定:
- Nginx 默认忽略后端返回的
Cache-Control和Expires,如需尊重,加proxy_ignore_headers Cache-Control Expires;的反向配置(即去掉 ignore) - 后端可通过设置
Cache-Control: public, max-age=300主动声明可缓存 5 分钟,Nginx 在匹配proxy_cache_valid后会优先采用该值(需开启proxy_cache_use_stale等增强选项才更健壮) - 强制刷新某类缓存可用
proxy_cache_purge指令(需搭配第三方模块或 OpenResty),普通编译版 Nginx 不支持原生命令清除。










