Nginx non memorizza nella cache i dati


15

Ho un'API REST dietro un proxy nginx. Il proxy funziona bene, tuttavia non sono in grado di memorizzare nella cache le risposte. Qualsiasi aiuto sarebbe molto apprezzato:

Configurazione Nginx:

worker_processes  10;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
        proxy_cache_path /path/to/cache/dir keys_zone=one:60m;
        proxy_cache_methods GET HEAD POST;

     upstream backend {
        server server1 backup;
        server server2 weight=5;
    }
    access_log  logs/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       7076;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log;

        location / {
            add_header 'Access-Control-Allow-Origin' *;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

            proxy_cache one;
            proxy_cache_key $host$uri$is_args$args;

            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Cache-Control;

            proxy_hide_header Cache-Control;
            proxy_hide_header Set-Cookie;
            proxy_pass http://backend;
        }
    }
}

Indipendentemente da ciò che ho provato, il Proxy-Cache ritorna sempre come MISS:

Le intestazioni di richiesta sono:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:nginxserver:portnumber
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

Le intestazioni di Reponse sono:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,Accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/plain;charset=UTF-8
Date:Wed, 15 Oct 2014 16:30:18 GMT
Server:nginx/1.7.4
Transfer-Encoding:chunked
X-Proxy-Cache:MISS

Il mio sospetto è che si tratti di qualcosa con le intestazioni client, ma anche se invio la chiamata tramite curl e controllo le intestazioni, non c'è risposta.

Grazie in anticipo


1
Nell'intestazione della richiesta: Cache-Control:max-age=0... ciò implica "non memorizzare questa richiesta nella cache".
Nathan C,

C'è un modo per me di ignorarlo nell'intestazione del client? Questo non spiega perché non funziona neanche attraverso l'arricciatura ....
user2630270,

@ user2630270 Qual è l'URL e il metodo della richiesta iniziale? Qual è la risposta intermedia?
Xavier Lucas,

@XavierLucas I metodi per le intestazioni sopra sono OTTENUTI dal momento che sto risolvendo il problema di Chrome. La richiesta è qualcosa sulla falsariga di nginxserver: port / solr / asd / select? Q = *: *. Non so come catturare la risposta intermedia. Dove posso trovare le istruzioni su questo?
user2630270,

Se colpisco direttamente l'applicazione senza passare per nginx, con la stessa identica query ottengo le seguenti intestazioni di risposta: Content-Type: text / plain; charset = UTF-8 Transfer-Encoding: chunked
user2630270

Risposte:


44

Non hai detto a nginx per quanto tempo la risposta è valida e deve essere pubblicata dalla cache.

Questo deve essere specificato con proxy_cache_validdirettiva.

proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;

Ma questo non funzionerà per le richieste POST perché non hai una chiave cache che differisce da una richiesta POST a un'altra sullo stesso URL se non hanno lo stesso contenuto.

Quindi dovrai regolare la chiave della cache su $host$request_uri|$request_body. Dovrai monitorare le dimensioni della cache ( proxy_cache_pathparametro max_size) e il buffer di risposta proxy in proxy_buffer_sizemodo che si adattino alle tue esigenze.


Bello, grazie amico! Ha funzionato. Vorrei che fosse documentato da qualche parte un po 'più esplicitamente.
user2630270,

Se questa direttiva non viene impostata, qualsiasi risposta verrà memorizzata nella cache. Ma quello viene sostituito dall'intestazione X-Accel-Expire, Cache-Control o Expire dell'app. Almeno, Set-Cookie e Vary potrebbero evitare la cache. Questi fatti sono esposti nel documento. Ho creato un semplice script da testare perché il mio framework, Laravel, invia sempre le intestazioni precedenti.
Victor Aguilar,

15

Da: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

Sintassi: proxy_cache_valid [codice ...] tempo;

...

I parametri della memorizzazione nella cache possono anche essere impostati direttamente nell'intestazione della risposta. Ciò ha una priorità maggiore rispetto all'impostazione del tempo di memorizzazione nella cache mediante la direttiva.

  • Il campo di intestazione "X-Accel-Expires" imposta il tempo di memorizzazione nella cache di una risposta in secondi. Il valore zero disabilita la memorizzazione nella cache per una risposta. Se il valore inizia con il prefisso @, imposta un tempo assoluto in secondi dall'epoca, fino al quale la risposta può essere memorizzata nella cache.
  • Se l'intestazione non include il campo "X-Accel-Expires", i parametri della cache possono essere impostati nei campi dell'intestazione "Scadenza" o
    "Cache-Control".
  • Se l'intestazione include il campo "Set-Cookie" , tale risposta non verrà memorizzata nella cache.
  • Se l'intestazione include il campo "Varia" con il valore speciale "*", tale risposta non verrà memorizzata nella cache (1.7.7). Se l'intestazione include
    il campo "Varia" con un altro valore, tale risposta verrà memorizzata
    nella cache tenendo conto dei campi dell'intestazione della richiesta corrispondenti (1.7.7).

L'elaborazione di uno o più di questi campi di intestazione della risposta può essere disabilitata usando la direttiva proxy_ignore_headers .

La maggior parte delle app Web imposta l' Set-Cookieintestazione, quindi una risposta non verrà memorizzata nella cache. Per risolvere il problema, utilizzare questa direttiva:

proxy_ignore_headers Set-Cookie;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.