Ignorar o cache de um único IP com o NGINX

2

Eu quero configurar o NGINX para exibir conteúdo do cache para todos, exceto um endereço IP.

Os 2 objetivos que pretendo alcançar são:

  1. certifique-se de que, a partir do IP especificado, eu nunca acessei o cache, mas será exibido o arquivo real no disco (por isso, se eu remover o arquivo, ele deverá fornecer imediatamente um 404)
  2. para todos os outros IPs: se for solicitado conteúdo que ainda não esteja no cache, carregue-o imediatamente do arquivo e armazene-o no cache (portanto, se eu remover o arquivo, ele deverá ser exibido durante o cache)

Esta é a minha configuração até agora:

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;
    }
}

Este é o conteúdo do arquivo incluído 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;

O que eu gostaria de fazer é algo semelhante:

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

Infelizmente isso não funciona. Qualquer ajuda é muito apreciada. Obrigado.

    
por user204197 03.01.2014 / 12:22

1 resposta

2

Ignorar o cache é feito com proxy_cache_bypass . Isso fará com que o cache seja ignorado se qualquer valor que você passar para ele for diferente de zero.

Mas antes que você possa fazer isso, você precisa de uma variável para passar para ela. No seu caso, isso pode ser feito com uma diretiva geo para examinar o endereço IP remoto. (Também poderia ser feito com um map , que é uma diretiva mais geral na mesma linha.)

Então, primeiro lugar dentro do seu bloco http :

geo $ip_cache_bypass {
    default         0;
    192.0.2.81      1;
}

Em seguida, nas diretivas de configuração do proxy:

proxy_cache_bypass $ip_cache_bypass;

O cache será então ignorado para o endereço IP 192.0.2.81. Você pode adicionar quantos endereços IP ou intervalos CIDR desejar no bloco geo .

    
por 03.01.2014 / 21:37

Tags