Nginx tidak melakukan caching data

15

Saya memiliki REST API di belakang proxy nginx. Proksi berfungsi dengan baik, namun saya tidak dapat menyimpan tanggapan apa pun. Bantuan apa pun akan sangat dihargai:

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

Tidak peduli apa yang saya coba, Proxy-Cache selalu kembali sebagai MISS:

Header Permintaan adalah:

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

Header Respons adalah:

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

Kecurigaan saya adalah ada sesuatu dengan header klien, tetapi bahkan jika saya mengeluarkan panggilan melalui curl dan memeriksa header, tidak ada respons.

Terima kasih sebelumnya

pengguna2630270
sumber
1
Di header permintaan: Cache-Control:max-age=0... yang menyiratkan "jangan cache permintaan ini."
Nathan C
Apakah ada cara bagi saya untuk mengabaikan hal itu di header klien? Ini tidak menjelaskan mengapa itu tidak berhasil melalui ikal baik ....
user2630270
@ user2630270 Apa URL & metode permintaan awal? Apa tanggapan antara?
Xavier Lucas
@XavierLucas metode untuk tajuk di atas DAPATKAN karena saya sekarang memecahkan masalah Chrome. Permintaan adalah sesuatu di sepanjang baris nginxserver: port / solr / asd / select? Q = *: *. Saya tidak tahu cara menangkap respons perantara. Di mana saya dapat menemukan petunjuk tentang ini?
user2630270
Jika saya menekan aplikasi secara langsung tanpa melalui nginx, dengan permintaan yang persis sama saya mendapatkan tajuk respons berikut: Content-Type: text / plain; charset = UTF-8 Transfer-Pengkodean: chunked
user2630270

Jawaban:

44

Anda tidak memberi tahu nginx untuk berapa lama respons tersebut valid dan harus dilayani dari cache.

Ini harus ditentukan dengan proxy_cache_validarahan.

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

Tapi, ini tidak akan berfungsi untuk permintaan POST karena Anda tidak memiliki kunci cache yang berbeda dari permintaan POST ke yang lain di URL yang sama jika mereka tidak memiliki konten yang sama.

Jadi, Anda perlu menyesuaikan kunci cache $host$request_uri|$request_body. Anda harus memantau ukuran cache ( proxy_cache_pathparameter max_size) dan buffer respons proxy proxy_buffer_sizesehingga sesuai dengan kebutuhan Anda.

Xavier Lucas
sumber
Bagus, terima kasih kawan! Itu berhasil. Berharap itu didokumentasikan di suatu tempat sedikit lebih eksplisit.
user2630270
Jika arahan ini tidak disetel maka respons apa pun akan di-cache. Tapi yang ditimpa oleh header X-Accel-Expire, Cache-Control atau Expire dari aplikasi. Setidaknya, Set-Cookie dan Vary dapat menghindari cache. Fakta-fakta ini terungkap dalam dokumen. Saya membuat skrip sederhana untuk diuji karena kerangka kerja saya, Laravel, selalu mengirim header di atas.
Victor Aguilar
15

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

Sintaks: proxy_cache_valid [kode ...] waktu;

...

Parameter caching juga dapat diatur langsung di header respons. Ini memiliki prioritas lebih tinggi daripada pengaturan waktu caching menggunakan arahan.

  • Kolom header "X-Accel-Expires" menetapkan waktu caching respons dalam hitungan detik. Nilai nol menonaktifkan caching untuk suatu respons. Jika nilainya dimulai dengan awalan @, ia menetapkan waktu absolut dalam detik sejak Zaman, hingga di mana respons mungkin di-cache.
  • Jika tajuk tidak menyertakan bidang "X-Accel-Expires", parameter caching dapat diatur dalam bidang tajuk "Kedaluwarsa" atau
    "Kontrol Tembolok".
  • Jika tajuk menyertakan bidang "Set-Cookie" , respons seperti itu tidak akan di-cache.
  • Jika header menyertakan bidang "Vary" dengan nilai khusus "*", respons seperti itu tidak akan di-cache (1.7.7). Jika tajuk menyertakan
    bidang "Vary" dengan nilai lain, respons seperti itu akan di-cache
    dengan memperhitungkan bidang tajuk permintaan yang sesuai (1.7.7).

Pemrosesan satu atau lebih dari bidang header respons ini dapat dinonaktifkan menggunakan direktif proxy_ignore_headers .

Sebagian besar aplikasi web mengatur Set-Cookietajuk, sehingga respons tidak akan di-cache. Untuk memperbaikinya, gunakan arahan ini:

proxy_ignore_headers Set-Cookie;
Hieu
sumber