2 votes

Contourner le cache d'une seule IP avec NGINX

Je veux configurer NGINX pour qu'il serve le contenu du cache à tout le monde sauf à une adresse IP.

Les deux objectifs que je souhaite atteindre sont les suivants :

  1. s'assurer qu'à partir de l'adresse IP spécifiée, je n'atteindrai jamais le cache mais que je recevrai le fichier réel sur le disque (donc si je supprime le fichier, il devrait immédiatement donner un message 404).
  2. pour toutes les autres IP : si un contenu qui n'est pas encore dans le cache est demandé, il est immédiatement chargé à partir du fichier et stocké dans le cache (ainsi, si je supprime le fichier, il devrait être servi pendant la durée du cache).

Voici ma configuration actuelle :

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

Il s'agit du contenu du fichier proxy_cache inclus :

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;

J'aimerais faire quelque chose de similaire :

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

Malheureusement, cela ne fonctionne pas. Toute aide est grandement appréciée. Je vous remercie.

3voto

Michael Hampton Points 232226

Le contournement du cache se fait avec proxy_cache_bypass . Le cache sera contourné si une valeur non nulle lui est transmise.

Mais avant de pouvoir faire cela, vous avez besoin d'une variable à lui passer. Dans votre cas, cela peut être fait avec un geo pour examiner l'adresse IP distante. (Cela peut également être fait avec une directive map qui est une directive plus générale allant dans le même sens).

Ainsi, la première place au sein de votre http bloc :

geo $ip_cache_bypass {
    default         0;
    192.0.2.81      1;
}

Ensuite, dans les directives de configuration de votre proxy :

proxy_cache_bypass $ip_cache_bypass;

Le cache sera alors contourné pour l'adresse IP 192.0.2.81. Vous pouvez ajouter autant d'adresses IP ou de plages CIDR que vous le souhaitez dans le champ geo bloc.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X