Varnish基礎應用2

2021-08-28 08:30:02 字數 4250 閱讀 1032

一次客戶端請求過程:

客戶端請求----》瀏覽器快取------》公共快取------》後端伺服器。

vrnish的狀態引擎(state engine)

vcl_recv:剛收到請求

vcl_fetch:去後端伺服器取內容

vcl_deliver:投遞響應報文

vcl_hit:命中

vcl_miss:沒命中

vcl_hash:因為varnish採用的是範網域名稱解析,通過vcl_hash可以確定不同的key對應的是否為同一值。

vcl_pipe:如果客戶端請求的方法不是乙個正常的方法(不是get,head,put,post,trace,options,delect),或者varnish不能理解這個方法,則有vcl_pipe引擎直接將請求扔給後端主機。

vcl_error:由varnish直接合成乙個錯誤頁面資訊返回給客戶端。

vcl_pass:請求的是乙個不可快取的物件,但varnish能理解請求(例如:請求的方法不是get和head,或請求帶cookie、帶認證等)

【注意】:各狀態引擎之間存在一定的相關性,不能隨意指定順尋,且前乙個engine可能有多個不同的下游engine,則上游engine需要用return指明需要轉移的下游engine

vcl程式語言語法:

(1)//,#,/\*...*/ 用於注釋;

(2)sub $name #用於定義子例程

sub vcl_recv

(3)不支援迴圈

(4)有眾多內建變數,變數的可呼叫位置與state engine有密切相關性;

(5)支援終止語句;return(action);沒有返回值

(6)"域"專用

(7)操作符:=,==,~,!,&&,||

條件判斷語句:

if (condtion) else

變數賦值:set name=value ,unset name

req.http.header:呼叫request報文中http協議的指定header;

req.request:請求方法

client.ip:客戶端ip

beresp :後端響應報文

state engine workflow(version 3):

vcl_recv---->vcl_hash---->vcl_hit---->vcl_deliver

vcl_recv---->vcl_hash---->vcl_miss---->vcl_fetch---->vcl_deliver

vcl_recv---->vcl_pass---->vcl_fetch---->vcl_deliver

vcl_revc---->pipe

state engine(v 4)

vcl_recv,vcl_hash,vcl_hit,vcl_miss,vcl_pipe,vcl_pass

vcl_backend_fetch

vcl_backend_response

vcl_backend_error

vcl_purge

vcl_synth

varnish中的內建變數:

變數種類:

req:客戶端發往varnish的requesrt

resp:varnnish響應給客戶端

client:

server

server.ip

server.hostname

bereq:varnish發給後端主機的

bereq.http.headers:由varnish發往backend server的請求報文的指定首部

bereq.request:請求方法

bereq.backend:指明要呼叫的後端主機

beresp:後端主機響應給varnish的

beresp.http.header:從backend server響應的報文首部

obj:內容的屬性

obj-ttl:物件的ttl值

obj-hits:此物件從快取中命中的次數

storage

接下來我們嘗試重新編譯vcl檔案,並將其應用於我們的服務。

cp /etc/varnish/default.vcl /etc/varnish/test.vcl

在varnish官網( 上覆制vcl_recv的內容

}

使用varnishadm工具連上去

[root@server7 ~]# varnishadm -s /etc/varnish/secret -t 127.0.0.1:6082

vcl.load test2 test.vcl #裝載vcl檔案

vcl.use test2 #使用vcl檔案

去請求6081埠,因為之前已經請求過該頁面了,所以可以看到x-cache的值為hit

我們去請求乙個沒有訪問過的頁面

這時,第一次請求該頁面的值為miss,第二次為hit

我們也可以自定義一些後端主機,例如我們可以自定義乙個後端的伺服器。

backend imgsrv 

.port:be監聽的埠

.probe :對be做健康狀態檢測

.max_connections :最大連線數

讓varnish支援虛擬主機

vcl_recv 部分:

if(req.http.host == 「www.wtt.com「 )
強制對某資源的請求不檢查快取

if (req.url ~ "^/test1.html$")

每一修改完vcl檔案後都要重新的裝載使用

vcl.load test3 test.vcl

200

vcl compiled.

vcl.use test3

200

vcl 'test3' now active

這時後去訪問test1.html式一直都是miss狀態,表示結果沒有從快取伺服器返回

後端主機的健康狀態檢測方式:

probe name 

.url :判斷be健康與否要請求的url

.expected_responce:期望響應的狀態碼,預設為200

負載均衡演算法:

fallback,random,round_robin,hash

varnish基礎應用

varnish主要用於快取伺服器,還有一些其他軟體也能實現快取功能,例如memcached但是它主要快取的是數值資料,適用於快取mysql的資料 而nginx也有快取功能,也可在反代時為後端主機提供快取,但是nginx常用於反代伺服器使用,也不建議乙個主機承載多工工作,這樣會 效能降低 而varni...

Varnish基礎應用1

是一種開源方案。程序分為兩類 management 程序和 管理程序 child cache 子程序 管理程序 編譯vcl並應用新配置。監控varnish。初始化varnish,cli介面。child cache acceptor 接受新的連線請求。worker thread 處理使用者請求。exp...

python 基礎應用2

取絕對值 a 0.1 print abs a 商餘print divmod 15,5 冪函式 print pow 2,5 四捨五入 print round 0.123456,2 去最大值 max 2,8,9,4,3 去最小值 min 0,8,6,4,12 3 時間的獲取time庫的使用 import...