Memahami arahan nginx proxy_cache_path

30

Misalkan saya punya file konfigurasi nginx ini

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • Apa keys_zone=myCache:8martinya? Tidak banyak yang dikatakan di dokumen:

Selain itu, semua kunci dan informasi aktif tentang data disimpan dalam zona memori bersama, yang nama dan ukurannya dikonfigurasikan oleh parameter keys_zone.

  • Bagaimana jika proxy_cache_valid( 12h) lebih tinggi dari nilai yang ditentukan inactive( 1h) di proxy_cache_path? Aturan mana yang akan diikuti? misalnya

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

Terima kasih!

Jürgen Paul
sumber

Jawaban:

39

Apa arti dari keys_zone = myCache: 8m?

Seperti yang dikatakan dokumentasi , nginx akan menyimpan semua kunci aktif dan informasi tentang data disimpan dalam zona memori bersama, yang namedan sizedikonfigurasikan oleh parameter keys_zone. Sebagai kelengkapan, mari kita hancurkan per bagian

  • /var/cache/nginxadalah tempat di mana cache sebenarnya disimpan. Di dalam folder, file cache adalah file biner tetapi Anda dapat dengan mudah melihat tag html di dalamnya.
  • levels=1:2 adalah level levels menentukan jumlah level subdirektori dalam cache.
  • keys_zone=myCache:8mmendefinisikan zona memori bersama bernama myCache dengan ukuran maksimum 8 MB. Itu memegang semua kunci aktif dan metadata cache. Jadi, setiap kali nginx memeriksa apakah suatu halaman di-cache, ia berkonsultasi terlebih dahulu dengan zona memori bersama, lalu mencari lokasi cache aktual /var/cache/nginxjika ada cache.
  • max_sizeukuran maksimum cache misalnya ukuran file aktif /var/cache/nginx.
  • inactive=1htentukan cache waktu tidak aktif maksimum dapat disimpan. Data dalam cache yang tidak diakses selama waktu yang ditentukan oleh inactiveparameter bisa dihapus dari cache terlepas dari kesegarannya.

Cara kerja validasi dan penghapusan cache

Diambil dari milis nginx

  • Arahan proxy_cache_valid menentukan berapa lama respons akan dianggap valid (dan akan dikembalikan tanpa ada permintaan untuk backend). Setelah waktu ini, respons akan dianggap "basi" dan tidak akan dikembalikan atau akan tergantung pada pengaturan proxy_cache_use_stale .

  • Argumen tidak aktif dari proxy_cache_path menspesifikasikan berapa lama respon akan disimpan dalam cache setelah penggunaan terakhir. Perhatikan bahwa bahkan tanggapan basi akan dianggap baru digunakan jika ada permintaan kepada mereka.

Seperti yang saya mengerti, di sini pseudocode cara kerja nginx

Ketika permintaan datang

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

Dalam proses lain, manajer cache melakukan logika ini

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

Bagaimana jika proxy_cache_valid (12j) lebih tinggi dari nilai tidak aktif yang ditentukan (1j) di proxy_cache_path?

Selama permintaan dan mengakses cache tertentu, objek cache itu masih akan berlaku sampai 12 jam setelah objek memasukkan cache. Setelah itu, cache dianggap tidak valid, sehingga nginx akan mengambil dari backend dan mereset timer yang valid. Tetapi jika objek tidak aktif (tidak diakses) lebih dari satu jam - bahkan dalam 12 jam periode cache yang valid -, nginx akan menghapusnya karena inactiveparameter.

masegaloeh
sumber
"Setelah itu, cache dianggap tidak valid, jadi nginx akan mengambil dari backend dan mereset timer yang valid." - Itu menarik. Jadi nginx mengambil permintaan bahkan jika tidak ada pengguna yang mengambilnya? Jadi, misalnya, jika tidak aktif 365ddan valid 1dmaka nginx akan mengambil permintaan dalam cache setiap hari selama satu tahun bahkan jika tidak ada yang membuat permintaan itu?
Martin Thoma
1
Jawaban yang bagus, tetapi sepertinya saya tidak dapat menemukan dokumentasi pada satuan ukuran yang kami gunakan dengan beberapa parameter ini. Sebagai contoh, inactiveparams mengambil nilai waktu tetapi saya tidak melihat nilai apa yang bisa saya gunakan selain h(bagaimana 1 bulan? Atau 1 hari? Dll). Dan apa yang harus kita tentukan max_size? Bytes? Bisakah saya menggunakan 1M untuk 1 megabyte?
Sunil D.
4
@SunilD. - ini dia: nginx.org/en/docs/syntax.html
adamczi