pengembangan-web-mp-pd.com

Bagaimana cara mengatur Nginx sebagai proxy reverse caching?

Saya mendengar baru-baru ini bahwa Nginx telah menambahkan caching ke fitur proxy terbalik. Saya melihat sekeliling tetapi tidak menemukan banyak info tentang itu.

Saya ingin mengatur Nginx sebagai caching reverse proxy di depan Apache/Django: untuk memiliki permintaan proxy Nginx untuk beberapa (tetapi tidak semua) halaman dinamis ke Apache, kemudian cache halaman yang dihasilkan dan melayani permintaan berikutnya untuk halaman tersebut dari cache.

Idealnya saya ingin membatalkan cache dengan 2 cara:

  1. Tetapkan tanggal kedaluwarsa pada item yang di-cache
  2. Untuk secara eksplisit membatalkan item yang di-cache. Misalnya. jika backend Django saya telah memperbarui data tertentu, saya ingin memberi tahu Nginx untuk membatalkan cache dari halaman yang terpengaruh

Apakah mungkin untuk mengatur Nginx untuk melakukan itu? Bagaimana?

145
Continuation

Saya tidak berpikir bahwa ada cara untuk secara eksplisit membatalkan item yang di-cache, tetapi di sini adalah contoh bagaimana melakukan sisanya. Pembaruan: Seperti yang disebutkan oleh Piotr dalam jawaban lain, ada modul pembersih cache yang dapat Anda gunakan. Anda juga dapat memaksa penyegaran ulang item yang di-cache menggunakan proxy_cache_bypass nginx - lihat jawaban Cherian untuk informasi lebih lanjut.

Dalam konfigurasi ini, item yang tidak di-cache akan diambil dari example.net dan disimpan. Versi yang di-cache akan disajikan hingga klien masa depan hingga tidak lagi valid (60 menit).

Kontrol Cache dan Kedaluwarsa HTTP header Anda akan dihormati, jadi jika Anda ingin menetapkan tanggal kedaluwarsa secara eksplisit, Anda dapat melakukannya dengan mengatur header yang benar dalam apa pun yang Anda proksi.

Ada banyak parameter yang dapat Anda sesuaikan - lihat dokumentasi modul Proxy nginx untuk informasi lebih lanjut tentang semua ini termasuk rincian tentang arti pengaturan/parameter yang berbeda: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}
97
Casey

Anda dapat secara khusus cache tidak valid halaman melalui

proxy_cache_bypass       

Katakanlah Anda ingin me-cache halaman, atur cache dengan cara ini

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $Host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Sekarang, ketika Anda ingin membatalkan halaman itu dan cache lagi

Lakukan panggilan ikal rahasia dengan tajuk

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Ini akan membatalkan dan menyimpannya.

Bekerja dari nginx 0.7.

Sebagai bonus tambahan _ add_header X-Cache-Status dapat digunakan untuk memeriksa apakah halaman tersebut dari cache atau tidak.

47
Cherian

Saya sarankan Anda memberi Varnish mencoba. Varnish dirancang khusus sebagai cache proksi terbalik. Ini akan menghormati semua header kontrol cache yang Anda kirim dari server Origin, yang memenuhi permintaan pertama Anda.

Untuk permintaan kedua Anda, pembatalan eksplisit. Rekomendasi kuat saya adalah mengubah nama url sumber daya yang ingin Anda batalkan, baik dengan mengganti nama file atau menggunakan beberapa bentuk buster cache string kueri. Varnish memang memiliki operasi PURGE yang akan menghapus sumber daya dari cache Varnish, tetapi itu tidak akan memberi Anda kontrol atas cache lain antara Anda dan pengguna. Seperti yang Anda katakan ingin menghapus sumber daya secara eksplisit, maka header kontrol http standar tidak akan membantu Anda. Dalam kasus itu, cara yang paling mudah untuk mengalahkan caching sumber daya adalah dengan mengganti namanya.

36
Dave Cheney

Untuk membatalkan halaman yang dipilih, Anda dapat menggunakan patch "cache_purge" untuk nginx-0.8.x yang memang sesuai dengan yang Anda inginkan;)

Ini tersedia di sini .

8
Piotr Sikora

Kebanyakan alat caching (Citrix) memungkinkan pemuatan paksa (Ctrl + r) untuk mengisi kembali halaman yang di-cache.

Inilah trik yang saya temukan untuk melakukan hal serupa di nginx.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

Ini mengasumsikan bahwa ketika Anda melakukan Ctrl + r di browser Anda, header Cache-Control memiliki max-age = 0 dalam permintaannya. Saya tahu Chrome melakukan ini, tetapi saya belum mencoba di browser lain. Menambahkan lebih banyak kolom header bisa mudah, hanya dengan menambahkan lebih banyak jika pernyataan yang mengatur $eac variabel menjadi 1.

8
Randy Wallace

Caching adalah fungsi yang cukup baru di nginx (dan belum didokumentasikan dengan baik untuk saat ini), tetapi cukup stabil untuk digunakan dalam produksi.

5
SaveTheRbtz

Saya percaya NginxHttpProxyModule mampu membuat permintaan http. Cari arahan yang dimulai dengan:

proxy_cache

Ya, adalah mungkin untuk mengontrol perilaku cache melalui arahan seperti:

proxy_cache_valid
4
Taras Chuhay

Berdasarkan fakta bahwa Anda tidak dapat menemukan dokumen di atasnya, saya akan sedikit khawatir tentang mengandalkannya dalam produksi. Sudahkah Anda mempertimbangkan Varnish? Ini adalah "nginx of reverse proxies" saya, kecil, ringan, melakukan satu pekerjaan dan melakukannya dengan baik.

3
womble

Jika Anda menggunakan eTag pada aplikasi Anda dan meletakkan nginx di depannya maka itu akan menyelesaikan masa berlaku Anda, karena jika eTag berubah maka akan membuat cache tidak valid.

2
Martin Murphy

Anda dapat mengontrol kedaluwarsa cache Nginx dengan beberapa arahan/parameter:

  • proxy_cache_valid 200 302 10m;
  • menambahkan salah satu tajuk HTTP di bawah ini (prioritas penting - lihat posting blog saya ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • parameter inactive dalam proxy_cache_path pengarahan:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

Saya sarankan posting blog saya jika Anda ingin mempelajari lebih lanjut tentang caching Nginx.

Topik pembersihan sangat menarik karena fitur ini hanya ada di Nginx Plus (edisi komersial Nginx). Saya sangat suka jawaban @ randy-wallace. Tetapi ada juga kemungkinan lain seperti modul ngx_cache_purge .

Hal paling sederhana yang dapat Anda lakukan adalah menghapus file cache secara manual:

  • buat kunci hash Anda:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • hapus file dari sistem file:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
2
czerasz

Untuk pengunjung masa depan: Sementara itu proksi nginx reverse memiliki caching terintegrasi dan dokumen tersedia di:

Sintaksis: proxy_cache zone | mati;

Default: proxy_cache off;

Konteks: http, server, lokasi

Menentukan zona memori bersama yang digunakan untuk cache. Zona yang sama dapat digunakan di beberapa tempat. Nilai parameter dapat berisi variabel (1.7.9). Parameter tidak aktif menonaktifkan caching yang diwarisi dari tingkat konfigurasi sebelumnya.

2
Tarik Huclaslun
 fastcgi_cache_path/opt/nginx-cache level = 2: 2 keys_zone = img: 50m; 
 lokasi./img/{
 fastcgi_pass $ backend; 
 termasuk fcgi_params; 
 fastcgi_intercept_errors dimatikan; 
 fastcgi_cache_key $ server_addr $ request_uri; 
 fastcgi_cache img; 
 fastcgi_cache_valid 1m; 
 fastcgi_hide_header Set-Cookie; 
} 

Ini menciptakan cache untuk/img/lokasi. Itu ada di/opt/nginx-cache. Objek di-cache selama 1 menit.

Anda dapat menulis kode respons yang berbeda.

Sekarang Anda tidak dapat membatalkan cache untuk halaman yang dipilih. Mungkin dalam 0,8.x itu akan mungkin.

0
lexsys

Ada plugin nginx bernama ncache yang mengklaim sebagai "sistem cache web berbasis server web nginx. Lebih cepat dan lebih efisien daripada squid."

0
sajal