Varnish 是一款高性能且開源的反向代理服務器和 HTTP 加速器,其採用全新的軟件體系機構,和如今的硬件體系緊密配合,與傳統的 squid 相比,varnish 具備性能更高、速度更快、管理更加方便等諸多優勢,不少大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。php
挪威的最大的在線報紙 Verdens Gang(vg.no) 使用 3 臺 Varnish 代替了原來的 12 臺 Squid,性能比之前更好,這是 Varnish 最成功的應用案例。html
Varnish 與通常服務器軟件相似,分爲 master 進程和 child 進程。Master 進程讀入存儲配置文件,調用合適的存儲類型,而後建立 / 讀入相應大小的緩存文件,接着 master 初始化管理該存儲空間的結構體,而後 fork 並監控 child 進程。Child 進程在主線程的初始化的過程當中,將前面打開的存儲文件整個 mmap 到內存中,此時建立並初始化空閒結構體,掛到存儲管理結構體,以待分配。Child 進程分配若干線程進行工做,主要包括一些管理線程和不少 worker 線程。web
接着,開始真正的工做,varnish 的某個負責接收新 HTTP 鏈接線程開始等待用戶,若是有新的 HTTP 鏈接過來,它總負責接收,而後喚醒某個等待中的線程,並把具體的處理過程交給它。Worker 線程讀入 HTTP 請求的 URI,查找已有的 object,若是命中則直接返回並回複用戶。若是沒有命中,則須要將所請求的內容,從後端服務器中取過來,存到緩存中,而後再回復。vim
分配緩存的過程是這樣的:它根據所讀到 object 的大小,建立相應大小的緩存文件。爲了讀寫方便,程序會把每一個 object 的大小變爲最接近其大小的內存頁面倍數。而後從現有的空閒存儲結構體中查找,找到最合適的大小的空閒存儲塊,分配給它。若是空閒塊沒有用完,就把多餘的內存另外組成一個空閒存儲塊,掛到管理結構體上。若是緩存已滿,就根據 LRU 機制,把最舊的 object 釋放掉。後端
釋放緩存的過程是這樣的:有一個超時線程,檢測緩存中全部 object 的生存期,若是超初設定的 TTL(Time To Live)沒有被訪問,就刪除之,而且釋放相應的結構體及存儲內存。注意釋放時會檢查該存儲內存塊前面或後面的空閒內存塊,若是前面或後面的空閒內存和該釋放內存是連續的,就將它們合併成更大一塊內存。緩存
整個文件緩存的管理,沒有考慮文件與內存的關係,其實是將全部的 object 都考慮是在內存中,若是系統內存不足,系統會自動將其換到 swap 空間,而不須要 varnish 程序去控制。服務器
server11:tcp
rpm -ivh varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpmide
vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80性能
vim /etc/varnish/default.vcl
7 backend default {
8 .host = "172.25.88.13";
9 .port = "80";
10 }
11
12 backend web {
13 .host = "172.25.88.12";
14 .port = "80";
15 }
16
17 sub vcl_recv {
18 if (req.http.host ~ "^(www.)?westos.org") { #若是用戶訪問:westos.org,會自動補全www
19 set req.http.host = "www.westos.org";
20 set req.backend = default;
21 } elsif (req.http.host ~ "^bbs.westos.org") { #若是訪問:bbs.westos.org,就去訪問web
22 set req.backend = web;
23 } else
{error 404 "westos cache"; 除了訪問這些域名,其餘就GG了
24 }
25 }
#測試緩存命中
27 sub vcl_deliver {
28 if (obj.hits > 0) {
29 set resp.http.X-Cache = "HIT from westos cache"; 命中緩存
30 }
31 else {
32 set resp.http.X-Cache = "MISS from westos cache";
33 }
34 return (deliver);
35 }
/etc/init.d/varnish start
[root@server11 ~]# netstat -antlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1167/varnishd
/etc/init.d/httpd start
cat index.html
varnishadm ban.url .*$ #清除全部
varnishadm ban.url /index.html #清除 index.html 頁面緩存
varnishadm ban.url /admin/$ #清除 admin 目錄緩存
varnish虛擬主機和輪尋
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
1012 <VirtualHost *:80>
1013 DocumentRoot /var/www/html
1014 ServerName server12.lalala.com
1015 </VirtualHost>
1016
1017 <VirtualHost *:80>
1018 DocumentRoot /www1
1019 ServerName www.westos.org
1020 </VirtualHost>
1021
1022 <VirtualHost *:80>
1023 DocumentRoot /www2
1024 ServerName bbs.westos.org
1025 </VirtualHost>
vim /etc/varnish/default.vcl
7 backend default {
8 .host = "172.25.88.13";
9 .port = "80";
10 }
11
12 backend web {
13 .host = "172.25.88.12";
14 .port = "80";
15 }
16
17 director lb round-robin {
18 {.backend = default;}
19 {.backend = web;}
20 }
21
22 sub vcl_recv {
23 if (req.http.host ~ "^(www.)?westos.org") {
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass); #爲了測試方便,不進行緩存。
27 } elsif (req.http.host ~ "^bbs.westos.org") {
28 set req.backend = web;
29 } else {error 404 "westos cache";
30 }
31 }
32
33 sub vcl_deliver {
34 if (obj.hits > 0) {
35 set resp.http.X-Cache = "HIT from westos cache";
36 }
37 else {
38 set resp.http.X-Cache = "MISS from westos cache";
39 }
40 return (deliver);
41 }
當varnish緩存的頁面有更新,須要從新的頁面的時候,只須要web開發人員,提交更改的網址,這就是咱們的CDN推送
[root@server11 html]# unzip bansys.zip
[root@server11 html]# cd bansys
[root@server11 bansys]# mv * ..
bansys 有兩種工做模式,分別是:telnet 和 http 模式。
telnet 模式須要關閉 varnish 服務管理端口的驗證,註釋掉/etc/sysconfig/varnish 文件中的 「 -S $
{VARNISH_SECRET_FILE}」這行,重啓 varnish 服務便可。
若是是 http 模式須要對 varnish 作如下設置:
vim /etc/varnish/default.vcl
8 acl westos {
9 "127.0.0.1";
10 "172.25.88.0"/24;
11 }
12
13 sub vcl_recv {
14 if (req.request == "BAN") {
15 if (!client.ip ~ westos) {
16 error 405 "Not allowed.";
17 }
18 ban("req.url ~ " + req.url);
19 error 200 "ban added";
20 }
21 }
vim config.php #只保留以下設置,其他註釋掉
<?php
//varnish主機列表
$var_group1 = array(
'host' => array('172.25.88.11'),
'port' => '80',
);
//varnish羣組定義
//對主機列表進行綁定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不同
$VAR_VERSION = "3";
?>