为什么我的 Nginx 配置不缓存响应?

Why doesn't my Nginx configuration cache the response?

我有下面的Nginx配置,我们可以从nginx -T的输出中看出它在语法上是正确的。我粗体下面输出的一些相关部分:

$ sudo nginx -T
nginx: 配置文件 /etc/nginx/nginx.conf 语法正常
nginx: 配置文件/etc/nginx/nginx.conf 测试成功
# 配置文件 /etc/nginx/nginx.conf:
事件{}

HTTP {
    proxy_cache_path /tmp/cache keys_zone=one:10m levels=1:2 inactive=2M max_size=100g;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 静态文件服务器
    服务器 {
        听 127.0.0.1:8080;

        根/opt/nginx-test-data;

        地点 / {
        }
    }

    # 与上面定义的服务器对话的反向代理
    服务器 {
        听 127.0.0.1:8081;
        proxy_cache_min_uses1个;

        地点 / {
            proxy_pass http://127.0.0.1:8080;
            proxy_cache一个;
        }
    }
}

我知道在通常的实践中,服务器和代理服务器在不同的主机上。目前我只是想学习如何配置带有内容缓存的 Nginx 代理服务器,因为 Nginx 对我来说是新手。

我有以下 2MB 的随机字节文件:

$ ls -lh /opt/nginx-test-data/random.bin 
-rw-rw-r-- 1 shane shane 2.0M Jun 21 11:39 /opt/nginx-test-data/random.bin

当我 curl 反向代理服务器时,我收到 200 响应:

$ curl --no-progress-meter -D - http://localhost:8081/random.bin --output local-random.bin
HTTP/1.1 200 行
服务器:nginx/1.18.0 (Ubuntu)
日期:2021 年 6 月 21 日星期一 15:50:07 GMT
内容类型:text/plain
内容长度:2000000
连接:保持活动状态
最后修改时间:2021 年 6 月 21 日星期一 15:39:54 GMT
ETag:“60d0b2ca-1e8480”
接受范围:字节

然而,我的缓存目录是空的:

$ sudo ls -a /tmp/cache/
.  ..

我检查了 /var/log/nginx/access.log/var/log/nginx/error.log,没有记录错误。

我做错了什么导致在向反向代理服务器发出请求后我的缓存目录中没有条目?

事实证明我需要添加一个 proxy_cache_valid directive(虽然我不清楚为什么这是必要的 - 我假设简单地在 location 中使用 proxy_cache 会变成自行缓存)。

我的 nginx.conf 有效(注意 粗体 中的新行):

events {}

http {
    proxy_cache_path /tmp/cache keys_zone=one:10m levels=1:2 inactive=2M max_size=100g;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Static file server
    server {
        listen 127.0.0.1:8080;

        root /opt/nginx-test-data;

        location / {
        }
    }

    # Reverse proxy that talks to server defined above
    server {
        listen 127.0.0.1:8081;
        proxy_cache_min_uses 1;

        location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_cache one;
            proxy_cache_valid 200 10m;
        }
    }
}