nginx静态缓存分浏览器端(cache-control)和服务端磁盘缓存(proxy_cache)两层:前者通过add_header控制客户端缓存时效与策略,后者借助proxy_pass+proxy_cache_path实现本地ssd缓存,二者协同提升性能。

Nginx 实现静态缓存,核心是分两层:客户端浏览器缓存(靠 Cache-Control 或 expires)和 服务端磁盘缓存(靠 proxy_cache)。两者目的不同、配置方式不同,不能混用,但可协同提升性能。
一、浏览器端缓存:让客户端少发请求
这是最常用、最直接的静态缓存方式,适用于 .js、.css、.png、.woff2 等资源。Nginx 不生成文件副本,而是告诉浏览器“这个资源可以本地存多久”。
- 推荐用
add_header Cache-Control,比expires更灵活:location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2|ttf|eot|svg)$ { add_header Cache-Control "public, max-age=31536000, immutable"; # 开启高效传输 sendfile on; tcp_nopush on; # 文件句柄缓存(减少系统调用) open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_errors off; } -
immutable表示内容不会变更,浏览器跳过If-None-Match验证,彻底省掉 304 请求。 -
max-age=31536000即 1 年,适合带哈希指纹的资源(如app.a1b2c3.js)。 - 若资源无版本号、可能被覆盖(如
/static/logo.png),则设为较短时间,例如max-age=86400(1 天)。
二、服务端磁盘缓存:让 Nginx 少读磁盘
当并发高、静态文件 I/O 成瓶颈,或需应对 CDN 回源洪峰时,用 proxy_cache 把首次读取的内容存到本地 SSD,后续请求直接从缓存目录返回。
⚠️ 注意:proxy_cache 必须配合 proxy_pass 使用,不能和 root/alias 直接共存。常见做法是“伪代理”:
-
定义缓存区(写在
http {}块)proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:50m max_size=5g inactive=30d use_temp_path=off; -
设置内部命名 location(处理真实文件服务)
location @static_disk { internal; alias /var/www/static/; # 或 root /var/www/static; 加上 try_files $uri =404; } -
主 location 转发并启用缓存
location ^~ /static/ { proxy_cache static_cache; proxy_cache_key "$scheme$request_method$host$uri$is_args$args"; proxy_cache_valid 200 304 30d; proxy_cache_use_stale error timeout updating; proxy_cache_lock on; proxy_pass http://127.0.0.1:8080; # 指向 @static_disk proxy_redirect off; proxy_set_header Host $host; } # 内部 server 或 location 提供转发目标 location = /_static_proxy { internal; alias /var/www/static/; }或更简洁地用命名 location:
location ^~ /static/ { proxy_cache static_cache; proxy_pass http://127.0.0.1:8080/_static/; # 后端监听 8080,实际返回文件 # ……其余 proxy_cache_* 指令同上 }
三、验证与调试技巧
-
查看是否命中缓存:加响应头
add_header X-Cache-Status $upstream_cache_status;
返回
HIT/MISS/BYPASS,方便 curl 测试:curl -I https://yoursite.com/static/app.js
-
确保缓存路径可写:
sudo chown -R nginx:nginx /var/cache/nginx/static_cache sudo chmod 755 /var/cache/nginx/static_cache
避免缓存污染:静态资源建议加版本号或哈希(如
/static/v2/main.css),并在proxy_cache_key中包含$uri,不带$args(除非真有查询参数影响内容)。
不复杂但容易忽略











