Mengapa menyimpan file statis dengan Varnish, mengapa tidak lulus

9

Saya memiliki sistem runnning nginx / php-fpm / varnish / wordpress dan amazon s3.

Sekarang saya telah melihat banyak file konfigurasi saat mengatur sistem, dan pada semuanya saya menemukan sesuatu seperti ini:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

Saya tidak mengerti mengapa ini dilakukan. Sebagian besar contoh juga menjalankan NginX sebagai server web. Sekarang pertanyaannya adalah, mengapa Anda menggunakan cache pernis untuk melakukan cache file statis ini.

Lebih masuk akal bagi saya untuk hanya men-cache file dinamis sehingga php-fpm / mysql tidak terkena sebanyak itu.

Apakah saya benar atau saya kehilangan sesuatu di sini?

MEMPERBARUI

Saya ingin menambahkan beberapa info ke pertanyaan berdasarkan jawaban yang diberikan.

Jika Anda memiliki situs web yang dinamis, di mana kontennya benar-benar banyak berubah, chaching tidak masuk akal. Tetapi jika Anda menggunakan WordPress untuk situs web statis misalnya, ini bisa di-cache untuk jangka waktu yang lama.

Yang mengatakan, yang lebih penting bagi saya adalah static conent . Saya telah menemukan tautan dengan beberapa pengujian dan benchmark pada berbagai aplikasi cache dan aplikasi server web.

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX sebenarnya lebih cepat dalam mendapatkan konten statis Anda, jadi lebih masuk akal untuk membiarkannya berlalu. NginX bekerja sangat baik dengan file statis.

-

Selain itu, sebagian besar waktu konten statis bahkan tidak ada di server web itu sendiri. Sebagian besar waktu konten ini disimpan di CDN di suatu tempat, mungkin AWS S3, sesuatu seperti itu. Saya pikir cache pernis adalah tempat terakhir di mana Anda ingin Anda menyimpan konten statis.

Saif Bechan
sumber

Jawaban:

10

Ada beberapa keuntungan Varnish. Yang pertama Anda perhatikan adalah mengurangi beban pada server backend. Biasanya dengan caching konten yang dihasilkan secara dinamis tetapi jarang berubah (dibandingkan dengan seberapa sering diakses). Mengambil contoh Wordpress Anda, sebagian besar halaman mungkin tidak terlalu sering berubah, dan ada beberapa plugin yang ada untuk membatalkan cache varnish ketika halaman berubah (yaitu posting baru, edit, komentar, dll). Oleh karena itu, Anda melakukan cache tanpa batas, dan membatalkan perubahan - yang menghasilkan beban minimum ke server backend Anda.

Artikel tertaut tidak tahan, kebanyakan orang akan menyarankan bahwa Varnish berkinerja lebih baik daripada Nginx jika setup dengan benar - walaupun, (dan saya sangat benci untuk mengakuinya) - tes saya sendiri tampaknya setuju bahwa nginx dapat melayani file statis lebih cepat daripada pernis ( untungnya, saya tidak menggunakan pernis untuk tujuan itu). Saya pikir masalahnya adalah jika Anda akhirnya menggunakan Varnish, Anda telah menambahkan lapisan tambahan ke pengaturan Anda. Melewati lapisan tambahan itu ke server backend akan selalu lebih lambat daripada hanya melayani langsung dari backend - dan inilah mengapa mengizinkan Varnish untuk melakukan cache mungkin lebih cepat - Anda menyimpan satu langkah. Keuntungan lainnya adalah di depan disk-io. Jika Anda mengatur pernis untuk menggunakan malloc, Anda tidak menekan disk sama sekali, yang membuatnya tersedia untuk proses lain (dan biasanya mempercepat).

Saya pikir orang perlu tolok ukur yang lebih baik untuk benar-benar mengukur kinerja. Berulang kali meminta cache file sistem yang sama, tunggal, memicu yang mulai mengalihkan fokus dari server web itu sendiri. Tolok ukur yang lebih baik akan menggunakan pengepungan dengan beberapa ribu file statis acak (bahkan mungkin dari log server Anda) untuk mensimulasikan lalu lintas realistis. Namun bisa dibilang, seperti yang Anda sebutkan, telah menjadi semakin umum untuk membongkar konten statis ke CDN, yang berarti bahwa Varnish mungkin tidak akan melayani untuk memulainya (Anda menyebutkan S3).

Dalam skenario dunia nyata, Anda mungkin akan memprioritaskan penggunaan memori Anda - konten dinamis terlebih dahulu, karena merupakan yang paling mahal untuk dihasilkan; kemudian konten statis kecil (mis. js / css), dan gambar yang terakhir - Anda mungkin tidak akan men-cache media lain dalam memori, kecuali Anda memiliki alasan yang sangat bagus untuk melakukannya. Dalam hal ini, dengan Varnish memuat file dari memori, dan nginx memuatnya dari disk, Varnish kemungkinan akan melebihi kinerja nginx (perhatikan bahwa cache nginx hanya untuk proksi dan fastCGI, dan itu, secara default adalah berbasis disk - meskipun, itu adalah mungkin untuk menggunakan nginx dengan memcached).

(Cepat saya - sangat kasar, tidak diberi kredibilitas - tes menunjukkan nginx (langsung) adalah yang tercepat - sebut saja 100%, pernis (dengan malloc) sedikit lebih lambat (sekitar 150%), dan nginx di belakang pernis) dengan pass) adalah yang paling lambat (sekitar 250%). Itu berbicara untuk dirinya sendiri - semua atau tidak sama sekali - menambahkan waktu ekstra (dan pemrosesan) untuk berkomunikasi dengan backend, cukup menyarankan bahwa jika Anda menggunakan Varnish, dan punya RAM untuk digunakan , Anda mungkin juga hanya cache semua yang Anda bisa dan sajikan dari Varnish bukannya lewat kembali ke nginx.)

cyberx86
sumber
Saya suka poin yang Anda buat, saya baru saja mulai menggali ke dalam ini dan saya merasa aneh bahwa sebagian besar panduan online hanya membiarkan Anda men-cache konten statis dengan pernis, saya yakin beberapa orang caching MB dari konten statis. Memang benar apa yang Anda katakan, jika itu adalah file kecil, dan jika Anda memiliki memori untuk cadangan itu ok.
Saif Bechan
Yang mengatakan, saya tidak punya memori untuk cadangan, dan saya punya beberapa file layout template yang saya tidak ingin memakai CDN, saya hanya ingin mereka di direktori template saya. Saya akan menghapus potongan dari konfigurasi pernis saya yang menyimpannya, sehingga memori yang saya miliki dapat digunakan dengan lebih baik. Saya menyukai tip tentang 3 pengaturan berbeda. Saya pikir saya akan membuka port langsung ke nginx dan melayani file template dari sana. memiliki pernis menangani html, pegangan nginx statis, dan jika perlu php / mysql untuk beberapa konten segar.
Saif Bechan
Anda akan mencatat bahwa banyak pengaturan Varish menggunakan banyak GB memori - pengaturan yang benar, dan di bawah skenario kehidupan nyata, saya tidak ragu bahwa itu melebihi kinerja nginx; Saya mungkin menyarankan, bahwa itu adalah fleksibilitas dan opsi yang ditawarkan Varnish yang membuatnya populer - itu secara khusus dirancang untuk caching afterall. Dengan Wordpress, pengaturan pilihan saya adalah Wordpress + W3TC (+ Cloudfront) + Varnish + Nginx + PHP-FPM + APC. Ini sebenarnya tidak secepat dalam beberapa kasus seperti pengaturan lainnya, tetapi menangani memuat dengan cukup baik dengan kinerja yang baik. Perlu diingat bahwa firewall perusahaan sering memblokir port yang tidak standar.
cyberx86
Karena penasaran, mengapa tidak menyimpan template Anda (mungkin berarti CSS / JS - PHP, tentu saja, harus tetap di server Anda) di CDN Anda? Juga, salah satu contoh EC2 saya adalah pengaturan dengan pemikiran yang sama, dan termasuk yang berikut: if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}di vcl_recv (). Pada dasarnya, saya tidak ingin men-cache media - tapi tentu saja ingin me-cache html (php) dan bahkan js / css (teori adalah bahwa gambar berkontribusi lebih sedikit terhadap waktu buka halaman yang dirasakan daripada tata letak).
cyberx86
Saya telah melihat w3tc, tetapi saya tidak terlalu suka menggunakan plugin. Saya hanya membuat plugin kecil saya sendiri yang menangani opsi spesifik untuk setiap situs tertentu, jadi saya tahu apa yang dilakukan semuanya. Dari seorang programmer POV saya telah melihat beberapa plugin, dan beberapa dirancang dengan mengerikan. Saya membuat plugin minify sendiri, mengarahkan dan mengunggah file media ke s3 dan cf, plugin memcached kecil, dan beberapa lainnya. Saya hanya belum sampai pada titik untuk membuat plugin final yang mengurus mengunggah template ke CDN.
Saif Bechan
2

Saya pikir Anda mungkin kehilangan sesuatu.

Menurut definisi, file dinamis berubah. Biasanya, mereka berubah dengan melakukan semacam permintaan basis data yang memengaruhi konten halaman yang dilayani hingga ke pengguna. Karena itu, Anda tidak ingin melakukan cache konten dinamis. Jika Anda melakukannya, itu hanya menjadi konten statis dan kemungkinan besar konten statis dengan konten yang salah.

Sebagai contoh sederhana, katakanlah Anda memiliki halaman dengan nama pengguna pengguna yang masuk di bagian atas halaman. Setiap kali halaman dimuat, kueri basis data dijalankan untuk menentukan nama pengguna apa yang dimiliki oleh pengguna yang masuk yang meminta halaman yang memastikan bahwa nama yang tepat ditampilkan. Jika Anda melakukan cache halaman ini, maka permintaan basis data tidak akan terjadi dan semua pengguna akan melihat nama pengguna yang sama di bagian atas halaman dan kemungkinan itu bukan nama pengguna mereka. Anda memerlukan kueri untuk terjadi pada setiap pemuatan halaman untuk memastikan bahwa nama pengguna yang tepat ditampilkan untuk setiap pengguna. Karena itu tidak dapat di-cache.

Perluas logika itu ke sesuatu yang sedikit lebih bermasalah seperti izin pengguna dan Anda dapat melihat mengapa konten dinamis tidak perlu di-cache. Jika database tidak mengenai konten dinamis, CMS tidak memiliki cara untuk menentukan apakah pengguna yang meminta halaman memiliki izin untuk melihat halaman itu.

Konten statis, menurut definisi, sama untuk semua pengguna. Oleh karena itu, tidak ada permintaan basis data yang perlu dilakukan untuk mengkustomisasi halaman tersebut untuk setiap pengguna sehingga masuk akal untuk melakukan cache untuk menghilangkan permintaan basis data yang tidak perlu. Gambar adalah contoh konten statis yang sangat bagus - Anda ingin semua pengguna melihat gambar header yang sama, tombol login yang sama, dll, sehingga mereka adalah kandidat yang sangat baik untuk melakukan caching.

Dalam cuplikan kode Anda di atas, Anda melihat cuplikan VCL yang sangat khas yang memaksa gambar, css, dan javascript di-cache. Secara default, Varnish tidak akan men-cache permintaan apa pun dengan cookie di dalamnya. Logikanya adalah bahwa jika ada cookie dalam permintaan, maka harus ada beberapa alasan server membutuhkan cookie sehingga diperlukan di bagian belakang dan harus melewati cache. Pada kenyataannya, banyak CMS (Drupal, Wordpress, dll) melampirkan cookie ke hampir semua hal, baik itu diperlukan atau tidak sehingga sangat umum untuk menulis VCL untuk menghapus cookie dari konten yang dikenal sebagai statis yang pada gilirannya menyebabkan Varnish melakukan cache Itu.

Masuk akal?

jdw
sumber
Terima kasih atas jawabannya, tetapi saya masih tidak yakin. Saya mengetahui fakta bahwa konten dinamis berubah di beberapa situs web, tetapi pada situs lain, seperti milik saya, tidak sering berubah. Saya hanya menggunakan CMS untuk membuat hidup lebih sederhana. Jadi halaman dinamis saya dapat di-cache selama seminggu. Penting, mari kita lupakan dinamis, saya tidak mengerti mengapa men-cache konten statis jika Anda memiliki nginx sebagai backend. Jika saya benar nginx dan pernis sama cepat dalam konten statis, atau apakah saya salah. Pencarian statis dapat ditangani secepat dengan nginx seperti dengan pernis. Saya sedikit memperbarui pertanyaan.
Saif Bechan
2

Untuk konten dinamis , beberapa jenis seperti harga saham sebenarnya sering berubah (diperbarui setiap detik pada SaaS serverdari dari backend server) tetapi mungkin lebih sering ditanyakan (oleh puluhan ribu subscription clients):

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

Dalam hal ini, caching pada SaaS serverpembaruan per-detik dari backend serversmemungkinkan untuk memenuhi permintaan puluhan ribu subscription users.

Tanpa cache pada server SaaS maka model ini tidak akan berfungsi.

Eli
sumber
1

Caching file statis dengan Varnish akan mendapat manfaat dalam hal membongkar Nginx. Tentu saja, jika Anda memiliki banyak file statis untuk di-cache, itu akan membuang-buang RAM. Namun, Varnish memiliki fitur yang bagus - mendukung banyak penyimpanan backend untuk cache-nya.

Untuk file statis: cache ke HDD Untuk yang lainnya: cache ke RAM.

Ini akan memberi Anda lebih banyak wawasan tentang bagaimana menerapkan skenario ini: http://www.getpagespeed.com/server-setup/varnish-static-files-cache

Danila Vershinin
sumber
Hanya ingin tahu mengapa Anda bisa meletakkan file statis pada cache HDD - bukankah itu pada dasarnya hal yang sama dengan hanya melayani mereka dari disk tanpa cache?
Shane N
Pada dasarnya, ya :) Tetapi jika ada Varnish di tempat, ia harus menghubungi backend (Nginx, Apache, apa pun) untuk mengambilnya. Tidak dapat melakukannya langsung dari sistem file. Untuk menghilangkan overhead komunikasi backend, mereka harus di-cache, meskipun juga ke disk.
Danila Vershinin
Ah ok, itu masuk akal - terima kasih @ danila-v
Shane N