nginx缓存分浏览器端和代理缓存两类:前者用expires/add_header控制静态资源缓存,后者需proxy_cache_path、proxy_cache及proxy_cache_valid三步配置动态内容缓存。

在 Nginx 的 location 块里加缓存,关键看你要解决什么问题:是让浏览器少下载静态资源(比如图片、JS),还是让 Nginx 自己缓存后端返回的内容(比如 PHP 页面、API 响应)。两者配置方式完全不同,不能混用。
浏览器端缓存(最常用,轻量高效)
适用于 CSS、JS、图片、字体等静态资源。只需设置响应头,不依赖额外模块。
-
expires指令自动设Expires和Cache-Control: max-age=xxx -
add_header Cache-Control可精细控制行为,优先级高于expires
location ~* \.(jpg|jpeg|png|gif|woff2|ttf|eot|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
常见组合:
- 长期强缓存:
expires 1y; add_header Cache-Control "public, immutable"; - 禁止缓存(如登录页):
expires epoch;或add_header Cache-Control "no-store"; - 每次验证再用:
add_header Cache-Control "private, no-cache, must-revalidate";
注意:add_header 默认不继承父块,需在每个 location 里显式写;若要强制生效(包括 304 响应),加 always 参数:add_header Cache-Control "no-cache" always;
Nginx 代理缓存(用于动态内容加速)
适用于反向代理场景(如 proxy_pass 到 PHP/FastAPI/Java 后端),Nginx 自己存响应,下次直接返回。
必须三步一起配:
- 在
http块定义缓存区:proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:50m inactive=1d max_size=1g; - 在
location中启用并设置规则:location / { proxy_pass http://backend; proxy_cache mycache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_key "$scheme$request_method$host$request_uri"; add_header X-Cache-Status $upstream_cache_status; } - 可选:忽略后端禁止缓存的响应头(如
Cache-Control: no-cache):proxy_ignore_headers Cache-Control Expires Set-Cookie;
别踩坑的几个重点
-
expires和add_header Cache-Control共存时,浏览器以Cache-Control为准 -
proxy_cache不会自动读取Cache-Control头,除非你用proxy_cache_valid显式指定状态码和时间 -
add_header在 304 响应中默认不生效,要用always参数才加上 - 缓存键
proxy_cache_key若没改,默认含$scheme$proxy_host$request_uri,但常需加入$cookie_user等做用户级区分 - 修改配置后务必执行
nginx -t && systemctl reload nginx











