1. Salah satu cache tradisional (404)
Metode ini adalah dengan mengarahkan kesalahan 404 nginx ke backend, dan kemudian menggunakan proxy_store untuk menyimpan halaman yang dikembalikan oleh backend.
Konfigurasi:
lokasi/{
root /home/html/;#direktori Home
kedaluwarsa 1 hari;#Waktu berakhirnya halaman web
error_page 404 =200 /fetch$request_uri;#404 diarahkan ke direktori /fetch
}
lokasi /ambil/ {#404Langsung ke sini
internal;#Menunjukkan bahwa direktori ini tidak dapat diakses langsung secara eksternal
kedaluwarsa 1 hari;#Waktu berakhirnya halaman web
alias /home/html/;#Alamat sistem file direktori virtual harus konsisten dengan lokasi/, proxy_store akan menyimpan file ke direktori ini
proxy_pass http://www.sudone.com/;#Backend alamat upstream, /fetch juga merupakan proxy
proxy_set_header Terima-Encoding '';# Biarkan backend tidak mengembalikan konten terkompresi ( gzip atau deflate) Menyimpan konten terkompresi akan menyebabkan masalah.
proxy_store aktif;#Tentukan nginx untuk menyimpan file yang dikembalikan oleh proxy
proxy_temp_path /home/tmp;#Direktori sementara, direktori ini harus berada di partisi hard disk yang sama dengan /home/html
}
Saat menggunakannya, harap dicatat bahwa nginx harus memiliki izin untuk menulis file ke /home/tmp dan /home/html. Di Linux , nginx umumnya dikonfigurasi untuk dijalankan sebagai pengguna none, jadi kedua direktori ini harus chown ini eksklusif untuk pengguna siapa pun, tentu saja Anda juga dapat chmod 777, tetapi semua administrator sistem berpengalaman akan menyarankan untuk tidak menggunakan 777 dengan santai.
2. Tembolok tradisional 2 (!-e)
Prinsipnya pada dasarnya sama dengan 404 jump, namun lebih ringkas:
lokasi/{
root /rumah/html/;
proxy_store aktif;
proxy_set_header Terima-Encoding '';
proxy_temp_path /home/tmp;
jika ( !-f $request_filename )
{
proxy_pass http://www.sudone.com/;
}
}
Anda dapat melihat bahwa konfigurasi ini menyimpan banyak kode dibandingkan dengan 404. Konfigurasi ini menggunakan !-f untuk menentukan apakah file yang diminta ada di sistem file. Jika tidak ada, proxy_pass ke backend, dan pengembaliannya juga disimpan menggunakan proxy_store.
Kedua cache tradisional pada dasarnya memiliki kelebihan dan kekurangan yang sama:
Kerugian 1: Tautan dinamis dengan parameter, seperti read.php?id=1, tidak didukung. Karena nginx hanya menyimpan nama file, tautan ini hanya disimpan sebagai read.php di sistem file, sehingga pengguna dapat mengakses baca. php?id= 2 akan mengembalikan hasil yang salah. Pada saat yang sama, tidak mendukung beranda dalam bentuk http://www.sudone.com/ dan direktori sekunder http://www.sudone.com/download/, karena nginx sangat jujur dan akan menulis permintaan seperti itu ke dalam file sesuai dengan tautan sistem, dan tautan ini jelas merupakan direktori, sehingga penyimpanan gagal. Dalam kasus ini, penulisan ulang diperlukan untuk menyimpan dengan benar.
Kekurangan 2: Tidak ada mekanisme untuk kedaluwarsa dan pembersihan cache di dalam nginx. File-file yang di-cache ini akan disimpan secara permanen di mesin. Jika ada banyak hal yang akan di-cache, maka akan memenuhi seluruh ruang hard disk. Untuk tujuan ini, Anda dapat menggunakan skrip shell untuk membersihkannya secara rutin, dan Anda dapat menulis program dinamis seperti php untuk melakukan pembaruan waktu nyata.
Kerugian 3: Hanya 200 kode status yang dapat di-cache, jadi kode status seperti 301/302/404 yang dikembalikan oleh backend tidak akan di-cache. Jika tautan pseudo-statis dengan banyak kunjungan dihapus, itu akan berlanjut untuk menembus dan menyebabkan Bagian belakang membawa banyak tekanan.
Kekurangan 4: nginx tidak akan secara otomatis memilih memori atau hard disk sebagai media penyimpanan. Semuanya ditentukan oleh konfigurasi. Tentu saja, akan ada mekanisme cache file tingkat sistem operasi di sistem operasi saat ini, jadi tidak perlu terlalu khawatir tentang pembacaan bersamaan yang besar jika disimpan di hard disk. menyebabkan masalah kinerja.
Kekurangan dari cache tradisional nginx juga fiturnya yang berbeda dengan software caching seperti Squid, sehingga bisa juga dianggap sebagai kelebihannya. Dalam aplikasi produksi, sering digunakan sebagai partner dengan Squid. Squid sering kali tidak dapat memblokir link dengan ?, namun nginx dapat memblokir aksesnya, seperti: http://sudone.com/? com / akan diperlakukan sebagai dua tautan di Squid, sehingga akan menyebabkan dua penetrasi, sedangkan nginx hanya akan menyimpannya sekali, tidak peduli tautannya menjadi http://sudone.com/?1 atau http://sudone.com/ ? 123, tidak dapat di-cache oleh nginx, sehingga secara efektif melindungi host backend.
nginx akan dengan setia menyimpan formulir tautan ke sistem file, sehingga untuk tautan, Anda dapat dengan mudah memeriksa status cache dan kontennya di mesin cache, dan Anda juga dapat dengan mudah bekerja sama dengan pengelola file lain seperti rsync sepenuhnya merupakan struktur sistem file.
Kedua cache tradisional ini dapat menyimpan file ke /dev/shm di Linux. Umumnya saya melakukan ini agar memori sistem dapat digunakan untuk cache. Saat menggunakan /dev/shm/, selain mengarahkan direktori tmp ke partisi /dev/shm, jika terdapat banyak file dan direktori kecil, Anda juga harus mengubah jumlah inode dan kapasitas maksimum memori ini partisi:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
Perintah di atas digunakan pada mesin dengan memori 3G. Karena memori maksimum default /dev/shm adalah setengah dari memori sistem, yaitu 1500M, perintah ini akan menambahnya menjadi 2500M inode sistem mungkin tidak cukup secara default. Namun yang menarik adalah dapat disesuaikan sesuka hati. Penyesuaian di sini adalah 480000, yang agak konservatif, tetapi pada dasarnya sudah cukup.
3. Cache berdasarkan mem cache d
nginx memiliki beberapa dukungan untuk memcached , tetapi fungsinya tidak terlalu kuat, dan kinerjanya masih sangat bagus.
lokasi /mem/ {
jika ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
setel $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
habis masa berlakunya 70;
}
Konfigurasi ini akan mengarahkan http://sudone.com/mem/abc ke kunci abc dari memcached untuk mengambil data.
nginx saat ini tidak memiliki mekanisme apa pun untuk menulis ke memcached, jadi penulisan data ke memcached harus dilakukan menggunakan bahasa dinamis di latar belakang. Anda dapat menggunakan 404 untuk mengarahkan ke backend untuk menulis data.
4. Berdasarkan ncache plugin pihak ketiga
ncache adalah proyek bagus yang dikembangkan oleh Sina Brothers. Ia menggunakan nginx dan memcached untuk mengimplementasikan beberapa fungsi yang mirip dengan cache Squid.
http://code.google.com/p/ncache/
5. Fungsi proxy_cache yang baru dikembangkan dari nginx
Mulai dari versi nginx-0.7.44, nginx mendukung fungsi cache yang lebih formal mirip dengan Squid. Masih dalam tahap pengembangan dan dukungannya cukup terbatas. Cache ini menyimpan tautan setelah di-hash dengan pengkodean md5, sehingga dapat mendukung tautan apa pun. Pada saat yang sama, status Non-200 seperti 404/301/302 juga didukung.
Konfigurasi:
Pertama-tama konfigurasikan ruang cache:
proxy_cache_path /path/ke/cache level=1:2 key_zone=NAMA:10m tidak aktif=5m max_size=2m clean_time=1m;
Perhatikan bahwa konfigurasi ini di luar tag server. Levels menentukan bahwa ruang cache memiliki dua tingkat direktori hash. Direktori tingkat pertama adalah 1 huruf, dan tingkat kedua adalah 2 huruf. to/cache /c/29/b7f54b2df7773722d382f4809d65029c; key_zone memberi nama pada spasi ini, 10m berarti ukuran ruang adalah 10MB; 5m yang tidak aktif berarti waktu cache default adalah 5 menit; clean_time menentukan satu menit. Hapus cache satu kali.
lokasi/{
proxy_pass http://www.sudone.com/;
proxy_cache NAMA;#Gunakan NAMA key_zone
proxy_cache_valid 200 302 1h;#200 dan 302 kode status disimpan selama 1 jam
proxy_cache_valid 301 1d;#301 kode status disimpan selama satu hari
proxy_cache_valid setiap 1m;#Lainnya disimpan selama satu menit
}