Nginx verileri önbelleğe almıyor


16

Bir nginx proxy arkasında bir REST API var. Proxy uygulaması iyi çalışıyor ancak yanıtları önbelleğe alamıyorum. Herhangi bir yardım çok takdir edilecektir:

Nginx yapılandırması:

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

Ne denediğim önemli değil, Proxy-Cache her zaman bir MISS olarak geri gelir:

İstek Başlıkları:

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

Reponse Başlıkları:

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

Benim şüphe bu istemci başlıkları ile bir şey, ama curl üzerinden çağrı vermek ve başlıkları kontrol bile, hiçbir yanıt yoktur.

Şimdiden teşekkürler


1
İstek başlığında: Cache-Control:max-age=0... "bu isteği önbelleğe alma" anlamına gelir.
Nathan C

1
Müşteri başlığında bunu görmezden gelmenin bir yolu var mı? Bu da neden kıvrılma ile çalışmadığını
açıklamıyor

@ user2630270 İlk istek URL'si ve yöntemi nedir? Ara cevap nedir?
Xavier Lucas

@XavierLucas Şimdi Chrome için sorunu gidermeye başladığım için yukarıdaki başlıklara yönelik yöntemler GET. İstek nginxserver: port / solr / asd / select? Q = *: * satırları boyunca bir şeydir . Ara yanıtı nasıl yakalayacağımı bilmiyorum. Bununla ilgili talimatları nerede bulabilirim?
user2630270

Uygulamayı doğrudan nginx geçmeden vurursam, tam olarak aynı sorgu ile aşağıdaki yanıt başlıklarını alıyorum: İçerik Türü: metin / düz; charset = UTF-8 Aktarım Kodlaması: yığın
user2630270

Yanıtlar:


45

Nginx'e yanıtın ne kadar geçerli olduğunu ve önbellekten sunulması gerektiğini söylemediniz.

Bu proxy_cache_validyönerge ile belirtilmelidir .

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

Ancak, aynı içeriğe sahip değillerse, aynı URL'deki bir POST isteğinden diğerine farklılık gösteren önbellek anahtarınız olmadığı için bu POST istekleri için çalışmaz.

Bu yüzden önbellek anahtarını ayarlamanız gerekir $host$request_uri|$request_body. İhtiyaçlarınıza uygun olması için önbellek boyutunu ( proxy_cache_pathparametre max_size) ve proxy yanıt arabelleğini izlemeniz proxy_buffer_sizegerekir.


Güzel, teşekkürler dostum! İşe yaradı. Biraz daha açık bir yerde belgelenmiş olmasını dilerdim.
user2630270

Bu yönerge ayarlanmazsa, herhangi bir yanıt önbelleğe alınır. Ancak, uygulamanın X-Accel-Expire, Cache-Control veya Expire başlığı tarafından geçersiz kılınmıştır. En azından Set-Cookie ve Vary önbellekten kaçınabilir. Bu gerçekler dokümanda ortaya çıkar. Test etmek için basit bir senaryo oluşturdum çünkü çerçevem ​​Laravel, her zaman yukarıdaki başlıkları gönderiyor.
Victor Aguilar

Bu Xiavier Lucas'ı işe yaradı. Teşekkürler. Ayrıca farklı HTTP kodları için bir fark önbellek zaman değeri ekledim: proxy_cache_valid 200 302 10m; ////// proxy_cache_valid 404 1m;
Deunz

16

Gönderen: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

Sözdizimi: proxy_cache_valid [kod ...] zaman;

...

Önbellek parametreleri doğrudan yanıt başlığında da ayarlanabilir. Bu direktif kullanılarak önbellekleme zamanının ayarlanmasından daha yüksek önceliğe sahiptir.

  • “X-Accel-Expires” başlık alanı bir yanıtın önbellekleme süresini saniye olarak ayarlar. Sıfır değeri, bir yanıt için önbelleğe almayı devre dışı bırakır. Değer @ önekiyle başlarsa, yanıtın önbelleğe alınabileceği Epoch'tan bu yana saniye cinsinden mutlak bir süre ayarlar.
  • Üstbilgi “X-Accel-Expires” alanını içermiyorsa, önbellekleme parametreleri “Expires” veya
    “Cache-Control” üstbilgi alanlarında ayarlanabilir .
  • Başlık "Set-Cookie" alanını içeriyorsa , böyle bir yanıt önbelleğe alınmaz.
  • Başlık, "*" özel değerine sahip "Vary" alanını içeriyorsa, bu tür bir yanıt önbelleğe alınmaz (1.7.7). Üstbilgi
    başka bir değere sahip "Değişir" alanını içeriyorsa , bu tür bir yanıt
    karşılık gelen istek üstbilgisi alanları (1.7.7) dikkate alınarak önbelleğe alınır .

Bu yanıt başlığı alanlarından birinin veya daha fazlasının işlenmesi proxy_ignore_headers yönergesi kullanılarak devre dışı bırakılabilir .

Çoğu web uygulaması Set-Cookieüstbilgi ayarlar , bu nedenle bir yanıt önbelleğe alınmaz. Bunu düzeltmek için şu yönergeyi kullanın:

proxy_ignore_headers Set-Cookie;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.