varnish學習總結

什么是web cache?

  Web緩存是指一個Web資源(如html頁面,圖片,js,數據等)存在與Web服務器和客戶端(瀏覽器)直接的副本。緩存會根據進來的請求保存輸出內容的副本;當下一個請求到來的時候,如果是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求還是向源服務器再次發送請求。         —–摘自Alloy Team

緩存命中率類型:

  文檔命中率:按文檔數量進行衡量

  字節命中率:按命中的字節數量進行衡量

緩存處理流程:

        1.png

接受請求:接受來自client的訪問請求

解析請求:提取client訪問請求的URL中的頭部信息

查詢緩存:根據提取的頭部信息查詢緩存數據是否含有客戶端訪問的請求數據

新鮮度監測:如果緩存數據中含有客戶端訪問的數據,則檢查數據的有效性

創建響應報文:當確定緩存命中的數據有效,則創建響應報文

發送響應報文:當響應報文構建完成之后,發送響應報文給客戶端

記錄日志:發送響應報文的同時記錄日志信息

新鮮度監測的方法:

 1、過期日期或有效性:

   HTTP/1.0:使用Expries定義緩存過期的絕對時間

   例如:Expires:Sat, 18 Jul 2015 03:41:04 GMT 

   HTTP/1.1: 利用Cache-Control定義文檔的最大使用期限,是相對時長

     例如:Cache-Control: max-age 1d: 緩存有效期為1天 

 2、服務器再驗證:向服務器驗證數據是否發送改變

   1)如果原始內容沒有改變,則服務器僅響應首部,不附帶body部分,響應碼為304;

   2)如果原始內容發生改變,則正常響應,響應碼為200;

   3)若果原始內容已不存在,則響應碼為404,此時緩存也應該清除緩存項;

 3、條件式請求首部:

   If-Modified-Since: 從指定時間之后的時間內,原始內容是否發生啦的改變

   If-None-Match: 每個版本的文檔都有一個標簽ETag,當內容發生改變此ETag也會發送更改

控制緩存能力:

 服務器端:Cache-Control

  no-store: 不準緩存;

  no-cache: 可以緩存,但在提供給請求者之前必須做新鮮度監測;

  must-revalidate:可以緩存,但在提供給請求者之前必須做新鮮度監測;

  max-age: 最大使用期限

  Expires:過期的絕對時間

客戶端新鮮度限制:Cache-Control

 max-stale: 最大失效時間

 max-stale=<s>:指定最大失效時間

 min-fresh=<s>:最短有效時間

 max-age=<s>:最大有效時間

注意:含有private、authentication、cookie等信息最好不要緩存;

varnish介紹:

  varnish以一款開源的、高性能的http反向代理的緩存軟件;

 varnishi有兩類線程:

  management:

   1)讀入配置文件

   2)調用合適類型的存儲(有malloc內存、tmp、persisten三種存儲類型)

   3)創建/讀入相應大小的緩存文件

   4)初始化管理結構體空間

   5)fork并監控child進程

 child/cache:

   1)將打開的存儲文件映射進內存空間

   2)創建并初始化空閑的結構體空間

varnish有九個狀態引擎,如下圖所示:

2.png

varnish配置文件介紹: 

 1)后端節點定義:

  backend name {   } ;

 代理緩存:子進程定義

 sub+狀態引擎 {  };

  引擎之間都有相關性,前一個引擎通過return(x)定義退出狀態,進而決定繼續處理下一個引擎;

 2)vcl:

  vcl是基于“域”的簡單編程語言;支持算術運算和邏輯運算,支持正則表達式,支持使用set、unset自定義變量或取消變量,支持if條件判斷,有內置的函數和變量;

 配置語法:

  ①注釋://單行注釋,/*…..*/多行注釋

  ②sub $name 定義函數

  ③不支持循環

  ④支持終止語句return,沒有返回值

  ⑤域專用

  ⑥操作符:=(賦值)、==(比較)、~(正則)、!(取反)、&&(和)、||(或者)

 3)vcl的內置函數

  regsub(str,regexp,sub):以regexp為模式匹配str,將匹配到的第一個替換為sub

  regsuball(str,regexp,sub):以regexp為模式匹配str,將所有匹配到的都替換為sub

  hash_date(str):做hash計算

  purge:從緩存中挑出某對象并刪除

  return(x): 定義退出狀態

 

 4)內置變量: 

req內置變量 resp的內置變量 bereq內置變量:

req.request: 請求方法

req.url: 請求的url

req.http.HEARDER: 請求的具體首部

req.restarts: 請求報文重啟次數

server.ip: varnish服務器的ip地址

server.port: varnish服務器的端口

clinet.ip: 客戶端ip

server.hostname: varnishi服務器名稱

req.backend: 請求時交由具體后端服務器

resp.proto: 響應版本協議

resp.status: 響應碼

resp.http.HEARDER:響應首部

bereq.url: 請求的url

bereq.request: 請求方法

bereq.http.HEADER: 請求的首部

bereq.connect_timeout: 連接超時時長

bereq.proto:向后端發起請求時使用的協議

beresp內置變量 obj內置變量: 相關說明:

beresp.status: 后端響應碼

beresp.http.HEADER: 響應首部

beresp.ttl: 響應ttl值,緩存時長

beresp.backend.ip: 后端主機ip 

beresp.backend.port: 后端端口

beresp.backend.name: 后端主機名

obj.status: 緩存對象響應碼

obj.ttl: 緩存時長

obj.hits: 緩存是否命中

obj.http.HEARDER: 命中狀態首部

req: 是客戶端發起的request

resp:是varnishi響應的response

bereq:是varnish向后端服務器發起請求

beresp:是后端服務器響應給varnish

obj:是緩存對象即將進入緩存

 

varnish配置:

 1)安裝

[root@varnish ~]# yum -y install varnish

 2)配置varnish服務配置文件

[root@varnish ~]# vim /etc/sysconfig/varnish 
# Configuration file for varnish

NFILES=131072 \\定義可以打開的最大文件數量

MEMLOCK=82000 \\定義log信息使用多大的內存空間,注意varnish log信息保存在內存中
 
NPROCS="unlimited"  \\ 每個線程響應多少請求

# DAEMON_COREFILE_LIMIT="unlimited" \\ 保持默認即可

RELOAD_VCL=1 \\保持默認即可

# This file contains 4 alternatives, please use only one. \\有四種配置方法:

## Alternative 1, Minimal configuration, no VCL \\方法一
#
# Listen on port 6081, administration on localhost:6082, and forward to
# content server on localhost:8080.  Use a fixed-size cache file.
#
#DAEMON_OPTS="-a :6081 \
#             -T localhost:6082 \
#             -b localhost:8080 \
#             -u varnish -g varnish \
#             -s file,/var/lib/varnish/varnish_storage.bin,1G"


## Alternative 2, Configuration with VCL \\方法二
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a
# fixed-size cache file.
#
#DAEMON_OPTS="-a :6081 \
#             -T localhost:6082 \
#             -f /etc/varnish/default.vcl \
#             -u varnish -g varnish \
#             -S /etc/varnish/secret \
#             -s file,/var/lib/varnish/varnish_storage.bin,1G"


## Alternative 3, Advanced configuration  \\方法三
#
# See varnishd(1) for more information.
#
# # Main configuration file. You probably want to change it :)
VARNISH_VCL_CONF=/etc/varnish/test.vcl  \\定義主配置文件
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80  \\定義監聽端口,默認為6081
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1    \\管理varnish監聽地址
VARNISH_ADMIN_LISTEN_PORT=6082   \\管理varnish的監聽端口
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret \\varnish加密文件
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=50  \\varnish最小進程數
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000 \\varnish最大進程數
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120 \\varnish工作進程超時時長
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin \\緩存文件存儲類型,可以定義使用內存存儲
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1G  \\定義存儲空間大小
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" \\定義存儲屬性
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120 \\緩存時長
#
# # DAEMON_OPTS is used by the init script.  If you add or remove options, make
# # sure you update this section, too.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"
#

## Alternative 4, Do It Yourself. See varnishd(1) for more information. \\方法四
#
# DAEMON_OPTS="

 3)配置varnish主配置文件,添加響應報文首部

[root@varnish sysconfig]# cd /etc/varnish/
[root@varnish varnish]# cp default.vcl test.vcl
[root@varnish varnish]# vim test.vcl 
backend default {  \\定義后端主
  .host = "172.16.2.14";  \\后端主機地址
  .port = "80"; \\后端主機監聽端口
}
sub vcl_deliver {   \\在vcl_deliver狀態引擎中定義
     if (obj.hits > 0) {    \\如果緩存命中次數大于0
       set resp.http.X-Cache = "HIT";  \\添加響應首部X-Cache;設置值為HIT;
     } else {
       set resp.http.X-Cache = "MISS"; \\ 添加響應首部X-Cache;設置值為MISS;
     }
     return (deliver); \\定義返回狀態
}

 應用此配置:

[root@varnish ~]# /etc/init.d/varnish start
root@varnish ~]# varnishadm -S /etc/varnish/secret  -T 127.0.0.1:6082 \\進入varnish管理界面
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-3.0.7 revision f544cd8

Type 'help' for command list.
Type 'quit' to close CLI session.

varnish> vcl.load t1 /etc/varnish/test.vcl  \\載入配置文件
200        
VCL compiled.
varnish> vcl.use t1  \\使用配置文件
200

測試1: 

3.png

測試2:

 4.png

 4)設置緩存時長:

sub vcl_fetch {   \\在vcl.fetch狀態引擎定義
  if (bereq.http.Set-Cookie) {   \\如果varnish請求有cookie信息
     unset bereq.http.Set-Cookie;  \\將cookie信息去掉
     set beresp.ttl= 120s;  \\設置緩存時長為120s
  }
  return (deliver); \\定義返回狀態
}

 應用此配置:

arnish> vcl.load t2 /etc/varnish/test.vcl
200        
VCL compiled.
varnish> vcl.use t2
200

 訪問測試:

 5.png

 6.png

5)利用varnish自帶著函數(purge)清空緩存

定義訪問權限:
 acl clean {   \\定義acl名稱
  "127.0.0.1";  \\允許訪問地址
  "172.16.2.0"/24; \\允許訪問的網段,注意網絡長度寫在引號外面;
}

sub vcl_recv {  \\在vcl_recv狀態引擎定義請求信息
  if (req.request == "PURGE") {  \\如果請求方式為"PURGE"
    if (!client.ip ~ clean) {    \\如果clinet端地址不是來自定義的合法(clean)ip
      error 405 "Not allowed"; \\返回錯誤信息,告知不能訪問
    }
  return (lookup); \\定義返回狀態;
  }
}
sub vcl_hit {    \\在vcl_hit狀態引擎中定義策略
   if (req.request == "PURGE") {  \\如果緩存命中且請求方法為"PURGE"
    purge;   \\執行內置函數purge
    error 200 "Purged"; \\返回信息
   }
}
sub vcl_miss {  \\在vcl_miss中定義策略
  if (req.request == "PURGE") {  \\如果請求方法"PURGE"沒有命中
   error 200 "no cache"; \\則返回沒有緩存
  }
}

 應用此配置文件:

varnish> vcl.load t3 /etc/varnish/test.vcl
200        
VCL compiled.
varnish> vcl.use t3
200

 測試:

正常訪問測試:
 [root@varnish varnish]# curl -I http://172.16.2.12
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 02 Jul 2015 10:21:42 GMT
ETag: "23fd60-16-519e1ce44df0b"
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Accept-Ranges: bytes
Date: Thu, 02 Jul 2015 12:20:52 GMT
X-Varnish: 2144388607 2144388575
Age: 22
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT


利用PURGE方式訪問:
[root@varnish varnish]# curl -I -X PURGE  http://172.16.2.12
HTTP/1.1 200 Purged  \\返回成功信息
Server: Varnish 
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 380
Accept-Ranges: bytes
Date: Thu, 02 Jul 2015 12:21:31 GMT
X-Varnish: 2144388608
Age: 0  \\保存時長為0
Via: 1.1 varnish
Connection: close
X-Cache: MISS  \\訪問沒有被緩存命中

相關連接:

https://fr.wikipedia.org/wiki/Cache-Control

https://www.varnish-cache.org/docs/3.0/

原創文章,作者:馬行空,如若轉載,請注明出處:http://www.www58058.com/6200

(1)
馬行空馬行空
上一篇 2015-07-14
下一篇 2015-07-15

相關推薦

  • 關于大型網站技術演進的思考(一):存儲的瓶頸(1)

    原文出處: 夏天的森林  前不久公司請來了位互聯網界的技術大牛跟我們做了一次大型網站架構的培訓,兩天12個小時信息量非常大,知識的廣度和難度也非常大,培訓完后我很難完整理出全部聽到的知識,今天我換了個思路是回味這次培訓,這個思路就是通過本人目前的經驗和技術水平來思考下大型網站技術演進的過程。 首先我們要思考一個問題,什么樣的網站才是大型網…

    Linux干貨 2015-02-26
  • Linux 基礎知識(六.一)

    一、模式及模式間的切換 (一)模式介紹 1、vim文本編輯器提供了三種基本模式,分別是編輯模式(命令模式)、輸入模式以及末行模式(命令行模式) (二)模式間的切換 二、基礎操作 (一)單文件的打開與關閉 1、單文件的打開:vim [options]… /path/to/somefile 2、單文件打開時的常用選項: (1)+#:表示當文件打開時,…

    Linux干貨 2016-11-14
  • linux文件系統

      ?文件系統: linux區分大小寫: ? ? ? ? ? ? ? ? ? ?標準的linux文件系統xfs ext(如ext4),嚴格區分大小寫,例:MAIL,Mail,mail;而windows是不那么敏感的。 這是因為文件系統的格式不同。比如:U盤的Fat32在linux中是vfat文件系統就可不區分大小寫 不同文件系統,下面顯示一個隱藏文…

    Linux干貨 2017-11-19
  • yum的簡單配置與使用

    yum 的基本配置與使用 1、yum:是rpm包管理器的前端工具,它是基于C/S結構,就客戶端服務器模式 2、yum使用前需先配置好服務端的倉庫(yum源) 3、yum客戶端是通過文件傳輸協議來獲取到yum源上的軟件包的,yum一共支持四種傳輸協議 http:// https:// ftp:// file:// (這是一個本地路徑,當yum源為本地光盤時,使…

    Linux干貨 2017-06-11
  • 第七周作業

    1、創建一個10G分區,并格式為ext4文件系統; (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; ]#mke2fs -t ext4 -b 2048 -L MYDATA -m 2 O acl /dev/sda1 (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件…

    Linux干貨 2017-03-11
  • 磁盤和文件系統管理述

        我們知道一塊磁盤是可以被分區成多個分區的(partition),以Windows的觀點來看,你可能會有一顆磁盤并且將他分區成為C:, D:, E:盤,那個C, D,E就是分區。Linux的設備都是以文件的型態存在,磁盤設備接口的不同也早就了磁盤文件名的不同。即IDE接口的磁盤設備文件名都是/dev/hd[a-z…

    Linux干貨 2016-08-29
欧美性久久久久