天天看點

搭建cdn的高性能HTTP加速器Varnish伺服器

CND的簡單了解:

    内容分發網絡(CDN)是一種新型網絡建構方式,它是為能在傳統的IP網釋出寬帶豐富媒體而特别優化的網絡覆寫層;而從廣義的角度,CDN代表了一種基于品質與秩序的網絡服務模式。

        CDN是建構在網絡之上的内容分發網絡,依靠部署在各地的邊緣伺服器,通過中心平台的負載均衡、内容分發、排程等功能子產品,使使用者就近擷取所需内容,降低網絡擁塞,提高使用者通路響應速度和命中率。CDN的關鍵技術主要有内容存儲和分發技術。

        CDN的基本原理是廣泛采用各種緩存伺服器,将這些緩存伺服器分布到使用者通路相對集中的地區或網絡中,在使用者通路網站時,利用全局負載技術将使用者的通路指向距離最近的工作正常的緩存伺服器上,由緩存伺服器直接響應使用者請求。

        總的來說,内容服務基于緩存伺服器,也稱作代理緩存(Surrogate),它位于網絡的邊緣,距使用者僅有"一跳"(Single Hop)之遙。同時,代理緩存是内容提供商源伺服器(通常位于CDN服務提供商的資料中心)的一個透明鏡像。這樣的架構使得CDN服務提供商能夠代表他們客戶,即内容供應商,向最終使用者提供盡可能好的體驗,而這些使用者是不能容忍請求響應時間有任何延遲的。

varnishi的基本介紹:

搭建cdn的高性能HTTP加速器Varnish伺服器
搭建cdn的高性能HTTP加速器Varnish伺服器

處理過程大緻分為如下幾個步驟:

(1)Receive 狀态,也就是請求處理的入口狀态,根據 VCL 規則判斷該請求應該是 Pass 或

Pipe,或者進入 Lookup(本地查詢)。

(2)Lookup 狀态,進入此狀态後,會在 hash 表中查找資料,若找到,則進入 Hit 狀态,否則進

入 miss 狀态。

(3)Pass 狀态,在此狀态下,會進入後端請求,即進入 fetch 狀态。

(4)Fetch 狀态,在 Fetch 狀态下,對請求進行後端的擷取,發送請求,獲得資料,并進行本地

的存儲。

(5)Deliver 狀态, 将擷取到的資料發送給用戶端,然後完成本次請求。

實驗環境:三台redhat6.5主機

pt1.example.com:172.25.13.1

pt2.example.com:172.25.13.2

pt3.example.com:172.25.13.3

在這裡pt1.example.com作為varnish伺服器進行緩存

pt2.example.com和pt3.example.com作為apache服務端

一、cdn高速緩存器varnish伺服器的搭建以及配置

在pt1.example.com上面進行如下操作:

1、下載下傳及安裝

Download 安裝包varnish-3.0.5-1.el6.x86_64.rpm、varnish-libs-3.0.5-1.el6.x86_64.rpm

安裝varnish軟體包;

[root@pt1 ~]#yum install -yvarnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
編輯/etc/sysconfig/varnish檔案,主要是為了改變測試端口,其他參數根據需要改動
[root@pt1 ~]#vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80            #改變varnish服務端口
VARNISH_TTL=60              #緩存時間為60s      

2、修改配置檔案

編輯/etc/varnish/default.vcl檔案

[root@pt1 ~]#vim /etc/varnish/default.vcl
backend default {
 .host = "172.25.13.2";              #主機位址
 .port = "80";                    #服務端口
}

##檢視緩存命中情況
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT fromwestos cache";
}
else {
set resp.http.X-Cache = "MISS fromwestos cache";
}
return (deliver);
}      

此時通路172.25.13.1即可看到預設進入的是pt2.example.com的預設釋出頁面

設定的緩存時間為60s,在第一次通路後,則一直傳回的資訊是HIT from westoscache

當60s時間過去後,緩存清空,再次是MISS from westos cache資訊。

3、手動清除緩存資訊,通過varnishadm 手動清除緩存

# varnishadm ban.url .*$                     #清除所有
# varnishadm ban.url /index.html         #清除 index.html 頁面緩存
# varnishadm ban.url /admin/$             #清除 admin 目錄緩存      

4、定義多個後端伺服器(基于不同域名進行通路)

[root@pt1 ~]#vim /etc/sysconfig/varnish
backend default {
 .host = "172.25.13.2";              #主機位址
 .port = "80";                    #服務端口
}
backend web2 {
 .host = "172.25.13.3";
 .port = "80";
}
 
sub vcl_recv {
       if (req.http.host ~ "^(www.)?pt.com") {                    #比對請求的域名是否為wwwNaN.com
                set req.http.host ="wwwNaN.com";
                set req.backend = default;                   
       }
       elsif (req.http.host ~ "^wwwNaN.org") {               #比對請求的域名是否為wwwNaN.org
                set req.backend = web2;
       }
       else {error 404 "westos cache";
       }
}

[root@pt1 ~]# /etc/init.d/varnish reload      

5、健康檢查以及負載均衡

#健康檢查以及負載均衡
probe healthcheck {
 .url = "/index.html";         #那個url需要varnish請求
 .interval = 5s;                   #檢查間隔為5s
 .timeout = 1s;                   #等待多長時間探針逾時,這裡為1s
 .window = 5;                           #檢測(維持)5個windows的結果
  .threshold= 3;                  #當windows其中3個成功,就宣布健康
}
backend default {
 .host = "172.25.13.2";
 .port = "80";
 .probe = healthcheck;               #調用健康檢查
}
backend web2 {
 .host = "172.25.13.3";
 .port = "80";
 .probe = healthcheck;
}
director lb round-robin {
       { .backend = default;}
       { .backend = web2;}
}
sub vcl_recv {
       if (req.http.host ~ "^(www.)?pt.com") {
                set req.http.host ="wwwNaN.com";
                set req.backend = lb;
                return(pass);                 #此處為了測試,不進行緩存
       }
       elsif (req.http.host ~ "^wwwNaN.org") {
                set req.backend = web2;
       }
       else {error 404 "westos cache";
       }
}

[root@pt1 ~]#/etc/init.d/varnish reload      

在pt3.example.com上面進行虛拟主機的配置:

[root@pt3 ~]#vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
   DocumentRoot /www1
   Serveralias pt.com
   ServerName wwwNaN.com
</VirtualHost>
<VirtualHost *:80>
   DocumentRoot /www2
   ServerName wwwNaN.org
</VirtualHost>      

6、測試發現,通路wwwNaN.com和pt.com在兩個伺服器上進行輪詢

搭建cdn的高性能HTTP加速器Varnish伺服器
搭建cdn的高性能HTTP加速器Varnish伺服器

通路wwwNaN.org則值通路pt3.example.om這個伺服器;

搭建cdn的高性能HTTP加速器Varnish伺服器

二、CDN推送平台的搭建:

修改httpd服務的監聽端口為:8080  (PS:80端口已經被varnish占用)

unzip bansys.zip -d /var/www/html/
mv  /var/www/html/bansys/*/var/www/html/
編輯config.php配置檔案:
vim config.php
$var_group1 = array(
                        'host' =>array('172.25.13.2'),
                                               'port' => '6082',               
                    );
 //varnish群組定義
 //對主機清單進行綁定
 $VAR_CLUSTER = array(
                         'wwwNaN.com' =>$var_group1,
                     );
 
 //varnish版本
 //2.x和3.x推送指令不一樣
 $VAR_VERSION = "3";
?>
 
service httpd restart      

修改varnish配置檔案如下:

bansys 有兩種工作模式,分别是:telnet 和 http 模式。

#telnet模式需要關閉varnish服務管理端口的驗證,注釋掉/etc/sysconfig/varnish檔案中的

“-S ${VARNISH_SECRET_FILE}”這行,重新開機 varnish 服務即可。

#如果是 http 模式需要對 varnish 做以下設定:

# vim /etc/varnish/default.vcl
acl pt {                         #設定通路控制
"127.0.0.1";
"172.25.13.0"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ pt) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
service varnish restart      

通路172.25.13.1:8080界面如下: