varnish概念
初步認識
首先來跟我學習,v~a~r~n~i~s~h~~ ,學會了沒有~
當然還有很重要的一個概念,它是高性能緩存服務器,舉個例子。
好比我們要去買東西,所有的我們需要的東西是在超市廠家生產出來的,我們需要的話去超市廠家取。這代表離服務器端近。
在好比我們要去超市買東西,這個超市廠家負責送貨到家門口樓下的超市,那我們肯定選擇離我們自己近的。這就是代表離客戶端近。
而緩存的功能就是把客戶端經常需要“買”的東西送到客戶端門口,畢竟web的存在就是為了給客戶端提供服務的,所以緩存是一個非常重要的概念。那怎么把數據送到客戶端門口呢,我們最常接觸的就是瀏覽器緩存,比如你訪問過一個網站,第一次打開需要加載,但是如果你打開了第二個頁面感覺又想回到上一個頁面直接返回就可以,此時并不需要重新加載,這就是緩存的一種。
緩存運行時遵從的理念
時間局部性:一個數據被訪問過之后,被統計接下來被訪問的概率。
空間局部性:一個數據被訪問時,周邊數據被訪問的概率。
這些稱為緩存的熱區,那空間滿了怎么辦?使用LRU算法,根據時間最近和頻率最少使用來清理緩存。
還有需要注意的一點是,以上所有的數據都是經過客戶端一段時間的訪問來統計出來的,而且要知道緩存是重啟失效的,所以你懂得,沒事可以把服務器經常關機或者重啟試試,肯定特別刺激。
varnish程序選項以及配置
調用方式看下圖;
?
?
VCL語法格式:
/etc/varnish/default.vcl
- 必須以VCL 4.0;開始;
- //, ?# ,/* foo */ ?全部為注釋;
- 根據不同的需求把不同的配置寫進不同的配置段;
- sub vcl_recv {
}
-
- sub vcl_backend_response {
}
-
- sub vcl_deliver {
}
- 終止語句return()沒有返回值;
- 不支持循環;
- 眾多內置變量,便令的可調用位置和state engine 有密切關系;
- 支持眾多操作符,=賦值 ==等值比較 ~模式匹配 !取反 ?&&邏輯與 ?|| 邏輯或;
- “域”專用語言只能用在特定的“域”上;
/etc/varnish/varnish.params
- RELOAD_VCL=1 ?##啟動時會不會自動加載VCL配置文件,1為確認;
- VARNISH_VCL_CONF=/etc/varnish/default.vcl ?##默認加載的緩存策略文件;
- VARNISH_SECRET_FILE=/etc/varnish/secret ?##秘鑰文件存儲位置;
- VARNISH_USER=varnish ? ##所屬用戶
- VARNISH_GROUP=varnish ?##所屬組
VCL配置文件重載:varnish_reload_vcl ?
緩存存儲機制:
- .malloc[,size]:內存存儲,size用來定義緩存空間大小,重啟失效。
- .file,path[,size]:文件存儲,重啟失效。
- .persistent,path,size:文件存儲,重啟有效,但是實驗階段不穩定不建議使用。
內置變量機制:

?
使用兩個centos7.3實驗演示,看起來清晰一點。
centos 1 192.168.150.161 安裝httpd
centos 2 192.168.150.160 安裝varnish
編輯centos 1 httpd配置文件;
[root@localhost: script]# vim /var/www/html/index.html
<h1> centos7.3 httpd test page </h1>
systemcel start httpd ##啟動服務;
編輯centos 2 varnish 配置文件 ;
[root@localhost: script ]# vim /etc/varnish/varnish.params ##程序選項文件,配置varnish服務進程的工作特性,例如監聽地址端口以及緩存機制;
......
13 # VARNISH_LISTEN_ADDRESS=192.168.1.5 ##監聽在哪個地址,這里注釋了代表監聽在本機所有的IP;
14 VARNISH_LISTEN_PORT=80 ##監聽本機的哪個端口默認為6081;
15
16 ?# Admin interface listen address and port ##配置管理員選項;
17 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 ##監聽在本機那個IP;
18 VARNISH_ADMIN_LISTEN_PORT=9877 ##監聽在本機那個端口;
.....
24 # man page for details.
25 VARNISH_STORAGE="file,/data/varnish,1g" ##默認存在緩存中這里配置為存在磁盤,文件目錄,以及文件大小,目錄需要手動創建并且需要設置varnish用戶為屬主與屬組;
......
[root@localhost: script ]# /etc/varnish/default.vcl ##配置各Child/Cache線程的緩存策略,先把httpd配置為后端主機;
......
15 # Default backend definition. Set this to point to your content server.
16 backend default { ##定義后端主機;
17 .host ="192.168.150.161"; ##默認是127.0.0.1,改為httpd服務器IP;
18 .port = "80"; ##默認為8080,改為80;
19 }
20
21 sub vcl_recv {
22
22
23 if (req.method != "GET" && ? ##設置默認策略,請求方法如果不是GET,HEAD,PUT,POST,TRACE,IPTIONS,DELETE,其中一個,則跳轉至pipe,避免有比較老的系統不能訪問網站;
24 req.method != "HEAD" &&
25 req.method != "PUT" &&
26 req.method != "POST" &&
27 req.method != "TRACE" &&
28 req.method != "OPTIONS" &&
29 req.method != "DELETE") {
30 return (pipe);
31 }
32
33 if (req.method != "GET" && req.method != "HEAD") { ?##如果請求方法不是GET,HEAD則跳轉至pass;
34 return (pass);
35 }
36 if (req.http.Authorization || req.http.Cookie) { ? ##如果請求中有認證相關的信息或者cookie信息則跳轉至pass;
37 return (pass);
38 }
39 return (hash);
40 ?}
?
[root@station103: varnish]# mkdir /data/varnish -pv ##創建緩存文件目錄
systemctl start varnish ##啟動服務
使用瀏覽器訪問192.168.150.160 基本框架已經搭好。
?
?
配置centos 1
[root@localhost: varnish]# mkdir /var/www/html/{login,admin} -pv
[root@localhost: varnish]# echo 1111 > ??/var/www/html/login/index.html
[root@localhost: varnish]# echo 1111 > ??/var/www/html/admin/index.html
配置centos 2?
[root@localhost: varnish]# vim /etc/varnish/default.vcl
sub vcl_recv { ??
if (req.url ~ "(?i)^/(login|admin)") { ?##表示如果訪問的是login或者admin任何文件則去硬盤中找;
return(pass);
}}
[root@localhost: varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:9877 ? ##交互式登錄 -S 指定秘鑰文件 ?-T 指定本機127.0.0.1以及自己配置的端口;
vcl.load test1 default.vcl ? ?##從default.vcl配置文件中裝載進緩存,命名為 test1,需要注意,這里是裝載進的緩存,重啟失效。使用vcl.show test1 可以查看配置 加 -v顯示詳細配置;
200
VCL compiled.vcl.list ? ##查看所有列表,test1已經存在 但是非活動狀態;
200
active 0 boot
available 0 test1vcl.use test1 ?##啟用test1?
200
VCL 'test1' now active
查看訪問網頁?http://192.168.150.160/login/因為有關鍵字,摁F12,可以看到并沒有緩存
?
[root@station103: varnish]# vim /etc/varnish/default.vcl
sub vcl_deliver { ? ## 定義
if (obj.hits>0) { ? ?##如果訪問記錄大于等于1次;
set resp.http.X-Cache = "HIT via " + server.ip; ? ?## 自定義首部 為HIT vai + IP,空格要自己加 看起來整齊一點;
} else { ? ##否則;
set resp.http.X-Cache = "MISS via " + server.ip; ? ## 自定義首部為 MISS via ;
}}
記得自己要去 varnish交互式界面同步 ;
vcl.load test2 default.vcl ?
200
VCL compiled.
vcl.use test2 ? ##生效新的配置test2
200
VCL 'test2' now active
第一次訪問 MISS?
?
第二次刷新 已經顯示HIT;
? ? ? ?
清緩存
ban(banning)為禁用緩存 使用方法一樣 ;
vim /etc/varnish/default.vcl
acl purgers { ? ##首先要定義組
"127.0.0.1"/8;
"192.168.150.160"/16;
}sub vcl_recv { ?
if (req.method == "PURGE") { ?##如果請求方法是PURGE;
if (!client.ip ~ purgers) { ?##基于上面的基礎 如果請求的IP 為定義的acl控制purgers組內的IP;
return(synth(405,"Purging not allowed for " + client.ip)); ?##返回值為405 中間加上內容 后面加上訪問者IP;
}
return(purge); ?##跳轉至PURGE;
} ?##這樣如果客戶端請求過有緩存的話使用purge方法請求一次會清空緩存;在訪問就會MISS}
?使用curl 方法指定請求方法來訪問驗證試驗結果;
[root@station103: /root]# curl -I http://192.168.150.160/index.html ? ##先請求 為HIT 代表有之前有緩存;
HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 11:35:42 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 62 52
Age: 112
Via: 1.1 varnish-v4
X-Cache: HIT via 192.168.150.160 ? ##顯示為HIT
Connection: keep-alive[root@station103: /root]# curl -X PURGE http://192.168.150.160/imdex.html<!DOCTYPE html> ? ##使用PURGE 方法請求;
<html>
<head>
<title>405 Purging not allowed for 192.168.150.160</title>
</head>
<body>
<h1>Error 405 Purging not allowed for 192.168.150.160</h1> ? ##返回值為我們設定的405 以及IP ;
<p>Purging not allowed for 192.168.150.160</p>
<h3>Guru Meditation:</h3>
<p>XID: 65584</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
[root@station103: /root]# curl -I http://192.168.150.160/index.html ? ##再次請求發現MISS;
HTTP/1.1 200 OK?
Date: Sat, 01 Jul 2017 11:38:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 65586
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS via 192.168.150.160 ?##MISS 代表緩存已清空
Connection: keep-alive
?定義多個虛擬主機;
[root@station103: varnish]# vim /etc/varnish/default.vcl
13 vcl 4.0;
14
15 import directors; ?##首先一定要調用這個模塊,否則不能定義;
16
......
22 backend web1 { ? ##定義backend主機1
23 .host ="192.168.150.161";
24 .port = "80";
25 }
26 backend web2 { ##定義backend主機2;?
27 .host ="192.168.150.152"; ?
28 .port = "80";
29 }
30 sub vcl_init { ##初始化組
31· ? ? ? ?new web = directors.round_robin(); ?##定義web為組名,directors為模塊,?round_robin為調度方法;
32 ? web.add_backend(web1); ?##添加主機1至web組,是可以加權重的,如果加權重是這樣寫(web1,2)主機名字后面逗號隔開寫上權重;
33 web.add_backend(web2); ?##添加主機2至web組;
34 }
35
36
37 sub vcl_recv {
38
39 set req.backend_hint = web.backend(); ?##調用組40 }
此時添加了一個主機 centos 3 IP為192.168.150.152
安裝httpd?
[root@localhost ~]# mkdir /var/www/html/{login,admin} -pv
[root@localhost ~]# echo centos7.3 httpd test page2 > /var/www/html/login/index.html
[root@localhost ~]# systemctl start httpd
centos 1?
[root@localhost: /root]# echo centos7.3 httpd test page1 > /var/www/html/login/index.html
因為需要測試,所以不能使用有緩存的文件,特地創建一個login目錄,(之前有設置過權限)內容不統一,方便查看測試效果。
輪詢效果實現;
?
?loading.....