You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx proxy_cache对静态文件失效(始终返回"MISS")求助

解决Nginx缓存始终返回"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:55:00