varnish---反向 Proxyweb加速快取服務器和CDN的推送

來源:互聯網
上載者:User

標籤:varnish   cdn   網頁緩衝   squid   傳統   

Varnish 簡介

Varnish 是一款高效能且開源的反向 Proxy伺服器和 HTTP 加速器,其採用全新的軟體體系機構,和現在的硬體體繫緊密配合,與傳統的 squid 相比,varnish 具有效能更高、速度更快、管理更加方便等諸多優點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。

挪威的最大的線上報紙 Verdens Gang(vg.no) 使用 3 台 Varnish 代替了原來的 12 台 Squid,效能比以前更好,這是 Varnish 最成功的應用案例。


Varnish 檔案快取的工作流程

Varnish 與一般伺服器軟體類似,分為 master 進程和 child 進程。Master 進程讀入儲存設定檔,調用合適的儲存類型,然後建立 / 讀入相應大小的快取檔案,接著 master 初始化管理該儲存空間的結構體,然後 fork 並監控 child 進程。Child 進程在主線程的初始化的過程中,將前面開啟的隱藏檔整個 mmap 到記憶體中,此時建立並初始化空閑結構體,掛到儲存管理結構體,以待分配。Child 進程分配若干線程進行工作,主要包括一些管理線程和很多 worker 線程。

接著,開始真正的工作,varnish 的某個負責接收新 HTTP 連接線程開始等待使用者,如果有新的 HTTP 串連過來,它總負責接收,然後喚醒某個等待中的線程,並把具體的處理過程交給它。Worker 線程讀入 HTTP 要求的 URI,尋找已有的 object,如果命中則直接返回並回複使用者。如果沒有命中,則需要將所請求的內容,從後端伺服器中取過來,存到緩衝中,然後再回複。

分配緩衝的過程是這樣的:它根據所讀到 object 的大小,建立相應大小的快取檔案。為了讀寫方便,程式會把每個 object 的大小變為最接近其大小的記憶體頁面倍數。然後從現有的空閑儲存結構體中尋找,找到最合適的大小的空閑儲存塊,分配給它。如果空閑塊沒有用完,就把多餘的記憶體另外組成一個空閑儲存塊,掛到管理結構體上。如果緩衝已滿,就根據 LRU 機制,把最舊的 object 釋放掉。

釋放緩衝的過程是這樣的:有一個逾時線程,檢測緩衝中所有 object 的生存期,如果超初設定的 TTL(Time To Live)沒有被訪問,就刪除之,並且釋放相應的結構體及儲存記憶體。注意釋放時會檢查該儲存記憶體塊前面或後面的空閑記憶體塊,如果前面或後面的空閑記憶體和該釋放記憶體是連續的,就將它們合并成更大一塊記憶體。

整個檔案快取的管理,沒有考慮檔案與記憶體的關係,實際上是將所有的 object 都考慮是在記憶體中,如果系統記憶體不足,系統會自動將其換到 swap 空間,而不需要 varnish 程式去控制。


server11:


rpm -ivh varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm

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.4.12";
14   .port = "80";
15 }
16
17 sub vcl_recv {
18 if (req.http.host ~ "^(www.)?westos.org") {
19 set req.http.host = "www.westos.org";
20 set req.backend = default;
21 } elsif (req.http.host ~ "^bbs.westos.org") {
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

[[email protected] ~]# netstat -antlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1167/varnishd

server12

/etc/init.d/httpd start

cat index.html

server13通過 varnishadm 手動清除緩衝
varnishadm ban.url .*$          #清除所有
varnishadm ban.url /index.html  #清除 index.html 頁面緩衝
varnishadm ban.url /admin/$    #清除 admin 目錄緩衝

第一次錯過(miss)緩衝

650) this.width=650;" src="https://s1.51cto.com/wyfs02/M01/8F/A8/wKioL1jnqc7CurrkAACWQkKYq_M177.png" title="Screenshot from 2017-04-07 21-49-09.png" style="float:none;" alt="wKioL1jnqc7CurrkAACWQkKYq_M177.png" />


第一次命中(hit)緩衝

650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8F/A9/wKiom1jnqc_B14MRAACUt05cews140.png" title="Screenshot from 2017-04-07 21-49-16.png" style="float:none;" alt="wKiom1jnqc_B14MRAACUt05cews140.png" />


varnish虛擬機器主機和輪尋


server12:

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>
server11:

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 }

650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8F/A8/wKioL1jnqc_AilidAAAi7ssx1Qs222.png" title="Screenshot from 2017-04-07 21-56-45.png" style="float:none;" alt="wKioL1jnqc_AilidAAAi7ssx1Qs222.png" />


650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/8F/A9/wKiom1jnqdDB2nHfAAATS0KhM0M428.png" title="Screenshot from 2017-04-07 21-56-50.png" style="float:none;" alt="wKiom1jnqdDB2nHfAAATS0KhM0M428.png" />


650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/8F/A8/wKioL1jnqdCwgBWSAAAUF7l8l4o626.png" title="Screenshot from 2017-04-07 21-56-57.png" style="float:none;" alt="wKioL1jnqdCwgBWSAAAUF7l8l4o626.png" />


650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8F/A9/wKiom1jnqdCDxJO1AAAW-nqRZnY988.png" title="Screenshot from 2017-04-07 22-18-22.png" style="white-space:normal;float:none;" alt="wKiom1jnqdCDxJO1AAAW-nqRZnY988.png" />650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/8F/A9/wKiom1jnqdCS-MWnAABOIIJUpwM091.png" title="Screenshot from 2017-04-07 22-15-10.png" style="float:none;" alt="wKiom1jnqdCS-MWnAABOIIJUpwM091.png" />


CDN推送


當varnish緩衝的頁面有更新,需要重新的頁面的時候,只需要web開發人員,提交更改的網址,這就是我們的CDN推送

[[email protected] html]# unzip bansys.zip 
[[email protected] html]# cd bansys
[[email protected] 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";

?>




650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8F/A8/wKioL1jnqdGjJkuDAABZiQqIEPQ185.png" style="float:none;" title="Screenshot from 2017-04-07 22-50-04.png" alt="wKioL1jnqdGjJkuDAABZiQqIEPQ185.png" />


650) this.width=650;" src="https://s4.51cto.com/wyfs02/M02/8F/A8/wKioL1jnqdGwfKA0AABQCcuqCCM964.png" style="float:none;" title="Screenshot from 2017-04-07 22-50-10.png" alt="wKioL1jnqdGwfKA0AABQCcuqCCM964.png" />


本文出自 “12049878” 部落格,謝絕轉載!

varnish---反向 Proxyweb加速快取服務器和CDN的推送

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.