多个上游的 nginx 缓存问题

多个上游的 nginx 缓存问题

我在为两个相同的上游设置 nginx 代理+缓存时遇到了一个奇怪的问题。我有两个相同的上游服务器,它们以主动/备份配置设置。缓存对于其中一个服务器运行正常,但是一旦我切换主动/备份配置并重新加载 nginx,我就无法获得任何缓存命中,错误日志中充满了以下内容:

2017/06/15 10:14:21 [warn] 19048#19048: *2562 an upstream response is buffered to a temporary file /mnt/cache/temp/0000000504 while reading upstream, client: <CLIENT IP>, server: , request: "GET /secure/assets/file.ts?id=456 HTTP/1.1", upstream: "http://<UPSTREAM IP>:80/assets/file.ts", host: "server-host"

现在,我无法弄清楚为什么 nginx 必须缓冲其中一个上游的响应而不是另一个上游的响应,因为上游服务器具有完全相同的文件并且位于同一个网络中。

现在,配置的相关部分:

http {

    tcp_nodelay on;

    proxy_cache_path /mnt/cache/cache keys_zone=one:20m inactive=24h loader_threshold=300 loader_files=200 max_size=180g;
    proxy_cache_key $uri;

    upstream master-cdn {
        server cdn1 backup max_fails=10 fail_timeout=60s;
        server cdn0 max_fails=10 fail_timeout=60s;
        keepalive 10;
    }

    proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_403 http_404;

        server {

                listen 80;
                if_modified_since off;
                add_header          Cache-Control no-cache;
                add_header          Pragma "no-cache";
                root                /var/www/html;

                location /assets {
                        sendfile on;
                        tcp_nopush on;
                        internal;
                        proxy_pass http://master-cdn;
                        proxy_cache             one;
                        proxy_cache_min_uses    1;
                        proxy_cache_lock        on;
                        proxy_cache_valid       200 24h;
                        proxy_temp_path /mnt/cache/temp;
                }
}

注意:客户端访问的/secureURL 会被发送到应用程序服务器,然后应用程序服务器会使用标X-Accel-Redirect头来告诉 nginx 从内部位置提供静态文件。

整个设置运行良好,但仅限于cdn0上游服务器。一旦我将语句移至backup服务器cdn0并重新加载 nginx,我就会得到上游缓冲和缓存未命中。

有人对如何进一步调试这个问题有什么想法吗?

提前致谢。

答案1

我设法解决了这个问题。在调试日志的帮助下,我发现其中一个上游服务器错误地(内容是静态的并且不会过期)发送了带有响应的Cache-ControlExpires头,然后弄乱了 nginx 缓存(不幸的是,上游服务器不在我的控制范围内)。

我已将这两个语句添加到代理位置:

proxy_ignore_headers Cache-Control;
proxy_ignore_headers Expires;

现在,两个上游服务器上的缓存均能正常工作。

相关内容