Nginx在缓存中返回文件/检查缓存中是否存在文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx在缓存中返回文件/检查缓存中是否存在文件相关的知识,希望对你有一定的参考价值。

我正在使用ngnix作为反向代理服务器。有一种情况,当后端服务器关闭,我知道它。因此,我正在添加'Check-Cache'标头来请求,我想要做的是在缓存中获取文件,以及何时不仅仅返回错误页面。我不想将请求传递给后端。

脚本

$ curl -s -o /dev/null -w "%{http_code}" 0/images/2.jpg -H'Host: example.com'
200
$ pkill -9 backend_server
$ curl -s -o /dev/null -w "%{http_code}" 0/images/2.jpg -H'Host: example.com' -H'Check-Cache: true'
404 <-- I want to 200 here

nginx.conf

server {
    listen       80;

    underscores_in_headers on;
    proxy_cache_purge on;

    location / {
        error_page 599 = @jail;
        recursive_error_pages on;

        if ($http_check_cache = "true") {
            return 599;
        }

        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_cache my-cache;
        proxy_cache_valid  200 302  10m;
        proxy_cache_valid  404      1m;
        proxy_cache_key    $uri$is_args$args;
    }

    location @jail {
        # try_files ??
        # proxy_cache_key (If i can get it i can use try_files)
        # what other solution...
        return 404;
    }
}
答案

好吧,也许不是那么漂亮的解决方案,但上游可以与标记为down的一台服务器一起使用。

http {
upstream backend-jail {
    server 0.0.0.0 down;
}

server {
    listen      80;

    underscores_in_headers on;

    recursive_error_pages on;
    error_page 597 = @jail;

    location / {
        if ($http_x_backend_down = "1") {
            return 597;
        }
        ########
        proxy_pass http://localhost:8080;             
        proxy_set_header Host $host;

        proxy_cache my-cache;
        proxy_cache_valid 200 302  1h;
        proxy_cache_valid 404      1m;
        proxy_cache_key    $uri$is_args$args;
    }

    location @jail {
        # dont need to log error about 'no live upstreams'
        error_log /dev/null crit;

        # backend-jail always return 502, want 404 to be returned.
        error_page 502 =404 /;

        proxy_pass http://backend-jail;
    }
}
}

以上是关于Nginx在缓存中返回文件/检查缓存中是否存在文件的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK 远程文件存在,没有缓存

nginx静态资源缓存

(CVE-2017-7529)Nginx 越界读取缓存漏洞

(CVE-2017-7529)Nginx 越界读取缓存漏洞

(CVE-2017-7529)Nginx 越界读取缓存漏洞

学习笔记TF023:下载缓存属性字典惰性属性覆盖数据流图资源