Varnish相關功能實現
簡介:
Varnish是一款高效能的開源http加速器,現在計算機系統的記憶體除了主存外,還包括了CPU內的L1、L2,甚至有L3快取。硬碟上也有自己的快取裝置,因此Squid Cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但作業系統可以得知這些情況,所以這部份的工作應該交給作業系統處理,這就是 Varnish cache設計架構,下面就varnish的相關功能實現做個總結
Varnish安裝
下載地址:http ://repo.varnish-cache.org 目前最新版本為5.2.0:
本次測試用的是varnish-3.0.5-1版本的rpm包:
直接yum安裝即可:
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
安裝好以後在/etc/varnish/目錄下會自動生成varnish主配置檔案和金鑰,varnish全域性配置檔案路徑為:/etc/sysconfig/varnish
[root@server1 varnish]# ls
default.vcl secret #default.vcl 為varnish主配置檔案,secret為金鑰
[root@server1 varnish]#
至此vaenish的安裝就完成了
反向代理功能實現:
環境搭建:
server1:172.25.7.1 #安裝varnish
server2:172.25.7.2 #安裝httpd
1.編輯varnish主配置檔案: vim /etc/varnish/default.vcl
7 backend default {
8 .host = "172.25.7.2"; #意為當客戶端訪問本機時,本機到ip為172.25.7.2主機去取資料
9 .port = "80"; #埠為80,即httpd服務埠
10 }
vim /etc/sysconfig/varnish #編輯varnish全域性配置檔案,將預設6081埠修改為80埠,即當客戶端訪問本機80埠時,本機到172.25.7.2的80埠去找:
VARNISH_LISTEN_PORT=80 #將檔案中此處預設的6081埠修改為80
如不修改預設埠,客戶端在訪問時,在ip後加上預設埠也行,即:
curl 172.25.7.1:6081
/etc/init.d/varnish start #啟動varnish服務
2.在172.25.7.2主機的安裝httpd,
yum install httpd -y
並在預設釋出目錄下新建並編輯測試頁:
vim /var/www/html/index.html
<h1>www.hc.com-server2</h1>
/etc/init.d/httpd start #啟動httpd服務
3.測試:
在客戶端訪問安裝了varnish的主機ip,這裡直接在客戶機終端進行訪問:
[[email protected] ~]# curl 172.25.7.1 #修改埠後訪問方式
<h1>www.hc.com-server2</h1>
未修改varnish預設埠訪問方式:
[[email protected] ~]# curl 172.25.7.1:6081
<h1>www.hc.com-server2</h1>
反向代理測試成功,但如果服務端(172.25.7.2)修改了測試頁中的內容,客戶端訪問的內容並不會第一時間改變,這是因為varnish主機中快取沒有過期,為了第一時間讓客戶端訪問到服務端更新後的內容,需要做cdn推送,這裡用varnishadm ban.url .*$命令來手動清除快取,然後客戶端再訪問的時候,就可以看到服務端更新後的內容:
清除快取測試:
首先將172.25.7.2主機中的httpd測試頁內容做如下修改:
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
檢視客戶端訪問效果:
[[email protected] ~]# curl 172.25.7.1 #依然訪問的是之前的頁面,因為快取還沒有用完
<h1>www.hc.com-server2</h1>
[[email protected] ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
[[email protected] ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
在安裝了varnish的172.25.7.1主機手動清除快取:
[root@server1 ~]# varnishadm ban.url .*$
客戶端再次訪問效果:
[[email protected] ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
[[email protected] ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
在這個過程中,客戶端只和安裝了varnish的主機進行互動,而實際訪問的內容則是在(172.25.7.2)上
varnish的主機就是做了代理的服務,當客戶端訪問時,先檢視快取(cache)中是否有資料,如果沒有,就去後端伺服器中取,如果有,就直接反饋給客戶端,這樣比客戶端直接訪問伺服器速度更快,而且也減輕了後端伺服器的壓力
定義多個不同域名站點的後端伺服器
增加一臺主機server3:
server3:172.25.7.3 #安裝httpd
1.同樣是編輯varnish主配置檔案: vim /etc/varnish/default.vcl
backend server2 {
.host = "172.25.7.2"; #定義一個後端伺服器地址和埠
.port = "80";
}
backend server3 {
.host = "172.25.7.3"; #定義另一個後端伺服器地址和埠
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?hc.com") { #客戶端訪問www.hc.com到server2去取,看到的是server2主機上的內容
set req.http.host = "www.hc.com";
set req.backend = server2;
} elsif (req.http.host ~ "^bbs.hc.com") { #客戶端訪問bbs.hc.com時到server3去取
set req.backend = server3;
} else {
error 404 "hc cache";
} #客戶端訪問其他時直接報錯
}
[root@server1 ~]# /etc/init.d/varnish restart #重啟varnish
Stopping Varnish Cache: [ OK ]
Starting Varnish Cache: [ OK ]
2.在server3主機下載httpd:
yum install httpd -y
新建並編輯預設釋出檔案測試頁:vim /var/www/html/index.html
<h1>www.hc.com-server3</h1>
[root@server3 ~]# /etc/init.d/httpd start #啟動httpd
3.在客戶端做本地解析,因為沒有做DNS,所以需要做本地解析:
vim /etc/hosts #本地解析檔案
172.25.7.1 server1 www.hc.com bbs.hc.com
測試:
在客戶端進行訪問,測試也是在終端進行:
[[email protected] ~]# curl www.hc.com
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
[[email protected] ~]# curl bbs.hc.com
<h1>www.hc.com-server3</h1>
訪問其他時報錯,包括本機ip:
負載均衡
1.編輯配置檔案: vim /etc/varnish/default.vcl
director lb round-robin { #負載均衡方式為輪詢
{ .backend = server2; }
{ .backend = server3; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?hc.com") {
set req.http.host = "www.hc.com";
set req.backend = lb;
return (pass); #為了測試方便,不進行快取
}
elsif (req.http.host ~ "^bbs.hc.com") {
set req.backend = server3;
}
else {
error 404 "hc cache";
}
}
重新整理varnish:
[[email protected] ~]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2017-10-02T21:58:51
VCL compiled.
available 2 boot
active 0 reload_2017-10-02T21:58:51
Done
2.將server2上的測試頁內容修改為以下,便於測試:
vim /var/www/html/index.html
<h1>www.hc.com-server2</h1>
測試:
為了便於觀察負載均衡情況,使用for迴圈語句:
[[email protected] ~]# for i in {1..6}; do curl www.hc.com ; done
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>
負載均衡實現