varnish基礎

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:文件存儲,重啟有效,但是實驗階段不穩定不建議使用。

內置變量機制:

req.*:request,表示由客戶端發來的請求報文相關;
bereq.*:由varnish發往BE(后端主機)的httpd請求相關;
bereq.http.HEADERS
bereq.request:請求方法;
bereq.url:請求的url;
bereq.proto:請求的協議版本;
bereq.backend:指明要調用的后端主機;
req.http.Cookie:客戶端的請求報文中Cookie首部的值;?
req.http.User-Agent ~ "chrome"
beresp.*:由BE主機響應給varnish的響應報文相關;
resp.*:由varnish響應給client相關;
beresp.*, resp.*:
beresp.http.HEADERS
beresp.status:響應的狀態碼;
reresp.proto:協議版本;
beresp.backend.name:BE主機的主機名;
beresp.ttl:BE主機響應的內容的余下的可緩存時長;
obj.*:存儲在緩存空間中的緩存對象的屬性;只讀;
obj.hits:此對象從緩存中命中的次數;
obj.ttl:對象的緩存時長
obj.grace :緩存時長寬限期
下面圖為變量應用的位置以及是否可執行讀或寫;

?


使用兩個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 test1

vcl.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.....

轉載于:https://www.cnblogs.com/MYue/p/7102052.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

引入Spring集成

在本文中&#xff0c;我們介紹Spring Integration 。 如果您以前沒有使用過Spring Integration&#xff0c;那么可能會幫助您復習Gregor Hohpe的Enterprise Integration Patterns 。 我還將推薦Josh Long 撰寫的這篇出色的介紹性文章 。 上下文設置 簡而言之&#xff0c; 企業…

PAT 1024. 科學計數法 (20)

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有1位&#xff0c;小數部分至少有1位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科…

Mac上Hive環境搭建

本文介紹在Mac上搭建Hive環境。 建議首先配置好Hadoop&#xff0c;搭建與配置可以參考我之前的博文Mac Hadoop的安裝與配置。 當然你也可以選擇使用Docker搭建環境&#xff0c;本文不作介紹。 安裝 對于MacOs&#xff0c;推薦使用HomeBrew安裝hive&#xff0c;一步到位。 $ bre…

mysql+創建備份賬戶_mysql 添加用戶,授予權限,數據庫備份等 (轉載)

一&#xff0c;連接MySQL格式&#xff1a;mysql -h 遠程主機地址 -u 用戶名 -p 回車輸入密碼進入&#xff1a;mysql -u root -p 回車Enter password: ,輸入密碼就可以進入mysql> 進入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理與授權1.修改密碼&#xff1a;格式…

分代緩存和轉換

康拉德&#xff08;Konrad&#xff09;最近在我們公司的技術室中分享了有關如何完成緩存的有趣文章&#xff0c;這是一個大型的波蘭社交網絡nk.pl。 算法中的核心概念之一是分代緩存 &#xff08;請參閱此處或此處 &#xff09;。 基本思想是&#xff0c;對于緩存鍵&#xff0c…

css精靈

○ css 精靈&#xff08;Sprites&#xff09;技術利用photoshop將圖片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技術&#xff0c;對圖片進行精確定位。 ○ 優點&#xff1a;減少http請求數量&#xff0c;減少服務…

基于Jenkins+Gitlab的自動化部署實戰

故事背景 一個中小型企業&#xff0c;是典型的互聯網公司&#xff0c;當初期的時候可能運維只能標配到2~3人&#xff0c;此時隨著公司的發展&#xff0c;項目會逐漸增多。前期部署項目可能都是手動的&#xff0c; 俗稱“人肉部署”&#xff0c;這簡直是無比的痛苦&#xff0c;不…

cmd如何刷新MySQL數據庫_怎樣在cmd中用命令操作MySQL數據庫 需要技巧

用命令來操作MySQL是工作必備的&#xff0c;今天我就來分享一下cmd命令操作MySQL數據庫的方法&#xff0c;希望有幫助。工具/材料電腦xampp操作方法01首先&#xff0c;啟動MySQL服務才行哦。這里我是用xampp集成的數據庫&#xff0c;方便&#xff0c;點擊‘start’。02如圖&…

Java順序IO性能

許多應用程序將一系列事件記錄到基于文件的存儲中&#xff0c;以供以后使用。 從日志記錄和審核&#xff0c;直到在事件源設計或其緊密相關的CQRS中保留事務重做日志&#xff0c;這都可以是任何東西。 Java具有多種方法&#xff0c;可以通過這些方法將文件順序寫入或重新讀取。…

text段,data段,bss段,堆和棧

.bss段和.data段的區別 text段,data段,bss段,堆和棧轉載于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]數表

[BZOJ3529][Sdoi2014]數表 試題描述 有一張Nm的數表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的數值為能同時整除i和j的所有自然數之和。給定a&#xff0c;計算數表中不大于a的數之和。輸入 輸入包含多組數據。輸入的第一行…

ZK的實際應用:MVVM –表單綁定

這是我們從頭開始構建ZK應用程序的第二集。 上一篇文章涉及使用MVVM將數據加載和呈現到表中。 在本文中&#xff0c;我們將向您介紹ZK MVVM的表單綁定。 目的 我們將構建一個“添加”功能&#xff0c;使我們能夠將新條目保存到清單中。 單擊“添加”時出現表格 單擊“保存”…

群暉按裝mysql_如何連接群暉里的MYSQL數據庫

匿名用戶1級2018-08-27 回答一、連接遠程數據庫&#xff1a;1、顯示密碼如&#xff1a;MySQL 連接遠程數據庫(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用戶名為“root”&#xff0c;密碼“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隱藏密…

ZK的實際應用:MVVM –以編程方式更新視圖

在前兩篇文章中&#xff0c;我們使用ZK的MVVM功能來&#xff1a; 將數據加載到表中 使用表單綁定保存數據 我們已經看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;裝飾方法時&#xff0c;在執行完成后&#xff0c;將向Binder通知VM屬性的更改&#xff0c;以便B…

給你一個笑臉

今日冬至&#xff0c;愿你笑靨如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安裝與配置的截圖_windows下MySQL5.6版本安裝及配置過程附有截圖和詳細說明...

隨著MYSQL版本的更新以及電腦系統的變化&#xff0c;我們給大家整理了各種電腦環境下安裝MYSQL的圖解過程&#xff0c;希望我們整理的內容能夠幫助到大家&#xff1a;mysql安裝圖解總結https://www.jb51.net/article/142398.htm編輯者&#xff1a;Vocabulary下面詳細介紹5.6版本…

mysql 更新日的數據類型_[每日更新-MySQL基礎]5.常用的數據類型-整數和字符串

1. 數據類型在學習PHP的時候我們已經講過數據類型了&#xff0c;所謂數據類型就是數據的格式。每一種數據類型在計算機中存儲的方式會有差異&#xff0c;占用的存儲容量也有區別&#xff0c;所以選擇合適的數據類型可以節約我們的存儲成本&#xff0c;也方便我們的程序運行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我對Martin Fowler的這篇文章對Spring進行了介紹。從那時起&#xff0c;我就修改了許多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。雖然我很喜歡與IoC一起工作&#xff0c;但我必須說Spring在過去的5年中&am…

ansible 安裝

1、簡介 ansible是新出現的自動化運維工具&#xff0c;基于Python開發&#xff0c;集合了眾多運維工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的優點&#xff0c;實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基于模塊工作的&#…

JS原型詳解

參考的別人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型對象&#xff0c;簡稱原型。不僅構造函數有&#xff0c;普通函數也有* 普通函數&#xff1a;javascript function puTong(){ }; alert(puTong.proto…