CDN的全稱是Content Delivery Network,即内容分發網絡。其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使内容傳輸的更快、更穩定。通過在網絡各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智能虛拟網絡,CDN系統能夠實時地根據網絡流量和各節點的連接配接、負載狀況以及到使用者的距離和響應時間等綜合資訊将使用者的請求重新導向離使用者最近的服務節點上。其目的是使使用者可就近取得所需内容,解決 Internet網絡擁擠的狀況,提高使用者通路網站的響應速度。
市面上有很多CDN供應商,比較著名有Akamai (全球最大),chinacache,webluker,cloudflare,chinacache,如果需要自己搭建CDN系統,有3種主流方案可以選擇squid,varnish,Nginx+memcache
在目前主流的Web架構中,Cache擔任着越來越重要的作用。常見的基于浏覽器的C/S架構,Web Cache更是節約伺服器資源的關鍵。而最近幾年由FreeBSD創始人之一Kamp開發的varnish更是一個不可多得的Web Cache Server。嚴格意義上說,Varnish是一個高性能的反向代理軟體,隻不過與其出色的緩存功能相比,企業更願意使用其搭建緩存伺服器。同時,由于其工作在Web Server的前端,有一部分企業已經在生産環境中使用其作為舊版本的squid的替代方案,以在相同的伺服器成本下提供更好的緩存效果,Varnish更是作為CDN緩存伺服器的可選服務之一。
一.部署單個後端伺服器的varnish過程
1.在官網下載下傳varnish-libs-3.0.5-1.el6.x86_64.rpm和varnish-3.0.5-1.el6.x86_64.rpm
yum install varnish-3.0.5-1.el6.x86_64.rpm
yum install varnish-libs-3.0.5-1.el6.x86_64.rpm
2.編輯varnish檔案
vim /etc/sysconfig/varnish
将66行改為:VARNISH_LISTEN_PORT=80
# 以下不用修改,隻是檢視
第8行 NFILES=131072 # 最多能打開的檔案數,varnish會自動調整該值
第12行 MEMLOCK=82000 # 最多能使用的記憶體空間,varnish會自動調整該值
第15行 NPROCS="unlimited" # 單個使用者所能運作的最大線程數

3.修改varnish使用者的限制檔案
因為varnish這個程式運作在varnish這個使用者的私有空間内,核心對普通使用者限制的最大檔案數為1024.對varnish使用者限制的最大檔案數為131072,我們需要滿足131072這個最大值。
vim /etc/security/limits.conf
varnish - nofile 131073 # 滿足最多能打開的檔案數
varnish - memlock 82000
varnish - nproc unlimited
# 将後邊的數字和上邊檔案中對應項改為相等
4.打開varnish服務
/etc/init.d/varnish start
5.在varnish預設檔案中寫上後端伺服器的IP及端口
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.70.2"; # 後端伺服器的ip
.port = "80"; # 後端伺服器的端口
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from taylor cache";
# 在varnish中命中HIT通路的域名
}
else {
set resp.http.X-Cache = "MISS from taylor cache";
# 後端伺服器中得到MISS通路的域名
}
return (deliver);
}
5.編寫配置檔案後要重新加載預設檔案
6.在實體機中的/etc/hosts中寫www.taylorswift.com的解析—>172.25.70.1(varnish主機)
172.25.70.1 server1 www.taylorswift.com
在server2(後端伺服器)中安裝httpd服務并在Apach預設釋出目錄中寫預設釋出檔案
7.在實體機中測試:
curl -I www.taylorswift.com
第一次,沒有緩存
第二次,有緩存
二、具有多台後端伺服器的varnish
1.server3安裝httpd服務,在httpd的預設釋出目錄下編輯預設釋出檔案index.html
2.将music解析到實體主機
vim /etc/hosts
172.25.70.1 server1 www.taylorswift.com music.taylorswift.com
3.配置varnish的server1default檔案
vim /etc/varnish/default.vcl
backend web1 { # 後端第一個伺服器名web1
.host = "172.25.70.2";
#将server2 www.taylorswift.com作為第一個伺服器主機
.port = "80";
}
backend web2 { # 後端第二個伺服器名web2
.host = "172.25.70.3"
#将server3 music.taylorswift.com作為第二個伺服器主機
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?taylorswift.com") {
# 解析域名是taylorswift.com 或www.taylorswift.com,均通路172.25.70.2->server2
set req.http.host = "www.taylorswift.com";
set req.backend = web1;
} elsif (req.http.host ~ "^music.taylorswift.com") {
# 解析域名為music.taylorswift.com,通路172.25.70.3->server 3
set req.backend = web2;
} else {error 404 "taylor cache";
# 如果通路的域名不是這三者,404的錯誤
}
}
default檔案每次編寫完後都要reload varnish
4.實體機中的通路測試:
不同域名通路不同頁面
三、varnish後端伺服器的負載均衡
1.什麼是負載均衡
負載均衡(Load Balance,簡稱LB)是一種伺服器或網絡裝置的叢集技術。負載均衡将特定的業務(網絡服務、網絡流量等)分擔給多個伺服器或網絡裝置,進而提高了業務處理能力,保證了業務的高可用性。
負載均衡算法的種類有很多種,常見的負載均衡算法包括輪詢法、随機法、源位址哈希法、權重輪詢法、權重随機法、最小連接配接法等,應根據具體的使用場景選取對應的算法。在varnish中我們采用的是輪詢法,平衡對待每一個後端伺服器。
2.在server3的httpd的預設釋出目錄中建立兩個虛拟主機
[[email protected] ~]# mkdir /www
[[email protected] ~]# cd /www/
[[email protected] www]# vim index.html
[[email protected] www]# cat index.html
server3 - www.taylorswift.com
[[email protected] www]# mkdir /music
[[email protected] www]# cd /music/
[[email protected] music]# vim index.html
[[email protected] music]# cat index.html
server3 - music.taylorswift.com
=======================================
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
1011 <VirtualHost *:80>
1012 DocumentRoot /www
1013 ServerName www.taylorswift.com
1014 </VirtualHost>
1015 <VirtualHost *:80>
1016 DocumentRoot /music
1017 ServerName music.taylorswift.com
1018 </VirtualHost>
将990行注釋打開
3.在varnish主機server1中的defaults檔案中寫入負載均衡函數:
director taylor round-robin { # 采用round-robin算法
{ .backend = web1; }
{ .backend = web2; }
}
Round Robin(中文翻譯為輪詢排程)是一種以輪詢的方式依次将一個域名解析到多個IP位址的排程不同伺服器的計算方法。
sub vcl_recv {
if (req.http.host ~ "^(www.)?taylorswift.com") {
set req.http.host = "www.taylorswift.com";
set req.backend = taylor; # 調用平衡輪叫函數
#return (pass); # 寫pass表明不經過緩存直接去後端伺服器拿資料
} elsif (req.http.host ~ "^music.taylorswift.com") {
set req.backend = web2;
} else {error 404 "taylor cache";
}
}
4.default檔案每次編寫完後都要reload varnish
5.server3的httpd服務重新開機
/etc/init.d/httpd restart
6.在實體主機中的測試(因為varnish自帶緩存功能,是以為看到輪詢功能,在輪詢函數中添加pass參數。等于屏蔽了它的緩存功能。)
curl www.taylorswift.com
curl music.taylorswift.com
如果第一次出現server2(server3),那麼120秒内都是server2(server3),因為server2(server3)将資料進行了緩存;
如果通路時間大于120s,它會出現server3(server2)(因為負載均衡采用的算法是平衡輪叫,server2和server3是公平地被通路的)
如果在預設函數中寫上pass,那麼它每次都直接從後端伺服器中直接取,一次server2一次server3
健康檢查:
通過健康檢查來确定伺服器和應用的健康狀況是負載均衡器器一個非常重要的功能。沒有負載均衡器,用戶端可能會将請求發送到已經停機的伺服器上。網絡管理者必須手動幹預替換這台伺服器,或者排除伺服器的故障。有時伺服器可能沒有停機,但是因為某種原因,比如軟體的漏洞,伺服器上面運作的應用系統已經不能正常工作。比如Web應用可能正常運作,但它傳回的頁面卻是錯誤的内容。負載均衡器能夠檢測這些情況并立即将客戶請求導向到正常的伺服器而不需要管理者的幹預。