Pertanyaan Bagaimana cara mengatur Nginx sebagai proxy reverse caching?


Saya baru-baru ini mendengar bahwa Nginx telah menambahkan cache ke fitur reverse proxy-nya. Saya melihat sekeliling tetapi tidak dapat menemukan banyak info tentang itu.

Saya ingin mengatur Nginx sebagai proxy reverse cache 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. Atur tanggal kedaluwarsa pada item yang di-cache
  2. Untuk secara eksplisit membatalkan item cache. Misalnya. jika backend Django saya telah memperbarui data tertentu, saya ingin memberi tahu Nginx untuk membatalkan cache halaman yang terpengaruh

Apakah mungkin mengatur Nginx untuk melakukan itu? Bagaimana?


139
2018-06-24 01:35






Jawaban:


Saya tidak berpikir bahwa ada cara untuk secara eksplisit membatalkan item yang di-cache, tetapi di sini adalah contoh bagaimana melakukan sisanya. Memperbarui: Seperti yang disebutkan oleh Piotr dalam jawaban lain, ada a modul cache pembersihan yang bisa Anda gunakan. Anda juga dapat memaksa refresh 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 ke klien di masa depan sampai tidak berlaku lagi (60 menit).

Kontrol Cache Anda dan Expired HTTP header akan dihormati, jadi jika Anda ingin secara eksplisit mengatur tanggal kedaluwarsa, 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;
    }
  }
}

94
2017-09-23 20:01



Ini adalah langkah pertama yang masuk akal untuk aplikasi baru yang tidak memiliki 20k / req / s. - Barry
@Barry apa yang akan menjadi steP kedua? - Jürgen Paul
@Legit - Saya tidak tahu, tetapi secara tradisional langkah terakhir adalah "Untung" :-) - Stephen C
Sayangnya, itu tidak bekerja dengan nginx 1.11. Sejak pembaruan terakhir sekitar 3 tahun yang lalu, sepertinya ini bukan lagi solusi. - izogfif


Anda bisa secara spesifik batalkan cache halaman melalui

proxy_cache_bypass       

Katakanlah Anda ingin men-cache halaman, mengatur 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, kapan Anda mau batalkan halaman itu dan simpan lagi 

Lakukan panggilan rahasia curl dengan header

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.


46
2017-11-26 04:00



Ini hanya dapat memperbarui halaman yang di-cache ketika halaman baru juga dapat disimpan dalam cache. Jika Anda telah menghapus halaman (404 atau kesalahan lain sekarang dilayani oleh backend), halaman sekarang mengirim header Set-Cookie atau "Content-Control: private", konten yang di-cache tidak akan "invalidated". - rbu


Saya sarankan Anda berikan Pernis mencoba. Varnish secara khusus dirancang sebagai cache proxy terbalik. Ini akan menghormati semua header kontrol cache yang Anda kirim dari server asal, 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 dari pemecah cache string kueri. Varnish memang memiliki PURGE operasi 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 Anda ingin membersihkan sumber daya secara eksplisit, maka header kontrol http standar tidak akan membantu Anda. Dalam hal ini, cara paling mudah untuk mengalahkan cache sumber daya adalah dengan mengganti namanya.


36
2018-06-24 02:43



Bisakah Anda menjelaskan apa yang Anda maksud dengan "mengganti nama file atau menggunakan beberapa bentuk dari pemecah cache string kueri"? Saya tidak yakin saya mengerti mengapa itu bukan ide yang baik untuk menggunakan operasi seperti PURGE. - Continuation
+1 untuk pernis. Itu selalu jauh lebih baik untuk menggunakan alat yang tepat untuk pekerjaan itu. - Tom O'Connor
@below: Hampir tidak ada harapan untuk menyentuh pernis di arena pertunjukan dan keserbagunaan. Ini didukung oleh salah satu pengembang kernel FreeBSD memimpin dan tim yang berdedikasi yang berbasis di Eropa. Varnish sedang dalam produksi di twitter, heroku dan banyak lagi. - Barry
Contoh paling sederhana dari cache-buster adalah menambahkan nomor versi dalam string kueri ke sumber daya statis, sehingga style.css menjadi style.css? 123. Saat Anda ingin mendorong versi baru file, Anda mengubah url sumber daya menjadi style.css? 124 dan sekarang cache akan mengambilnya sebagai aset yang sepenuhnya baru untuk di-cache secara terpisah. Apache akan melayani file style.css dengan string kueri yang ditambahkan, jadi tidak diperlukan perubahan pada file yang sebenarnya. - chmac
Jika memungkinkan, yang terbaik adalah meletakkan pemecah cache ke dalam nama file itu sendiri, seperti style.v123.css karena beberapa cache tidak akan menyimpan permintaan yang memiliki string kueri. - Noah McIlraith


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

Tersedia sini.


7
2017-11-17 07:38





Kebanyakan alat caching (Citrix) memungkinkan refresh kekuatan (Ctrl + r) untuk terisi kembali halaman cache.

Inilah trik yang saya temukan untuk melakukan sesuatu yang mirip dalam 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 peramban lain. Menambahkan lebih banyak kolom header bisa mudah, dengan hanya menambahkan lebih banyak jika pernyataan yang mengatur $eac variabel ke 1.


6
2018-04-10 23:02





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


4
2018-06-24 02:25





aku percaya NginxHttpProxyModule mampu memenuhi permintaan http. Carilah arahan yang dimulai dengan:

proxy_cache

Ya, dimungkinkan untuk mengontrol perilaku cache melalui arahan seperti:

proxy_cache_valid

3
2018-06-24 10:12





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


2
2018-06-24 01:38



Dokumentasi di sini: wiki.nginx.org/NginxHttpProxyModule#proxy_cache - rmalayter


Jika Anda menggunakan eTag di aplikasi Anda dan meletakkan nginx di depannya maka ia akan mengurus masa kadaluarsa untuk Anda, karena jika perubahan eTag itu akan membatalkan cache.


1
2017-11-16 15:20



Sangat? Ini terlihat seperti ngnix cocok dengan etag dan tidak pernah berbicara dengan aplikasi untuk mengetahui apakah ada etag diperbarui. - John Naegle


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
  • itu inactive parameter dalam proxy_cache_path direktif:

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

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

Topik pembersihan benar-benar 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:

  • menghasilkan kunci hash Anda:

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

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

1
2018-03-31 18:06