一、Varnish簡介
Varnish 是一款高性能且開源的反向代理服務器和 HTTP加速器,其採用全新的軟件體系機構,和現在的硬件體系緊密配合,與傳統的squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進varnish 迅速發展起來。
二、Varnish工作原理圖
vcl_recv:是在Varnish完成對請求報文的解碼爲基本數據結構後第一個要執行的子例程
vcl_fetch:根據服務器端的響應作出緩存決策
vcl_pipe:用於將請求直接發往後端主機
vcl_hash:自定義hash生成時的數據來源
vcl_pass:用於將請求直接傳遞至後端主機
vcl_hit:從緩存中查找到緩存對象時要執行的操作
vcl_miss:從緩存中款查找到緩存對象時要執行的操作
vcl_deliver:將用戶請求的內容響應給客戶端時用到的方法
vcl_error:在varnish端合成錯誤響應而時
三、配置Varnish服務器
server2上
1.下載安裝Varnish軟件包
現在你的虛擬機可能連不上網,你可以在真機下載,然後scp過去,但是會出現下面問題
現在就需要在虛擬機一個openssl-clients這個軟件,然後就可以了
2.修改varnish的監聽端口
vim /etc/sysconfig/varnish
3.修改配置文件
打開文件的最大數,有如下關係:內核操作> 操作系統> 軟件
內核允許的打開文件最大數
但是varnisg軟件的打開文件最大數
因爲默認數量大於內核操作的文件數,所以要將默認數量改小一點
[root@server2 varnish]# vim /etc/sysconfig/varnish
NFILES=65535
還要修改內存空間和線程數,文件數應該介於上述兩者之間
[root@server2 varnish]# vim /etc/sysconfig/varnish
MEMLOCK=82000
NPROCS="unlimited"
可修改:
server3網絡服務器
安裝httpd服務,並開啓服務
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
在server3上vim /var/www/html/index.html
在sserver2上,修改varnish監聽網絡服務器的ip
vim /etc/vanish/default.val
刷新varnish
檢測:在瀏覽器中輸入172.25.66.3/index.html
手動清除緩存
### 通過 varnishadm 手動清除緩存
# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 頁面緩存
# varnishadm ban.url /admin/$
#清除 admin 目錄緩存
四、查看緩存命中情況
1、server2: 在varnish配置文件(/etc/varnish/default.vcl)中添加如下代碼:
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.1.2"; # 後端服務器的ip
.port = "80"; # 後端服務器的端口
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache"; #在varnish中命中HIT訪問的域名
}
else {
set resp.http.X-Cache = "MISS from westos cache"; #後端服務器中得到MISS訪問的域名
}
return (deliver);
}
2、重新加載默認文件
/etc/init.d/varnish reload
3、在物理機中添加www.westos.org的解析
172.25.66.2 www.westos.org
4、在物理機中測試: curl -I www.westos.org
五、定義多個不同域名站點的後端服務器
此實驗需要一臺varnish主機(server2),還有兩臺虛擬機(server3,server4)
1、在server4的httpd服務的默認發佈目錄下編輯文件(/var/www/html/index.html)
bbs.westos.com
2、將bbs解析到物理主機中
172.25.66.2 bbs.westos.org
3、配置varnish的配置文件(vim /etc/varnish/default.vcl)
backend web1 { # 後端第一個服務器名web1
.host = "172.25.1.2";
#將server2 www.westos.org作爲第一個服務器主機
.port = "80";
}
backend web2 { # 後端第二個服務器名web2
.host = "172.25.1.3"
#將server3 bbs.westos.org作爲第二個服務器主機
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
# 解析域名是westos.com 或www.westos.com,均訪問172.25.1.2->server2
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
# 解析域名爲bbs.westos.com,訪問172.25.1.3->server 3
set req.backend = web2;
} else {error 404 "westos cache";
# 如果訪問的域名不是這三者,404的錯誤
}
}
4、重新加載varnish
5、在物理機中測試
六、基於多臺服務器的負載均衡
1、什麼是負載均衡
負載均衡(Load Balance,簡稱LB)是一種服務器或網絡設備的集羣技術。負載均衡將特定的業務(網絡服務、網絡流量等)分擔給多個服務器或網絡設備,從而提高了業務處理能力,保證了業務的高可用性。
負載均衡算法的種類有很多種,常見的負載均衡算法包括輪詢法、隨機法、源地址哈希法、加權輪詢法、加權隨機法、最小連接法等,應根據具體的使用場景選取對應的算法。在varnish中我們採用的是輪詢法,平衡對待麼一個後端服務器。
2、在server2上配置varnish
backend web1 {
.host = "172.25.66.3";
.port = "80";
}
backend web2 {
.host = "172.25.66.4";
.port = "80";
}
director lb round-robin { #採用round-robn算法:一種以輪詢的方式依次將一個域名解析到多個IP地址的調度不同服務器的計算方法
{.backend = web1;}
{.backend = web2;}
} #把多個後端聚合爲一個組
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb; #調用平衡論調函數
return(pass); #爲了測試方便,不進行緩存直接去後端服務器拿數據
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
2、在serveer3的httpd服務的默認發佈目錄中寫入www.westos.org-server3
在server4的httpd服務的默認分佈目錄中寫入www.westos.org-server4
3、後臺服務器的配置(server4)
vim /etc/httpd/conf/httpd.conf
#打開80端口
NameVirtualHost *:80
#在默認文件最後添加
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName bbs.westos.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
/etc/init.d/httpd restart
mkdir /www
vim /www/index/html
添加本地解析(vim /etc/hosts)
4、server3這臺後臺服務器的配置
5、在主機中測試
curl www.westos.org #交替出現server2和server3中默認發佈內容,將其中一個用戶關閉,則另一個用戶繼續抓取信息的工作,實現負載均衡,使其關閉的方法是關閉http服務,清除緩存即可
在網頁上測試:
刷新網頁
如果第一次出現server2(server3),那麼120秒內都是server2(薩爾ver),因爲server2(server3)將數據進行了緩存;
如果訪問時間大於120s,它會出現server3(server2)(因爲負載均衡採用的算法是平衡輪叫,server2和server3是公平地被訪問的)
如果在默認函數中寫上return(pass),那麼它每次都直接從後端服務器中直接取,一次server2一次server3
如果server2或者server3其中一個損壞(關閉htpd服務),那麼客戶端只會訪問健康的那一個,不會訪問壞的哪一個,即負載均衡的健康檢查。
當server4的後臺網絡服務器掛掉之後,就自動server3這臺服務器
七、搭建CDN推送平臺
1、CDN 的概念
CDN是構建在網絡之上的內容分發網絡,依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。CDN的關鍵技術主要是內容存儲和分發技術
2、CDN推送的步驟
1.在server1安裝httpd服務並編輯httpd配置文件,將136行的端口號修改8080(因爲我們的varnish服務已經佔用了80端口,避免衝突)
2.安裝php(顯示頁面)
3.將banzip從物理機發送到server1,並在server1解壓到/var/www/html(指定目錄解壓 -d)
5.將/var/www/html中的所有東西移到/var/www/html中
6.編輯config.php
1)將httpd服務的端口號改成8080,以防和varnish衝突
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
2)下載bansys安裝包:http://code.google.com/p/varnish-php-bansys/
安裝解壓軟件:yum install unzip -y
開始解壓:unzip bansys.zip
將解壓後的文件放到apache的默認發佈目錄中(/var/www/html/)
3)修改配置文件
[root@server2 html]# vim config.php
<?php
$var_group1 = array(
'host' => array('172.25.66.2'),
'port' => '80',
);
//varnish羣組定義
//對主機列表進行綁定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一樣
$VAR_VERSION = "3";
?>
4)開啓httpd服務
[root@server2 html]# /etc/init.d/httpd start
5)瀏覽器訪問
6)編寫varnish的默認文件vim /etc/varnish/default.vcl
acl westos {
#設置訪問控制,即就是白名單,允許本機和172.25.66網段和推送
"127.0.0.1"; #本機的IP
"172.25.66.0"/24; #24是子網掩碼
}
backend web1 {
.host = "172.25.66.3";
.port = "80";
}
backend web2 {
.host = "172.25.66.4";
.port = "80";
}
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.request == "BAN") { #如果採用的推送方式是BAN
if (!client.ip ~ westos) { #如果客戶端的IP不是westos
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
return(pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
重新加載varnish:/etc/init.d/varnish reload
重啓httpd服務:/etc/init.d/httpd restaart
測試:在瀏覽器中訪問172.25.66.2:8080,在推送內容中輸入想要更新的頁面,選擇HTTP