使用 NGINX 绕过单个 IP 的缓存

使用 NGINX 绕过单个 IP 的缓存

我想要设置 NGINX,以便将缓存中的内容提供给除一个 IP 地址之外的所有人。

我想要实现的两个目标是:

  1. 确保从指定的 IP 永远不会命中缓存,但会提供磁盘上的实际文件(因此,如果我删除该文件,它会立即给出 404)
  2. 对于所有其他 IP:如果请求的内容尚未在缓存中,则立即从文件中加载并将其存储在缓存中(因此,如果我删除该文件,它应该在缓存持续期间提供服务)

这是我目前的配置:

server {
    listen                      80;
    listen                      127.0.0.1:9999 default;
    server_name                 storage.example.com;
    charset                     utf-8;
    autoindex                   off;

    access_log                  "/var/log/nginx/storage.access.log";
    udplog_tag                  "www.example.com/storage";

    set_real_ip_from            127.0.0.0/8;
    set_real_ip_from            unix:;
    real_ip_header              X-Real-IP;

    server_name_in_redirect     off;
    port_in_redirect            off;

    location /a/ {
        alias           "/storage/public/a/";
    }

    location /b/ {
        alias           "/storage/public/b/";
    }
}

server {
    listen          80;
    server_name     static.example.com;
    charset         utf-8;
    autoindex       off;

    access_log      "/var/log/nginx/static.access.log";
    udplog_tag      "www.example.com/static";

    location / {
        proxy_set_header      Host "$host";
        proxy_pass            http://127.0.0.1:9999/;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 15;
        proxy_send_timeout    60;
        proxy_read_timeout    60;
        include               proxy_cache;
        proxy_redirect        default;
    }
}

这是包含的文件 proxy_cache 的内容:

proxy_cache             cache;
proxy_cache_key         "$scheme://$host$uri";
proxy_cache_use_stale   error;
proxy_next_upstream     off;
proxy_cache_min_uses    1;
proxy_cache_valid       200 302 1h;
proxy_cache_valid       301 1d;
proxy_cache_valid       any 30m;
proxy_buffers           128 4k;

我想做的是类似的事情:

if ( $remote_addr != "ip to exclude" ) 
 { include proxy_cache; }

不幸的是,这不起作用。任何帮助都非常感谢。谢谢。

答案1

绕过缓存的方法如下proxy_cache_bypass。如果传递给它的任何值非零,它将导致绕过缓存。

但在此之前,你需要将一个变量传递给它。对于你的情况,可以使用geo指令来检查远程 IP 地址。(也可以使用 来完成map,这是一个更通用的指令。)

因此,您所在街区的第一名是http

geo $ip_cache_bypass {
    default         0;
    192.0.2.81      1;
}

然后在您的代理配置指令中:

proxy_cache_bypass $ip_cache_bypass;

然后,IP 地址 192.0.2.81 将绕过缓存。您可以在geo块中添加任意数量的 IP 地址或 CIDR 范围。

相关内容