cdn緩存加速---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是環境變量信息
在這裏插入圖片描述
他的啓動腳本是 /usr/lib/systemd/system/varnish.service
查看啓動腳本:
最大打開文件數:
在這裏插入圖片描述

查看我們系統中的最大打開文件數

sysctl -a |grep file

在這裏插入圖片描述
最大打開文件數爲97764個,不夠我們varnish 使用,我們可以加大內存或者更改 varnish 配置文件。

內存改爲2G;
在這裏插入圖片描述

在這裏插入圖片描述
開機後發現可打開文件數增大了,滿足varnish需求了。

內存鎖定,運行varnish時需要折磨多內存:
在這裏插入圖片描述
大概82M
查看我們系統中的進程限制

ulimit -a 

在這裏插入圖片描述

可見最大爲64M.我們需要進行設定
可並行的任務數:
在這裏插入圖片描述
沒有限制。
默認端口:
在這裏插入圖片描述
更改爲:
在這裏插入圖片描述

因爲我們要用它做一個反向代理,要作緩存,而且用戶不知道6081端口,所以用戶直接用http訪問緩存服務器。
-T 可以讓我們使用命令行去管理varnish
保存退出。

然後更改 /etc/security/limits.conf
讓系統允許我們的varnish以這樣的內存區運行。
在這裏插入圖片描述
然後我們啓動 varnish

啓動成功且80端口打開,我們在火湖瀏覽器訪問

在這裏插入圖片描述
在這裏插入圖片描述

說明我們的varnish正常的只是沒有數據,那我們配置一些數據。

vim /etc/varnish/default.vcl

在這裏插入圖片描述

這裏要注意 backend default 的作用是:
當你訪問varnish時,會把你的請求轉交給 本地的迴環接口, 8080 端口
我們改爲:
在這裏插入圖片描述

,就讓在訪問varnish時,把請求轉交給172.25.254.3這臺主機,相當於反向代理,
然後我們在這臺主機上安裝http 就有80端口了
我們給他創建一個index頁面:
在這裏插入圖片描述

然後重啓varnish,刷新firefox:
在這裏插入圖片描述

我們就看到的是172.25.254.3的內容了,可見請求已經被調度到了 172.25.254.3

ps aux

在這裏插入圖片描述

可以看到varnish開啓了兩個進程,一個manager 進程,負責讀取進程的各項進程,並監控子進程
一個child進程,這個纔是真實的處理用戶請求的進程
查看manager進程的信息:

cat /proc/17532/status

在這裏插入圖片描述

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

cat /proc/17542/status

在這裏插入圖片描述

threads = 216 ,說明子進程是用於處理的進程。

varnish命令行

varnishadm 可以進入varnish的命令行
在這裏插入圖片描述

緩存內容

vim /etc/varnish/default.vcl

在裏面的deliver 模塊進行編輯,內容如下:
在這裏插入圖片描述

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

在這裏插入圖片描述

到數第三行可以看出命中了緩存。第一次會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。
在這裏插入圖片描述

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

不同域名分配不同後端

當我門的請求過多時,一臺後端主機無法應付,這好似我們就可以定義多個後端進行反向代理:
在這裏插入圖片描述
並設置 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,
在物理機上做好本地解析:
在這裏插入圖片描述
然後在 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作爲訪問的調度點需要做負載均衡

#可以查看相關手冊
man vcl 
man varnishadm
man vmod_directors

我們需要導入 /usr/lib64/varnish/vmods/libvmod_directors.so 模塊才能激活負載均衡
在這裏插入圖片描述

vim /etc/varnish/default.vcl

寫到這個位置:
在這裏插入圖片描述

導入後我們去man vmos_directors查詢如何去寫配置來激活負載均衡:
在這裏插入圖片描述

使用round_robin輪巡的負載均衡模式,我們負載均衡器起名爲 lb ,更改 後端服務器名稱web1 web2
在這裏插入圖片描述

然後更改 vcl_recv:在這裏插入圖片描述

就是當我們訪問www.westos.com 時 就會輪詢的去訪問web1 和web2, 當訪問 bbs.westos.org 時會訪問web2。
重啓服務,測試:
在這裏插入圖片描述
測試的時候訪問www.westos.org 卻沒有輪詢訪問兩臺後端,這是爲什麼那?
因爲我們的cdn是緩存,第一次讀取後結下來的讀取都是從緩存中獲取,所以沒有輪詢訪問。
那我們讓緩存不生效在試一次:
在這裏插入圖片描述
加上return這一行表示不緩存,那我們繼續測試:

在這裏插入圖片描述
在這裏插入圖片描述
每次都是MISS,就代表不從緩存讀取。
這次就達到了我們的負載均衡的需求了.

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

varnishadm ban req.url "~" /

這樣清理緩存對於企業是有門檻的,所以我們可以用圖形界面操作。
安裝httpd 和php
安裝bansys軟件:

unzip bansys.zip -d /var/www/html           -d解壓到目錄,因爲我們要發佈它

在這裏插入圖片描述
更改 config.php,定義varnish主機:
在這裏插入圖片描述
配製成這個樣子,因爲我們沒有作數據庫,所以數據庫的一些配置我們刪除。
更改httpd的端口爲8080,因爲varnish佔用了80端口:

在這裏插入圖片描述
重啓httpd,測試訪問:
在這裏插入圖片描述
可以使用。使用HTTP方式
我們需要設置一個權限,只對特定ip推送:

vim /etc/varnish/default.vcl

在這裏插入圖片描述在這裏插入圖片描述

if (req.method == "BAN") {            #判斷是否要清除緩存
if (!client.ip ~ westos) {				##如果ip和westos定義的ip不匹配,告知不允許
        return(synth(405,"Not allowed"));
}
ban("req.url ~ " + req.url);			#否則清楚
        return (purge);
}

重啓服務,
查看我們是否有緩存;
在這裏插入圖片描述
命中緩存,則有。
我們推送 .* 表示清楚所有緩存。
在這裏插入圖片描述
然後我們在訪問:

在這裏插入圖片描述
就又變成了MISS 了。
我們還可以推送 index.html,他不影響整體緩存,清空後只有/index.html 是MISS form cache
在這裏插入圖片描述
現在兩個的緩存都存在,
推送:
在這裏插入圖片描述
然後再次訪問:
在這裏插入圖片描述

只有index.html MISS 了。

總結

從 varnish-book 總結流程:
在這裏插入圖片描述
各個模塊的功能:

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: 返回給客戶端後結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章