1. 程式人生 > >Varnish相關功能實現

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>

負載均衡實現