溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

部署Varnish緩存搭理服務(wù)器

發(fā)布時(shí)間:2020-06-09 14:54:53 來(lái)源:網(wǎng)絡(luò) 閱讀:407 作者:筱振 欄目:系統(tǒng)運(yùn)維

博文大綱:
一、Varnish概述
1.Varnish簡(jiǎn)介
2.Varnish和squid的區(qū)別
3.Varnish的工作原理
4.Varnish架構(gòu)
5.Varnish配置
6.VCL中內(nèi)置預(yù)設(shè)變量
7.VCL的子程序
8.特定功能語(yǔ)句
9.return語(yǔ)句
10.Varnish請(qǐng)求處理的步驟
11.Varnish的優(yōu)雅模式
二、安裝Varnish
1.客戶端訪問(wèn)測(cè)試緩存
2.服務(wù)端測(cè)試清除緩存
3.配置http服務(wù)器的訪問(wèn)獲取客戶端的IP地址

一、Varnish概述

1.Varnish簡(jiǎn)介

Varnish是一款高性能且開(kāi)源的反向代理服務(wù)器和HTTP加速器,其采用全新的軟件體系機(jī)構(gòu),和現(xiàn)在的硬件體系緊密配合。與傳統(tǒng)的squid相比,Varnish具有高性能、速度快、管理更加方便等優(yōu)點(diǎn),目前很多大型的網(wǎng)站都開(kāi)始嘗試使用Varnish來(lái)代替squid,這便是Varnish迅速發(fā)展的最根本的原因。

Varnish的主要特征:

  • (1)緩存代理位置:可以使用內(nèi)存也可以使用磁盤(pán);
  • (2)日志存儲(chǔ):日志存儲(chǔ)在內(nèi)存中;
  • (3)支持虛擬內(nèi)存的使用;
  • (4)有精確的時(shí)間管理機(jī)制,即緩存的時(shí)間屬性控制;
  • (5)狀態(tài)引擎架構(gòu):在不同的引擎上完成對(duì)不同的緩存和代理數(shù)據(jù)進(jìn)行處理;
  • (6)緩存管理:以二叉堆管理緩存數(shù)據(jù),做到數(shù)據(jù)的及時(shí)清理;

2.Varnish和squid的區(qū)別

相同點(diǎn):

  • 都是一個(gè)反向代理服務(wù)器;
  • 都是開(kāi)源軟件;

Varnish的優(yōu)勢(shì):

  • (1)穩(wěn)定性:Varnish和Squid在完成相同負(fù)載的工作時(shí),Squid服務(wù)器發(fā)生故障的幾率要高于Varnish,因?yàn)槭褂肧quid需要經(jīng)常重啟;
  • (2)訪問(wèn)速度更快:Varnish所有緩存的數(shù)據(jù)都是直接從內(nèi)存中讀取,而Squid是從硬盤(pán)中讀取;
  • (3)支持更多的并發(fā)連接:因?yàn)閂arnish的TCP連接和釋放的速度比Squid快很多

Varnish的缺陷:

  • (1)Varnish進(jìn)程一旦重啟,緩存數(shù)據(jù)都會(huì)從內(nèi)存中完全釋放,此時(shí)所有請(qǐng)求都會(huì)發(fā)送到后端服務(wù)器,在高并發(fā)情況下,會(huì)給后端服務(wù)器造成很大壓力;
  • (2)在Varnish使用中如果使用單個(gè)URL的請(qǐng)求通過(guò)負(fù)載均衡時(shí),則每次請(qǐng)求都會(huì)落在不同的Varnish服務(wù)器中,造成請(qǐng)求都會(huì)到后端服務(wù)器;而且同樣的秦桂在多臺(tái)服務(wù)器上緩存,也會(huì)造成Varnish的緩存資源的浪費(fèi),造成性能下降;

Varnish缺陷的解決方案:

  • 針對(duì)缺陷(1):在訪問(wèn)量很大的情況下推薦使用Varnish的內(nèi)存緩存方式啟動(dòng),而且后面需要跟多臺(tái)Nginx服務(wù)器(作為反向代理)。主要防止Varnish服務(wù)器重啟的情況下,大量的請(qǐng)求到達(dá)后端服務(wù)器;這樣Nginx就是第二道緩存代理服務(wù)器。防止請(qǐng)求過(guò)多時(shí)給后端服務(wù)器造成較大的壓力;
  • 針對(duì)缺陷(2):可以在負(fù)載均衡上做URL哈希,讓單個(gè)URL請(qǐng)求固定到一臺(tái)Varnish服務(wù)器上;

3.Varnish的工作原理

當(dāng)Varnish服務(wù)器收到客戶端的請(qǐng)求時(shí),首選檢查緩存中是否有數(shù)據(jù),如果有,則直接響應(yīng)客戶端;如果沒(méi)有則向后端服務(wù)器請(qǐng)求相應(yīng)的資源,緩存到Varnish服務(wù)器本地,再響應(yīng)客戶端;

根據(jù)規(guī)則和請(qǐng)求頁(yè)面的類型選擇數(shù)據(jù)是否需要進(jìn)行緩存,可以根據(jù)請(qǐng)求頭中Cache-Contorl判斷是否緩存,以及cookis是否有標(biāo)記,這些功能都可以通過(guò)編寫(xiě)配置文件的方式來(lái)實(shí)現(xiàn)。

4.Varnish架構(gòu)

Varnish分為management進(jìn)程和child進(jìn)程:

  • management進(jìn)程:對(duì)child進(jìn)程進(jìn)行管理,同事對(duì)VCL配置進(jìn)行編譯,并應(yīng)用到不同的狀態(tài)引擎中;
  • child進(jìn)程:生成線程池,負(fù)責(zé)對(duì)用戶請(qǐng)求進(jìn)行處理,并通過(guò)hash查找返回用戶結(jié)果;

child進(jìn)程生成的常見(jiàn)線程有:

  • accept線程:接收新的連接請(qǐng)求并響應(yīng);
  • worker線程:會(huì)話,處理請(qǐng)求資源;
  • expiry線程:清除緩存中過(guò)期的內(nèi)容;

5.Varnish配置

Varnish主要配置部分:

  • 后端配置:給Varnish添加反向代理服務(wù)器節(jié)點(diǎn),最少配置一個(gè);
  • ACL配置:給Varnish添加訪問(wèn)控制列表,可以指定這些列表訪問(wèn)或禁止訪問(wèn);
  • probes配置:給Varnish添加探測(cè)后端服務(wù)器是否正常的規(guī)則,方便切換或禁止對(duì)應(yīng)后端服務(wù)器;
  • directors配置:給Varnish添加負(fù)載均衡模式管理多個(gè)后端服務(wù)器;
  • 核心子程序配置:給Varnish添加后端服務(wù)器切換,請(qǐng)求緩存、訪問(wèn)控制、錯(cuò)誤處理等規(guī)則;

6.VCL中內(nèi)置預(yù)設(shè)變量

如圖:
部署Varnish緩存搭理服務(wù)器

  • req:客戶端請(qǐng)求Varnish服務(wù)器時(shí)可用的變量;
  • bereq:Varnish服務(wù)器請(qǐng)求后端服務(wù)器可用的變量;
  • beresp:后端服務(wù)器響應(yīng)Varnish服務(wù)器請(qǐng)求,并返回結(jié)果時(shí),使用的變量;
  • resp:Varnish服務(wù)器響應(yīng)客戶端請(qǐng)求是使用的變量;
  • obj:高速緩存對(duì)象,緩存后端響應(yīng)請(qǐng)求內(nèi)容;
  • now:作用就是返回當(dāng)前的時(shí)間戳;

7.VCL的子程序

客戶端基本信息:

  • Client ip:返回客戶端的IP地址;
  • Client port:獲取客戶端請(qǐng)求的端口號(hào)(需調(diào)用std);
  • Client.identiy:獲取客戶端標(biāo)識(shí)碼;

服務(wù)端基本信息:

  • Server.hostname:服務(wù)器主機(jī)名;
  • Server.identiy:獲取服務(wù)器標(biāo)識(shí)碼;
  • Server.ip:獲取服務(wù)器IP地址;
  • Server.prot:獲取服務(wù)器IP端口號(hào)(需調(diào)用std模塊);

客戶端請(qǐng)求(req) :

  • Req:整個(gè)請(qǐng)求的數(shù)據(jù)結(jié)構(gòu);
  • req.bachend_hint:指定請(qǐng)求后端節(jié)點(diǎn) 如gif 給圖片服務(wù)器 (hint暗示)當(dāng)訪問(wèn)時(shí)gif時(shí) 設(shè)置客戶端的請(qǐng)求req.bachend_hint=圖片服務(wù)器地址;
  • Req.can_gzip:客戶端是否接受gzip傳輸編碼;
  • req.hash_always_miss:是否從緩存中讀取數(shù)據(jù);
  • req.hash_ignore_busy: 忽略緩存中忙碌的數(shù)據(jù);
  • req.http:對(duì)應(yīng)請(qǐng)求http的header;
  • req.method :請(qǐng)求類型或者請(qǐng)求的方式;
  • req.proto:客戶端請(qǐng)求使用的http協(xié)議的版本;
  • req.restarts:重新啟動(dòng)次數(shù),默認(rèn)最大值是4(通常用于判斷是否訪問(wèn)過(guò)服務(wù)器);
  • req.url:請(qǐng)求的url;
  • req.xid:請(qǐng)求的唯一ID號(hào);

varnish請(qǐng)求后端服務(wù)器(bereq):

  • bereq:整個(gè)后端請(qǐng)求的數(shù)據(jù)結(jié)構(gòu);
  • bereq.backend:所請(qǐng)求后端節(jié)點(diǎn)的配置;
  • bereq.between_bytes_timeout:從后端每接收一個(gè)字節(jié)之間的等待時(shí)間或者超時(shí)時(shí)間;
  • bereq.http:對(duì)應(yīng)發(fā)送到后端的http的頭部信息;
  • bereq.method: 發(fā)送到后端的請(qǐng)求類型或者請(qǐng)求方式;
  • bereq.proto:發(fā)送到后端的請(qǐng)求的http協(xié)議版本;
  • bereq.retires:相同請(qǐng)求重試計(jì)數(shù);
  • bereq.uncacheable:請(qǐng)求數(shù)據(jù)沒(méi)有被緩存,或者請(qǐng)求不緩存;
  • bereq.url:發(fā)送到后端請(qǐng)求的url;
  • bereq.xid:請(qǐng)求唯一id;

后端服務(wù)器向varnish(beresq):

  • Beresp:后端服務(wù)器響應(yīng)數(shù)據(jù);
  • Beresp.backend.ip:后端響應(yīng)(處理請(qǐng)求數(shù)據(jù))服務(wù)器的IP地址;
  • Beresp.backend.name:后端響應(yīng)服務(wù)器的節(jié)點(diǎn)名;
  • Beresp.do_gunzip:默認(rèn)為false,緩存前解壓改對(duì)象;
  • Beresp.grace:設(shè)置緩存過(guò)期的額外寬限時(shí)間;
  • Beresp.http:響應(yīng)時(shí)http的頭部;
  • Beresp.keep:對(duì)象緩存后帶保持時(shí)間;
  • Beresp.proto:響應(yīng)的http版本;
  • Beresp.reason :后端服務(wù)器返回的http狀態(tài)信息;
  • Beresp.status:后端服務(wù)器返回的在狀態(tài)碼;
  • Beresp.storage_hint:指定保存的的特定存儲(chǔ)器(內(nèi)存);
  • Beresp.ttl:改對(duì)象緩存的剩余時(shí)間,指定統(tǒng)一緩存剩余時(shí)間;
  • Beresp,uncacheable:對(duì)數(shù)據(jù)不進(jìn)行緩存;

高速緩存對(duì)象(obj):

  • obj.grace:該對(duì)象額外寬限時(shí)間;
  • obj.hits:緩存命中次數(shù),一般可以用于判斷是否有緩存;
  • obj.http:對(duì)應(yīng) HTTP 的 header;
  • obj.proto:HTTP版本;
  • obj.reason:服務(wù)器返回的 HTTP 狀態(tài);
  • obj.status:服務(wù)器返回的狀態(tài)碼;
  • obj.ttl:該對(duì)象緩存剩余時(shí)間(秒);
  • obj.uncacheable:不緩存;

返回給客戶端的響應(yīng)對(duì)象(resp):

  • resp:整個(gè)響應(yīng) 數(shù)據(jù)結(jié)構(gòu);
  • resp.http:對(duì)應(yīng) HTTP 的 header;
  • resp.proto:編輯響應(yīng)的 HTTP 協(xié)議版本;
  • resp.reason:將要返回的 HTTP 狀態(tài)信息;
  • resq.status:將要返回的 HTTP 狀態(tài);

8.特定功能語(yǔ)句

  • Ban(expression):清除指定對(duì)象緩存;
  • Call(subroutine):調(diào)用子程序;
  • Hash_data(input):根據(jù)input的子程序的值生成hash鍵;
  • New():創(chuàng)建新的vcl對(duì)象,只能在vcl_init 子進(jìn)程中;
  • Return():結(jié)束當(dāng)前子程序,并指定繼續(xù)下一步動(dòng)作;
  • Rollback():恢復(fù) HTTP 頭到原來(lái)狀態(tài),已經(jīng)棄用,使用 std.rollback() 代替;
  • Synthetic (STRING):合成器,定義返回給客戶端頁(yè)面和狀態(tài)碼;
  • Regsub(str,regex,sub)使用正則表達(dá)式替換第一次出現(xiàn)的字符串;
  • Regsuball(str,regex,sub)替換所有出現(xiàn)的字符串;

9.return語(yǔ)句

return 語(yǔ)句是終止子程序并返回動(dòng)作,所有動(dòng)作都根據(jù)不同的 vcl 子程序限定來(lái)選用的。

語(yǔ)法:return (action);

常用的選項(xiàng):

  • abandon:放棄處理,并生成一個(gè)錯(cuò)誤;
  • deliver:交付處理;
  • fetch:從后端取出響應(yīng)對(duì)象;
  • hash:哈希緩存處理;
  • lookup:查找緩存;
  • ok:繼續(xù)執(zhí)行;
  • pass:進(jìn)入 pass 非緩存模式;
  • pipe:進(jìn)入 pipe 非緩存模式;
  • purge:清除緩存對(duì)象,構(gòu)建響應(yīng);
  • restart:重新開(kāi)始retry 重試后端處理;
  • synth(status code,reason):合成返回客戶端狀態(tài);

10.Varnish請(qǐng)求處理的步驟

如圖:
部署Varnish緩存搭理服務(wù)器

VCL處理過(guò)程大致分為如下幾個(gè)步驟:
(1)Receive 狀態(tài),也就是請(qǐng)求處理的入口狀態(tài),根據(jù) VCL 規(guī)則判斷該請(qǐng)求應(yīng)該是 Pass 或Pipe,或者進(jìn)入 Lookup(本地查詢);
(2)Lookup 狀態(tài),進(jìn)入此狀態(tài)后,會(huì)在 hash 表中查找數(shù)據(jù),若找到,則進(jìn)入 Hit 狀態(tài),否則進(jìn)入 miss 狀態(tài);
(3)Pass 狀態(tài),在此狀態(tài)下,會(huì)進(jìn)入后端請(qǐng)求,即進(jìn)入 fetch 狀態(tài);
(4)Fetch 狀態(tài),在 Fetch 狀態(tài)下,對(duì)請(qǐng)求進(jìn)行后端的獲取,發(fā)送請(qǐng)求,獲得數(shù)據(jù),并進(jìn)行本地存儲(chǔ);
(5)Deliver 狀態(tài), 將獲取到的數(shù)據(jù)發(fā)送給客戶端,然后完成本次請(qǐng)求;

11.Varnish的優(yōu)雅模式

當(dāng)幾個(gè)客戶端請(qǐng)求同一個(gè)頁(yè)面的時(shí)候,varnish 只發(fā)送一個(gè)請(qǐng)求到后端服務(wù)器,然后讓其他幾個(gè)請(qǐng)求掛起并等待返回結(jié)果;獲得結(jié)果后,其它請(qǐng)求再?gòu)?fù)制后端的結(jié)果發(fā)送給客戶端;但如果同時(shí)有數(shù)以千計(jì)的請(qǐng)求,那么這個(gè)等待隊(duì)列將變得龐大,這將導(dǎo)致 2 類潛在問(wèn)題:驚群?jiǎn)栴}(thundering herd problem),即突然釋放大量的線程去復(fù)制后端返回的結(jié)果,將導(dǎo)致負(fù)載急速上升;沒(méi)有用戶喜歡等待;

故為了解決這類問(wèn)題,可以配置 varnish 在緩存對(duì)象因超時(shí)失效后再保留一段時(shí)間,以給那些等待的請(qǐng)求返回過(guò)去的文件內(nèi)容(stale content),配置案例如下:

sub vcl_recv {
 if (! req.backend.healthy) {   #判斷后端服務(wù)器的健康狀態(tài)
 set req.grace = 5m;    #如果后端服務(wù)器不健康,客戶端額外緩存15分鐘
}else {
 set req.grace = 15s; }  #正常額外緩存時(shí)間15秒
}
sub vcl_fetch { 
set beresp.grace = 30m;  #定義緩存過(guò)期后額外緩存時(shí)間30分鐘
}

二、安裝Varnish

獲取Varnish軟件包

[root@localhost ~]# yum -y install autoconf automake libedit-devel libtool ncurses-devel pcre-devel  pkgconfig python-docutils python-sphinx
//安裝Varnish所需依賴
[root@localhost ~]# tar zxf varnish-4.0.3.tar.gz  -C /usr/src
[root@localhost ~]# cd /usr/src/varnish-4.0.3/
[root@localhost varnish-4.0.3]# ./configure && make && make install              //編譯安裝Varnish
[root@localhost ~]# cp /usr/src/varnish-4.0.3/etc/example.vcl /usr/local/var/varnish/
//復(fù)制Varnish主配置文件
[root@localhost ~]# vim /usr/local/var/varnish/example.vcl             //編譯Varnish主配置文件
#
# This is an example VCL file for Varnish.
#
# It does not do anything by default, delegating control to the
# builtin VCL. The builtin VCL is called when there is no explicit
# return statement.
#
# See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
# and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.

# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;
import directors;
import std;
# Default backend definition. Set this to point to your content server.
probe backend_healthcheck {
        .url="/"; #訪問(wèn)后端服務(wù)器根路徑
        .interval = 5s;   #請(qǐng)求時(shí)間間隔
        .timeout = 1s;   #請(qǐng)求超時(shí)時(shí)間
        .window = 5;    #指定輪詢次數(shù)5次
        .threshold = 3;   #如果出現(xiàn)3次失敗則表示后端服務(wù)器異常
}
backend web1 {    #定義后端服務(wù)器
        .host = "192.168.1.7";  #要轉(zhuǎn)向主機(jī)(即后端主機(jī))的 IP 或域名
        .port = "80";  #指定后端服務(wù)器的端口號(hào)
        .probe = backend_healthcheck;  #健康檢查調(diào)用backend_healthcheck定義的內(nèi)容
}
backend web2 {
        .host = "192.168.1.8";
        .port = "80";
        .probe = backend_healthcheck;
}
acl purgers { #定義訪問(wèn)控制列表
        "127.0.0.1";
        "localhost";
        "192.168.1.0/24";
        !"192.168.1.8";
}
sub vcl_init  {     #調(diào)用 vcl_init 初始化子程序創(chuàng)建后端主機(jī)組,即 directors
        new  web_cluster=directors.round_robin(); #使用 new 關(guān)鍵字創(chuàng)建 drector 對(duì)象,使用 round_robin(輪詢) 算法
        web_cluster.add_backend(web1);   #添加后端服務(wù)器節(jié)點(diǎn)
        web_cluster.add_backend(web2);
}
sub vcl_recv {
        set req.backend_hint = web_cluster.backend(); #指定請(qǐng)求的后端節(jié)點(diǎn)web_cluster定義的后端節(jié)點(diǎn)
        if (req.method == "PURGE") {   #判斷客戶端的請(qǐng)求頭部是否是PURGE
                if (!client.ip ~ purgers) {   #如果是,再判斷客戶端的IP地址是不是在ACL訪問(wèn)控制列表中.
                        return (synth(405, "Not Allowed."));  #如果不是,返回給客戶端405狀態(tài)碼并且返回定義的頁(yè)面.
        }
        return (purge);   #如果是ACL定義的,則交給purge處理.
}
if (req.method != "GET" &&
        req.method != "HEAD" &&
        req.method != "PUT" &&
        req.method != "POST" &&
        req.method != "TRACE" &&
        req.method != "OPTIONS" &&
        req.method != "PATCH" &&
        req.method != "DELETE") {      #判斷客戶端的請(qǐng)求類型
                return (pipe);
        }
if (req.method != "GET" && req.method != "HEAD") {
        return (pass);      #如果不是GET及HEAD則交給pass.
}
if (req.url ~ "\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)") {
        return (pass);   #當(dāng)客戶端訪問(wèn)的是.php等結(jié)尾的交給pass處理.
}
if (req.http.Accept-Encoding) {
        if  (req.url  ~ "\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$") {
        unset req.http.Accept-Encoding;   #取消客戶端接收的壓縮類型
        } elseif (req.http.Accept-Encoding ~ "gzip") {
                set req.http.Accept-Encoding = "gzip";  #如果有g(shù)zip類型,標(biāo)記gzip類型.
        } elseif (req.http.Accept-Encoding ~ "deflate") {
                set req.http.Accept-Encoding = "deflate";
        } else {
        unset req.http.Accept-Encoding;  #其他未定義的頁(yè)面也取消客戶但接收的壓縮類型.
        }
     }
if  (req.url  ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
        unset req.http.cookie;  #取消客戶端的cookie值.
        return (hash);    #將請(qǐng)求轉(zhuǎn)發(fā)給hash子程序,也就是查看本地緩存.
}
if (req.restarts == 0) {  #判斷客戶端是不是第一次請(qǐng)求
        if (req.http.X-Forwarded-For) {     #如果是第一次請(qǐng)求,設(shè)置獲取客戶端的IP地址.
                set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
        } else {
       set req.http.X-Forwarded-For = client.ip;
        }
}
return (hash);
}
sub vcl_hash {
        hash_data(req.url);   #查看客戶端請(qǐng)求的頁(yè)面,并且進(jìn)行hash
        if (req.http.host) {
                hash_data(req.http.host);  #設(shè)置客戶端的主機(jī)
        } else {
                hash_data(server.ip);    #設(shè)置服務(wù)器的IP
        }
        return (lookup);
}
sub vcl_hit {
        if (req.method == "PURGE") {   #如果是HIT并且當(dāng)客戶端請(qǐng)求的類型是PURGE返回的200的狀態(tài)碼,并返回相應(yīng)頁(yè)面.
                return (synth(200, "Purged."));
        }
        return (deliver);
}
sub vcl_miss {
    if (req.method == "PURGE") {
                return (synth(404, "Purged."));   #如果是miss返回404
        }
        return (fetch);
}
sub vcl_deliver {
        if (obj.hits > 0) {
                set resp.http.CXK = "HIT-from-varnish"; #設(shè)置http頭部X-Cache =hit
                set resp.http.X-Cache-Hits = obj.hits;  #返回命令的次數(shù)
        } else {
        set resp.http.X-Cache = "MISS";
        }
        unset resp.http.X-Powered-By;  #取消顯示web版本
        unset resp.http.Server;    #取消顯示varnish服務(wù)
        unset resp.http.X-Drupal-Cache;   #取消顯示緩存的框架
        unset resp.http.Via;    #取消顯示文件內(nèi)容來(lái)源
        unset resp.http.Link;  #取消顯示HTML的超鏈接地址
        unset resp.http.X-Varnish;  #取消顯示varnish的id
        set resp.http.xx_restarts_count = req.restarts;   #設(shè)置客戶端請(qǐng)求的次數(shù)
        set resp.http.xx_Age = resp.http.Age;   #顯示緩存文件的時(shí)長(zhǎng)
        #set resp.http.hit_count = obj.hits;   #顯示緩存命中的次數(shù)
        #unset resp.http.Age;
        return (deliver);
}
sub vcl_pass {
        return (fetch);   #將后端服務(wù)器返回的數(shù)據(jù)緩存到本地
}
sub vcl_backend_response {
        set beresp.grace = 5m;   #緩存額外寬限時(shí)間
        if (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
                set beresp.uncacheable = true;   #當(dāng)后端服務(wù)器相應(yīng)狀態(tài)碼是449等,不緩存
        }
        if (bereq.url ~ "\.(php|jsp)(\?|$)") {
                set beresp.uncacheable = true;  #當(dāng)是PHP的頁(yè)面不緩存
        } else {
                if (bereq.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico)($|\?)") {
                set beresp.ttl = 15m;  #當(dāng)是上面結(jié)尾的,緩存15分鐘
                unset beresp.http.Set-Cookie;
                } elseif (bereq.url ~ "\.(gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
                        set beresp.ttl = 30m; #緩存30分鐘
                        unset beresp.http.Set-Cookie;
                } else {
                        set beresp.ttl = 10m;  #生存時(shí)間10分鐘
                        unset beresp.http.Set-Cookie;
                }
        }
        return (deliver);
}
sub vcl_purge {
        return (synth(200,"success"));
}
sub vcl_backend_error {
        if (beresp.status == 500 ||
                beresp.status == 501 ||
                beresp.status == 502 ||
                beresp.status == 503 ||
                beresp.status == 504) {
                return (retry);  #如果狀態(tài)碼是上述其中之一,則重新請(qǐng)求
        }
}
sub vcl_fini {
        return (ok);
}
[root@localhost ~]# varnishd -f /usr/local/var/varnish/example.vcl -s malloc,200M -a 0.0.0.0:80
//啟動(dòng)varnish服務(wù)
//-f指定配置文件存放位置;-s指定啟動(dòng)時(shí)使用的內(nèi)存大??;-a指定監(jiān)聽(tīng)的地址與端口
[root@localhost ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10508/varnishd  
//確定80端口已經(jīng)在監(jiān)聽(tīng)

自行搭建兩臺(tái)http服務(wù)器(訪問(wèn)頁(yè)面建議不要一樣)!

1.客戶端訪問(wèn)測(cè)試緩存

首次訪問(wèn):
部署Varnish緩存搭理服務(wù)器
按F5刷新后的結(jié)果:
部署Varnish緩存搭理服務(wù)器

2.服務(wù)端測(cè)試清除緩存

注意:測(cè)試時(shí)清除緩存!

web服務(wù)器(192.168.1.7)

[root@localhost ~]# curl -X "PURGE" 192.168.1.6
//指定192.168.1.6的緩存服務(wù)器,清除緩存

測(cè)試訪問(wèn)如下:
部署Varnish緩存搭理服務(wù)器

web服務(wù)器(192.168.1.8)

[root@localhost ~]# curl -X "PURGE" 192.168.1.6
//指定192.168.1.6的緩存服務(wù)器,清除緩存

測(cè)試訪問(wèn)如下:
部署Varnish緩存搭理服務(wù)器

測(cè)試完成!

3.配置http服務(wù)器的訪問(wèn)獲取客戶端的IP地址

如果不配置的情況下,http服務(wù)器只會(huì)記錄Varnish服務(wù)器的IP地址,上面Varnish配置文件中已經(jīng)配置完成。那么httpd的配置如下:

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf               //修改http主配置文件
196     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
197     LogFormat "%h %l %u %t \"%r\" %>s %b" common
//添加以下內(nèi)容,使http服務(wù)可以截取到客戶端的IP地址
198     LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-    Agent}i\"" combined
//X-Forwarded-For參數(shù)已經(jīng)在Varnish配置文件中定義
[root@localhost ~]# systemctl restart httpd                //重新啟動(dòng)http服務(wù)

兩臺(tái)http服務(wù)器都需配置(防止時(shí)間過(guò)長(zhǎng)切換到另一臺(tái)服務(wù)器)。

注意:測(cè)試時(shí)清除緩存!

客戶端依然訪問(wèn)Varnish服務(wù)器,http訪問(wèn)日志如下:
部署Varnish緩存搭理服務(wù)器

測(cè)試完成!?。?/p>

——————————————本文到此為止,感謝觀看————————————

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI