Nginx speichert keine Daten zwischen

15

Ich habe eine REST-API hinter einem Nginx-Proxy. Das Proxen funktioniert einwandfrei, ich kann jedoch keine Antworten zwischenspeichern. Jede Hilfe wäre sehr dankbar:

Nginx-Konfiguration:

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

Egal was ich versucht habe, der Proxy-Cache kommt immer als MISS zurück:

Anforderungsheader sind:

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

Antwort-Header sind:

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

Mein Verdacht ist, dass es etwas mit den Client-Headern zu tun hat, aber selbst wenn ich den Anruf per Curl absetze und die Header überprüfe, gibt es keine Antwort.

Danke im Voraus

user2630270
quelle
1
Im Anforderungsheader: Cache-Control:max-age=0... bedeutet dies "Diese Anforderung nicht zwischenspeichern".
Nathan C
Kann ich das im Client-Header ignorieren? Dies erklärt nicht, warum es auch nicht durch Locken funktioniert ....
user2630270
@ user2630270 Wie lautet die URL und Methode der ersten Anforderung? Was ist die Zwischenantwort?
Xavier Lucas
@ XavierLucas die Methoden für die Header oben sind GET, da ich jetzt das Problem Chrome behebe. Die Anfrage ist etwas in der Art von nginxserver: port / solr / asd / select? Q = *: *. Ich weiß nicht, wie ich Zwischenantworten erfassen soll. Wo finde ich Anleitungen dazu?
user2630270
Wenn ich die Anwendung getroffen direkt ohne Umweg über nginx zu gehen, mit der genau gleichen Abfrage ich folgenden Antwort - Header erhalten: Content-Type: text / plain; charset = UTF-8 - Transfer-Encoding: Chunked
user2630270

Antworten:

44

Sie haben nginx nicht mitgeteilt, wie lange die Antwort gültig ist und aus dem Cache bereitgestellt werden muss.

Dies muss mit proxy_cache_validAnweisung angegeben werden.

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

Dies funktioniert jedoch nicht für POST-Anforderungen, da Sie keinen Cache-Schlüssel haben, der sich von einer POST-Anforderung zu einer anderen unter derselben URL unterscheidet, wenn sie nicht denselben Inhalt haben.

Sie müssen also den Cache-Schlüssel auf anpassen $host$request_uri|$request_body. Sie müssen die Cache-Größe ( proxy_cache_pathParameter max_size) und den Proxy-Antwortpuffer überwachen, proxy_buffer_sizedamit er Ihren Anforderungen entspricht.

Xavier Lucas
quelle
Schön, danke Mann! Es funktionierte. Ich wünschte, es wäre etwas expliziter dokumentiert.
user2630270
Wenn diese Anweisung nicht festgelegt ist, wird jede Antwort zwischengespeichert. Der wird aber durch den Header X-Accel-Expire, Cache-Control oder Expire der App überschrieben. Zumindest könnten Set-Cookie und Vary den Cache umgehen. Diese Fakten sind in der Dokumentation enthalten. Ich habe ein einfaches Skript zum Testen erstellt, da mein Framework, Laravel, immer die obigen Header sendet.
Victor Aguilar
15

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

Syntax: proxy_cache_valid [code ...] time;

...

Cache-Parameter können auch direkt im Antwortheader eingestellt werden. Dies hat eine höhere Priorität als die Einstellung der Caching-Zeit mithilfe der Direktive.

  • Das Header-Feld „X-Accel-Expires“ legt die Caching-Zeit einer Antwort in Sekunden fest. Der Wert Null deaktiviert das Caching für eine Antwort. Wenn der Wert mit dem Präfix @ beginnt, wird eine absolute Zeit in Sekunden seit Epoche festgelegt, bis zu der die Antwort zwischengespeichert werden kann.
  • Wenn der Header das Feld "X-Accel-Expires" nicht enthält, können die
    Cache- Parameter in den Header-Feldern "Expires" oder "Cache-Control" festgelegt werden.
  • Wenn der Header das Feld "Set-Cookie" enthält , wird eine solche Antwort nicht zwischengespeichert.
  • Wenn der Header das Feld "Vary" mit dem Sonderwert "*" enthält, wird eine solche Antwort nicht zwischengespeichert (1.7.7). Wenn der Header
    das Feld "Vary" mit einem anderen Wert enthält, wird eine solche Antwort
    unter Berücksichtigung der entsprechenden Anforderungsheaderfelder (1.7.7) zwischengespeichert.

Die Verarbeitung eines oder mehrerer dieser Antwortheaderfelder kann mit der Anweisung proxy_ignore_headers deaktiviert werden .

Die meisten Web-Apps setzen den Set-CookieHeader, sodass eine Antwort nicht zwischengespeichert wird. Um dies zu beheben, verwenden Sie diese Anweisung:

proxy_ignore_headers Set-Cookie;
Hieu
quelle