天天看點

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

環境,

server2 172.25.254.2

server3 172.25.254.3

server4 172.25.254.4

server2作varnish伺服器

varnish介紹

Varnish是一款開源的、高性能的HTTP加速器和反向代理伺服器

最主要的功能就是:通過緩存來實作Web通路加速

Varnish特點是主要基于記憶體或者是虛拟記憶體進行緩存,性能好 支援設定精确的緩存時間 VCL配置管理比較靈活 後端伺服器的負載均衡和健康檢查

varnish安裝

www.varnish-cache.org

從官網下載下傳varnish6.3或者6.4 的rpm包

安裝時提示需要jemalloc.x86_64 0:3.6.0-1.el7這個包的依賴性,這是一個用來管理記憶體的軟體。

配置檔案

他的配置檔案是這些

default.vcl 我們将來用于編寫vcl文法的

varnish-x86_64.conf 是配置檔案

varnish是環境變量資訊

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

他的啟動腳本是 /usr/lib/systemd/system/varnish.service

檢視啟動腳本:

最大打開檔案數:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

檢視我們系統中的最大打開檔案數

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

最大打開檔案數為97764個,不夠我們varnish 使用,我們可以加大記憶體或者更改 varnish 配置檔案。

記憶體改為2G;

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

開機後發現可打開檔案數增大了,滿足varnish需求了。

記憶體鎖定,運作varnish時需要折磨多記憶體:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

大概82M

檢視我們系統中的程序限制

ulimit -a 
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

可見最大為64M.我們需要進行設定

可并行的任務數:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

沒有限制。

預設端口:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

更改為:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

因為我們要用它做一個反向代理,要作緩存,而且使用者不知道6081端口,是以使用者直接用http通路緩存伺服器。

-T 可以讓我們使用指令行去管理varnish

儲存退出。

然後更改 /etc/security/limits.conf

讓系統允許我們的varnish以這樣的記憶體區運作。

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後我們啟動 varnish

啟動成功且80端口打開,我們在火湖浏覽器通路

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

說明我們的varnish正常的隻是沒有資料,那我們配置一些資料。

vim /etc/varnish/default.vcl
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

這裡要注意 backend default 的作用是:

當你通路varnish時,會把你的請求轉交給 本地的回環接口, 8080 端口

我們改為:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

,就讓在通路varnish時,把請求轉交給172.25.254.3這台主機,相當于反向代理,

然後我們在這台主機上安裝http 就有80端口了

我們給他建立一個index頁面:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後重新開機varnish,重新整理firefox:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

我們就看到的是172.25.254.3的内容了,可見請求已經被排程到了 172.25.254.3

ps aux
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

可以看到varnish開啟了兩個程序,一個manager 程序,負責讀取程序的各項程序,并監控子程序

一個child程序,這個才是真實的處理使用者請求的程序

檢視manager程序的資訊:

cat /proc/17532/status
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

threads = 1 ,可以看出隻有一個線程,說明manager程序之監控子程序,沒有處理使用者請求,這些都由子程序來處理。

cat /proc/17542/status
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

threads = 216 ,說明子程序是用于處理的程序。

varnish指令行

varnishadm 可以進入varnish的指令行

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

緩存内容

vim /etc/varnish/default.vcl
           

在裡面的deliver 子產品進行編輯,内容如下:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";        #命中緩存傳回這句話
}
else {
set resp.http.x-Cache = "MISS from westos cache";		#如果不是,傳回這句話
}
return (deliver);

           

這段代碼可以讓我們知道是否從緩存中擷取, #vcl文法可以從官方文檔中擷取用法。

重新開機varnish,

測試:

curl -I 172.25.254.2
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

到數第三行可以看出命中了緩存。第一次會miss,因為cdn中也沒有資料,第二次通路時就會從緩存中擷取。

如果内容有更新時,我們需要更新緩存,這時,我們可以手動清除緩存。

varnishadm ban req.url "~" /                 表示清空所有緩存,/代表所有
varnishadm ban req.url "~" /index.html       表示清空這個頁面的緩存,
# 和上面的不同,清理後curl -I 172.25.254.2 不會miss,因為并沒有清空全部的緩存。
# curl -I 172.25.254.2/index.html 才會 MISS 。
           

表示清空我們的緩存,預設的自動晴空緩存的時間為120S。

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

看第一行和最後一行,可知已經清空了緩存。

不同域名配置設定不同後端

當我門的請求過多時,一台後端主機無法應付,這好似我們就可以定義多個後端進行反向代理:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

并設定 sub vcl_recv :

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = web1;     #www.westos.org 對應 web1
}
elsif (req.http.host ~ "^bbs.westos.org") {          
set req.backend_hint = web2;     #bbs.westos.org 對應 web1
} else {
        return (synth(405));
}
}
# 不同的主機設定不同的域名
           

重新開機varnish,

在實體機上做好本地解析:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後在 172.25.254.3 和172.25.254.4 上建立index.html 檔案

echo www.westos.com > /var/www/html/index.html          3
echo bbs.wesots.org > /var/www/html/index.html
           

測試通路:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

可見内容分發給不同的後端成功。

定義負載均衡

cdn作為通路的排程點需要做負載均衡

#可以檢視相關手冊
man vcl 
man varnishadm
man vmod_directors
           

我們需要導入 /usr/lib64/varnish/vmods/libvmod_directors.so 子產品才能激活負載均衡

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
vim /etc/varnish/default.vcl
           

寫到這個位置:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

導入後我們去man vmos_directors查詢如何去寫配置來激活負載均衡:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

使用round_robin輪巡的負載均衡模式,我們負載均衡器起名為 lb ,更改 後端伺服器名稱web1 web2

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後更改 vcl_recv:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

就是當我們通路www.westos.com 時 就會輪詢的去通路web1 和web2, 當通路 bbs.westos.org 時會通路web2。

重新開機服務,測試:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

測試的時候通路www.westos.org 卻沒有輪詢通路兩台後端,這是為什麼那?

因為我們的cdn是緩存,第一次讀取後結下來的讀取都是從緩存中擷取,是以沒有輪詢通路。

那我們讓緩存不生效在試一次:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

加上return這一行表示不緩存,那我們繼續測試:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

每次都是MISS,就代表不從緩存讀取。

這次就達到了我們的負載均衡的需求了.

或者我們每次都手動的清理一次緩存:

varnishadm ban req.url "~" /
           

這樣清理緩存對于企業是有門檻的,是以我們可以用圖形界面操作。

安裝httpd 和php

安裝bansys軟體:

unzip bansys.zip -d /var/www/html           -d解壓到目錄,因為我們要釋出它
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

更改 config.php,定義varnish主機:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

配制成這個樣子,因為我們沒有作資料庫,是以資料庫的一些配置我們删除。

更改httpd的端口為8080,因為varnish占用了80端口:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

重新開機httpd,測試通路:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

可以使用。使用HTTP方式

我們需要設定一個權限,隻對特定ip推送:

vim /etc/varnish/default.vcl
           
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結
if (req.method == "BAN") {            #判斷是否要清除緩存
if (!client.ip ~ westos) {				##如果ip和westos定義的ip不比對,告知不允許
        return(synth(405,"Not allowed"));
}
ban("req.url ~ " + req.url);			#否則清楚
        return (purge);
}

           

重新開機服務,

檢視我們是否有緩存;

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

命中緩存,則有。

我們推送 .* 表示清楚所有緩存。

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後我們在通路:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

就又變成了MISS 了。

我們還可以推送 index.html,他不影響整體緩存,清空後隻有/index.html 是MISS form cache

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

現在兩個的緩存都存在,

推送:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

然後再次通路:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

隻有index.html MISS 了。

總結

從 varnish-book 總結流程:

cdn緩存加速---varnishvarnish介紹varnish安裝配置檔案定義負載均衡總結

各個子產品的功能:

vcl_recv : 接受使用者的請求,并進行查詢
vcl_hash: 在recv之後被調用,用來請求建立hash值,作用是在varnish中查找key值。
  • hit函數 緩存查找成功時調用的,進入pass子產品或者deliver子產品
  • pass函數 進入通道模式請求的,不經過緩存,進入pass子產品
  • hit-for-pass函數 進入pass子產品
  • miss函數 未命中緩存,進入miss子產品,在進入後端查詢子產品(vcl_backend_fetch)
  • purge函數 用于清空緩存
  • pipe函數 在管道模式中使用,進入vcl_pipe 子產品,子程序,可以使請求直接傳送到後端,通常用于大資料的傳輸
  • busy函數 在varnish繁忙的時侯 進入waiting子產品
vcl_backend_response: 接受
vcl_beresp動作: 讀取請求頭,如果緩存沒有,進入vcl_backend_error 子產品,有就進入response子產品,準備響應請求。
cacheabel動作: 詢問是否緩存資料,因為比如使用者的密碼是不允許緩存的
vcl_deliver: 将資料結果傳回給用戶端
done: 傳回給用戶端後結束

繼續閱讀