nginx通过反向代理+静态资源缓存协同加速:先在http块用proxy_cache_path定义缓存路径、内存索引区及过期策略,再在location中按后缀精准启用proxy_cache并设proxy_cache_valid有效期,配合proxy_ignore_headers、proxy_cache_key、proxy_cache_use_stale等指令实现一致性、兜底与并发控制。

静态资源缓存配合反向代理实现加速,核心是让 Nginx 在充当“中间层”的同时,把 HTML、CSS、JS、图片等不常变动的内容存下来,后续相同请求直接从本地磁盘返回,不触达后端。这不是简单打开开关,而是一套有策略的协同机制。
缓存区域必须提前定义
缓存不是随用随建,得先在 http 块里声明一个可管理的缓存空间:
-
proxy_cache_path 指定缓存存放路径(如
/var/cache/nginx/static_cache),建议用独立磁盘或 SSD -
keys_zone 定义内存中缓存索引区名称和大小(如
static_cache:50m),它不存文件,只存 key 和元数据,太小会导致频繁淘汰 - inactive=7d 表示某资源 7 天内没被访问,就自动清理;max_size=20g 控制磁盘总用量上限,超限时按 LRU 清理
location 级别精准启用缓存
不能整个站都缓存,尤其含用户信息或表单页。推荐按路径或后缀区分:
- 对
location ~* \.(js|css|png|jpg|gif|ico|woff2)$这类静态后缀,直接启用缓存,并设长有效期(如proxy_cache_valid 200 301 302 30d) - 对
location /api/或带Cookie的请求,默认跳过缓存;如需缓存动态接口,要加proxy_cache_bypass $http_cookie等精细控制 - 避免缓存含 Set-Cookie 或 Cache-Control: private 的响应,用
proxy_ignore_headers Set-Cookie Cache-Control主动忽略
缓存键(key)要兼顾一致性与区分度
默认 $scheme$host$request_uri 能覆盖多数场景,但要注意:
- 如果后端根据 User-Agent 返回不同版本 JS(如移动端 polyfill),就得把
$http_user_agent加进proxy_cache_key - 带分页参数的列表页(如
/list?page=1)通常不该缓存,可用proxy_no_cache $arg_page排除 - 若启用了 gzip,确保
gzip_vary on,否则压缩版和非压缩版可能共用一个缓存项,导致乱码
异常时仍能“兜底”服务
真实环境中后端可能抖动,缓存要聪明地应对:
-
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504让 Nginx 在后端挂掉时,仍返回已有的旧缓存 -
proxy_cache_background_update on允许在返回旧内容的同时,后台悄悄刷新缓存,用户无感知 -
proxy_cache_lock on防止海量并发请求同时穿透到后端刷缓存,首个请求去回源,其余等待并复用结果
这套组合不依赖额外组件,只要配置到位,Nginx 就能稳稳扛住静态资源流量,降低后端压力,提升首屏加载速度。关键不在堆参数,而在理解每个指令的实际作用和触发条件。











