nginx中upstream负责定义后端服务器组实现请求路由,proxy_cache负责本地缓存加速;动静分离需二者协同:静态资源走upstream并启用proxy_cache,动态请求则转发至后端且通常不长时缓存。

在 Nginx 中,upstream 本身不直接处理缓存,它只负责定义后端服务器组;缓存功能由 proxy_cache 等指令控制,需配合 location 和 upstream 协同工作。真正实现“动静分离加速”,核心是:用 upstream 分流请求(动/静),再对静态资源路径启用本地缓存,减少回源、降低延迟。
明确动静分离与缓存的分工
upstream 是“路由中枢”,决定请求发给谁;缓存是“本地加速器”,决定是否从磁盘/内存读取响应,而不是每次都去 upstream 后端拉取。二者不在同一层级,但可无缝衔接:
- 动态请求(如
/api/、*.php)→ 走 upstream(如proxy_pass http://php_backend;)→ 通常不缓存或仅短时缓存 - 静态请求(如
/static/、*.(js|css|png))→ 走另一个 upstream(如http://static_servers;)→ 同时开启proxy_cache,复用已缓存内容
关键配置步骤(含缓存路径与策略)
必须在 http 块中先定义缓存区,再在对应 location 中调用:
- 定义共享缓存区:
proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:100m inactive=7d max_size=10g;
(路径需提前创建并授权 Nginx 用户可写) - 为静态资源 location 启用缓存:
location ~* \.(js|css|jpg|jpeg|png|gif|webp|woff2?)$ {<br> proxy_pass http://static_backend;<br> proxy_cache static_cache;<br> proxy_cache_valid 200 304 1h;<br> proxy_cache_valid 404 1m;<br> proxy_cache_use_stale error timeout updating;<br> proxy_cache_lock on;<br> } - 确保 upstream 已正确定义(在 server 外):
upstream static_backend {<br> server 192.168.1.10:80;<br> server 192.168.1.11:80 weight=2;<br> }
为什么不能对动态 upstream 直接开长缓存?
动态接口返回内容常随用户、时间、参数变化,盲目缓存会导致数据陈旧或泄露:
- 登录态接口(如
/user/profile)缓存后,A 用户可能看到 B 用户的数据 - 带查询参数的 API(如
/list?page=2)若未开启proxy_cache_key区分参数,不同页码可能命中同一缓存 - 若真需缓存部分动态内容,应显式设置
Cache-Control响应头 +proxy_cache_bypass和proxy_no_cache精确控制
补充加速技巧(非必须但实用)
静态资源缓存之外,还能叠加几层优化:
-
客户端缓存:在静态 location 中加
expires 1h;或add_header Cache-Control "public, max-age=3600";,让浏览器也缓存 -
Gzip 压缩:启用
gzip on;+gzip_types text/css application/javascript image/svg+xml;,减小传输体积 -
缓存键精细化:用
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";避免 GET 参数被忽略











