Rumah Perangkat lunak Varnish: bersiaplah untuk menjadi slashdotted!

Varnish: bersiaplah untuk menjadi slashdotted!

Daftar Isi:

Anonim

Ketika datang ke kinerja situs web, Varnish adalah teknologi panas. Dengan instalasi dan konfigurasi yang sederhana, dimungkinkan untuk meningkatkan kinerja situs web apa pun dan melayani hingga sejuta halaman dengan hanya server pribadi virtual kecil., Saya akan menunjukkan kepada Anda empat kemungkinan konfigurasi yang akan membantu Anda meningkatkan waktu respons situs Anda, apakah Anda melayani ratusan, ribuan atau jutaan halaman.

Pengantar Varnish

Varnish-Cache adalah akselerator Web dengan tujuan caching konten situs web. Ini adalah proyek open-source yang bertujuan untuk mengoptimalkan dan mempercepat akses ke situs web non-invasif - tanpa mengubah kode - dan memungkinkan Anda memasukkan tangan ke situs web Anda.


Itu adalah pencipta Varnish Cache yang menyebutnya akselerator Web, karena tujuan utamanya adalah untuk meningkatkan dan mempercepat ujung depan situs web. Varnish mencapai ini dengan menyimpan salinan halaman yang dilayani oleh server Web dalam cache-nya. Kali berikutnya halaman yang sama diminta, Varnish akan melayani salinan alih-alih meminta halaman dari server Web, menghasilkan peningkatan kinerja yang luar biasa.


Fitur utama lain dari Varnish Cache, selain kinerjanya, adalah fleksibilitas bahasa konfigurasinya, VCL. VCL memungkinkan untuk menulis kebijakan tentang bagaimana permintaan yang masuk harus ditangani. Dalam kebijakan seperti itu, Anda dapat memutuskan konten apa yang ingin Anda sajikan, dari mana Anda ingin mendapatkan konten dan bagaimana permintaan atau responsnya harus diubah.


Dalam contoh konfigurasi berikut, saya akan menunjukkan kepada Anda aturan VCL mana yang akan digunakan untuk mencapai beberapa tujuan, dari caching gambar dan objek statis yang sederhana, hingga menggunakan Varnish dalam lingkungan terdistribusi atau menjadikannya bertindak sebagai penyeimbang beban.


Semua contoh berikut adalah untuk Varnish 3.x. Harap perhatikan bahwa Varnish 2.x menggunakan sintaks dan aturan yang berbeda, jadi contoh-contoh ini tidak kompatibel dengan versi itu.


Berikut ini adalah status utama Varnish, yang akan kami gunakan dalam file konfigurasi VCL:


recv

Ini adalah fungsi pertama yang dipanggil saat menerima permintaan. Di sini kita dapat memanipulasi permintaan sebelum memeriksa apakah ada dalam cache. Jika permintaan tidak dapat dimasukkan ke dalam cache, server back-end yang permintaannya akan dikirim juga dapat dipilih pada fase ini.


lulus

Kita dapat menggunakan fungsi ini ketika kita ingin mengirimkan permintaan ke server Web dan menyimpan jawabannya.


pipa

Fungsi ini mem-bypass Varnish dan mengirimkan permintaan ke server Web.


mencari

Dengan pencarian, Varnish meminta untuk memverifikasi apakah respons ada dan valid dalam cache.


mengambil

Fungsi ini dipanggil setelah pemulihan konten dari bagian belakang dipanggil oleh pass atau miss.

Dasar-Dasar: Tembolok Gambar

Jadi mari kita lihat contoh konfigurasi. Pada contoh pertama ini, kita hanya akan men-cache gambar dan file statis seperti file CSS. Konfigurasi ini sangat berguna ketika Anda tidak tahu situs web yang ingin Anda tingkatkan, jadi Anda bisa memutuskan bahwa semua gambar, CSS, dan JavaScript adalah sama untuk semua pengguna. Untuk membedakan pengguna, protokol HTTP menggunakan cookie, jadi kami harus menghilangkannya dalam jenis permintaan ini sehingga semuanya sama untuk Varnish:

sub vcl_recv{


if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{

unset req.http.cookie;


unset req.http.Vary;

return(lookup);

}


# strip the cookie before the image is inserted into cache.

sub vcl_fetch {

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {

unset beresp.http.set-cookie;

}

Dan itu saja. Dengan file VCL ini Anda dapat dengan mudah menyimpan konten statis.

Standar: Tembolok Gambar dan Halaman

Biasanya, Anda tidak hanya ingin me-cache konten statis situs web Anda tetapi Anda juga ingin men-cache beberapa halaman dinamis yang dihasilkan oleh server Web Anda, tetapi itu sama untuk semua pengguna - atau setidaknya untuk semua anonim Anda pengguna. Pada fase ini, Anda harus tahu memilih halaman mana yang bisa di-cache dan mana yang tidak.


Contoh yang baik adalah Wordpress, salah satu sistem manajemen konten yang paling umum digunakan. Wordpress menghasilkan halaman situs web secara dinamis dengan PHP dan permintaan ke database MySQL. Ini bagus karena Anda dapat dengan mudah memperbarui situs web Anda dari antarmuka administrasi dengan beberapa klik, tetapi juga mahal dalam hal sumber daya yang digunakan. Mengapa menjalankan skrip PHP dan permintaan MySQL yang sama setiap kali pengguna mendarat di beranda? Kita dapat menggunakan Varnish untuk menembolok halaman yang paling banyak dikunjungi dan mencapai hasil yang luar biasa.


Ini adalah beberapa aturan yang dapat berguna dalam instalasi Wordpress:

sub vcl_recv{

# Let's make sure we aren't compressing already compressed formats.

if (req.http.Accept-Encoding) {

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {

remove req.http.Accept-Encoding;

} elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

} elsif (req.http.Accept-Encoding ~ "deflate") {

set req.http.Accept-Encoding = "deflate";

} else {

remove req.http.Accept-Encoding;

}

}


if (req.url ~ "^/$") {

unset req.http.cookie;

}


# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


}


sub vcl_miss {

if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

}

if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {

unset req.http.cookie;

set req.url = regsub(req.url, "\?.$", "");

}

if (req.url ~ "^/$") {

unset req.http.cookie;

}

}

sub vcl_fetch {

if (req.url ~ "^/$") {

unset beresp.http.set-cookie;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail

if (!(req.url ~ "wp-(login| admin )")) {

unset beresp.http.set-cookie;

}

}

Anda dapat melihat bahwa dalam contoh ini, kami menyimpan semua halaman dari situs web kami, tetapi untuk halaman yang memiliki "wp- admin" atau "wp-login" di url, stringnya adalah "khusus" lokasi yang digunakan untuk masuk ke Wordpress sebagai administrator. Karena itu, kami ingin berbicara langsung ke server Web dan memotong cache Varnish.


Biasanya, jika Anda menggunakan Drupal, Joomla, atau situs web yang dibuat khusus, Anda harus mengubah aturan ini, tetapi tujuannya selalu sama: Untuk mengirim semua halaman dan cache dinamis yang Anda bisa ke ujung belakang.

Standar ++: Tingkatkan Ketahanan Server

Kadang-kadang server Web menjadi lambat karena mereka memiliki beban tinggi. Pernis juga bisa membantu. Kita dapat menggunakan beberapa arahan khusus untuk memberi tahu Varnish agar tidak berbicara dengan ujung belakang jika turun atau menjawab terlalu lambat. Untuk kasus-kasus ini Varnish menggunakan arahan "rahmat".


Rahmat dalam lingkup Varnish berarti memberikan benda yang kedaluwarsa saat keadaan membutuhkannya. Ini dapat terjadi karena:

  • Direktur back-end yang dipilih tidak aktif
  • Sebuah utas berbeda telah mengajukan permintaan ke bagian belakang yang belum selesai.
Kedua kasus ditangani sama dalam VCL:

sub vcl_recv {

if (req.backend.healthy) {

set req.grace = 30s;

} else {

set req.grace = 1h;

}

}


sub vcl_fetch {

set beresp.grace = 1h;

}

Konfigurasi ini memberi tahu Varnish untuk menguji bagian belakang dan menaikkan masa tenggang jika memiliki beberapa masalah. Contoh di atas juga memperkenalkan arahan "req.backend.healthy", yang digunakan untuk memeriksa ujung belakang. Ini sangat berguna ketika Anda memiliki beberapa ujung belakang, jadi mari kita lihat contoh yang lebih maju.

Penggunaan Lanjut: Membuat Server Web Tangguh di Lingkungan Terdistribusi

Ini adalah file konfigurasi terakhir kami dengan semua opsi yang telah kami lihat sejauh ini dan definisi dua ujung belakang dengan beberapa arahan khusus untuk probe. Beginilah cara Varnish menentukan apakah server Web masih hidup atau tidak.


.url

Varnish akan membuat permintaan ke bagian belakang dengan URL ini.


.waktu habis

Menentukan seberapa cepat probe harus selesai. Anda harus menentukan satuan waktu dengan angka, seperti "0, 1 s", "1230 ms" atau bahkan "1 h".


.selang

Berapa lama menunggu di antara polling. Anda harus menentukan satuan waktu di sini juga. Perhatikan bahwa ini bukan "tingkat" tetapi "interval". Tingkat jajak pendapat terendah adalah (. Timeout + .interval).


.jendela

Berapa banyak jajak pendapat terbaru yang perlu dipertimbangkan ketika menentukan apakah ujung belakang itu sehat.


.ambang

Berapa banyak jajak pendapat terakhir .window terakhir harus baik untuk bagian belakang dinyatakan sehat.


Sekarang kita dapat menggunakan arahan "req.backend.healthy" dan mendapatkan hasil Boolean yang memberi tahu kita apakah ujung belakang masih hidup atau tidak.

#

# Customized VCL file for serving up a Wordpress site with multiple back-ends.

#


# Define the internal network subnet.

# These are used below to allow internal access to certain files while not

# allowing access from the public internet .

acl internal {

"10.100.0.0"/24;

}


# Define the list of our backends (web servers), they Listen on port 8080


backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}

backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}


# Define the director that determines how to distribute incoming requests.

director default_director round-robin {

{ .backend = web1; }

{ .backend = web2; }

}


# Respond to incoming requests.

sub vcl_recv {


set req.backend = default_director;

# Use anonymous, cached pages if all backends are down.

if (!req.backend.healthy) {

unset req.http.Cookie;

set req.grace = 6h;

} else {

set req.grace = 30s;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


# Always cache the following file types for all users.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

unset req.http.Cookie;

}


}


# Code determining what to do when serving items from the web servers.

sub vcl_fetch {

# Don't allow static files to set cookies.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

# beresp == Back-end response from the web server.

unset beresp.http.set-cookie;

}


# Allow items to be stale if needed.

set beresp.grace = 6h;

}

Alat yang Kuat

Ini hanya beberapa contoh yang dapat membantu Anda memulai menggunakan Varnish. Alat ini sangat kuat dan dapat membantu Anda mencapai peningkatan kinerja yang hebat tanpa membeli lebih banyak perangkat keras atau mesin virtual. Bagi banyak administrator situs web, itu manfaat nyata.

Varnish: bersiaplah untuk menjadi slashdotted!