環境,
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: | 返回給客戶端後結束 |