Nginx中缓存由location块内的proxy_cache指令启用,server块仅作策略组织容器;proxy_cache_path必须定义在http块,且keys_zone名称须与proxy_cache调用一致。

在 Nginx 中,server 块本身不直接“开启”缓存,真正启用缓存的是 location 块里的 proxy_cache 指令。但 server 块是组织缓存逻辑的合理边界——它定义了哪些域名、端口、路径下的请求走缓存流程,也便于集中配置透传头、超时、错误处理等配套项。
缓存必须在 location 中启用
proxy_cache 指令只能出现在 http、server 或 location 上下文中,但只有写在 location 里才对匹配的请求生效。写在 server 块顶层,不会自动作用于所有子 location,也不推荐这样做。
- 正确写法:在具体
location /api/或location ~ \.json$中写proxy_cache my_cache; - 错误写法:把
proxy_cache直接放在server { ... }花括号最外层(无 location 包裹) - 原因:Nginx 的缓存决策基于请求匹配到的
location,而非 server;每个 location 可独立选择是否缓存、用哪个缓存区、设什么 key 和有效期
server 块适合做统一基础配置
虽然缓存行为由 location 控制,但 server 块很适合作为“缓存策略的容器”,集中设置不影响缓存逻辑、但影响代理质量的通用项:
-
proxy_set_header Host $host;和X-Real-IP等头信息,确保后端能正确识别原始请求 -
proxy_connect_timeout、proxy_read_timeout等超时参数,避免缓存未命中时卡住 -
proxy_buffering on;(默认开启),配合缓存提升响应组装效率 - 可选:
add_header X-Cache-Status $upstream_cache_status;,方便调试是否命中(MISS/HIT/EXPIRED/BYPASS)
典型 server + location 缓存结构
一个实用的配置示例如下(注意层级和缩进):
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
server {
listen 80;
server_name api.example.com;
<pre class="brush:php;toolbar:false;"># 公共代理设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
# 针对 API 接口启用缓存
location /v1/products/ {
proxy_pass http://backend;
proxy_cache my_cache; # 启用缓存区
proxy_cache_key "$scheme$request_method$host$request_uri"; # 明确缓存键
proxy_cache_valid 200 301 302 10m; # 成功响应缓存 10 分钟
proxy_cache_valid 404 1m; # 404 缓存 1 分钟,减少无效回源
add_header X-Cache-Status $upstream_cache_status;
}
# 静态资源或管理接口不缓存
location /admin/ {
proxy_pass http://backend;
proxy_cache_bypass $cookie_admin; # 登录态用户绕过缓存
}}
注意 server 块不能替代 http 块的缓存定义
proxy_cache_path 必须且只能写在 http 块中,这是整个缓存机制的地基。即使你在多个 server 块里都用了 proxy_cache my_cache,也必须先在 http 里声明:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m max_size=1g inactive=60m use_temp_path=off;
<pre class="brush:php;toolbar:false;">server { ... }
server { ... }}
- 如果漏掉
http中的proxy_cache_path,所有proxy_cache都会静默失效 -
server块里无法定义proxy_cache_path,否则 Nginx 启动报错 -
keys_zone名称(如my_cache)必须严格一致,大小写敏感










