Nginx proxy_cache对静态文件失效(始终返回"MISS")求助
我来帮你梳理下最容易遗漏的配置项和排查方向——虽然你没贴具体的配置代码,但根据日常排查Nginx缓存失效的经验,这些是最常见的原因:
1. 忘记配置缓存存储的基础路径
这是最基础的一步:如果http段里没有定义proxy_cache_path,Nginx根本没有地方存储缓存文件,自然每次都返回MISS。你需要确保http段里有类似这样的配置:
http { # 配置缓存存储路径、内存zone、大小限制等 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; # 其他http段的配置... }
keys_zone的值(这里是my_cache)后面要用到,得记好。
2. 站点配置里没关联缓存Zone
就算你在http段配了缓存路径,要是在具体的server或location块里没指定用哪个缓存zone,缓存也不会生效。比如你的站点配置里必须加一行proxy_cache:
server { listen 80; server_name your-domain.com; location / { # 这里的my_cache要和上面proxy_cache_path里的keys_zone名称一致 proxy_cache my_cache; proxy_pass http://your-backend-server; # 其他反向代理配置... } }
这是新手最容易漏的点——只搭了缓存仓库,却没告诉Nginx哪些请求要放进仓库。
3. 后端响应头直接禁止缓存
检查下你直接请求后端得到的响应头,如果有这些字段,Nginx会默认跳过缓存:
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
要是后端硬要返回这些头,你可以在Nginx里强制忽略它们,自己定义缓存规则:
location / { proxy_cache my_cache; proxy_pass http://your-backend-server; # 忽略后端的缓存控制头 proxy_ignore_headers Cache-Control Expires; # 自定义缓存有效期:200/302响应存10分钟,404存1分钟 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; }
4. 请求头触发了缓存跳过
如果你的请求里带了Cache-Control: no-cache或者Pragma: no-cache,Nginx会直接绕过缓存去请求后端。要是你不想让前端的这些头影响缓存,可以加配置忽略:
# 当请求头里有Pragma或Cache-Control时,不跳过缓存 proxy_cache_bypass "";
或者自定义缓存键,避免不同的请求头生成不同的缓存条目(如果不需要区分的话):
proxy_cache_key "$host$request_uri";
5. 没配置缓存有效期
默认情况下,Nginx不会缓存任何响应,除非你明确指定哪些状态码要缓存、存多久。必须加上proxy_cache_valid配置:
# 对200/302状态的响应缓存10分钟,404缓存1分钟,其他状态缓存5分钟 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 5m;
6. 其他小众但常见的原因
- 非GET/HEAD请求:Nginx默认只缓存GET和HEAD请求,要是你想缓存POST等方法,得加:
proxy_cache_methods GET HEAD POST; - 缓存目录权限问题:Nginx运行用户(通常是
nginx或www-data)没有proxy_cache_path指定目录的读写权限,导致写不了缓存文件。可以用命令修复:sudo chown -R nginx:nginx /var/cache/nginx sudo chmod -R 700 /var/cache/nginx
建议你先从前面两个核心配置(proxy_cache_path和proxy_cache)查起,这俩是缓存生效的基础,没问题再往后排查响应头、请求头的影响。
内容的提问来源于stack exchange,提问作者sergeda

