環境,
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
檢視啟動腳本:
最大打開檔案數:
檢視我們系統中的最大打開檔案數
最大打開檔案數為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: | 傳回給用戶端後結束 |