varnish学习总结

什么是web cache?

Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在与Web服务器和客户端(浏览器)直接的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。 —–摘自Alloy Team

缓存命中率类型:

文档命中率:按文档数量进行衡量

字节命中率:按命中的字节数量进行衡量

缓存处理流程:

接受请求:接受来自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有九个状态引擎,如下图所示:

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: 请求的urlreq.http.HEARDER: 请求的具体首部req.restarts: 请求报文重启次数server.ip: varnish服务器的ip地址server.port: varnish服务器的端口clinet.ip: 客户端ipserver.hostname: varnishi服务器名称req.backend: 请求时交由具体后端服务器

resp.proto: 响应版本协议resp.status: 响应码resp.http.HEARDER:响应首部

bereq.url: 请求的urlbereq.request: 请求方法bereq.http.HEADER: 请求的首部bereq.connect_timeout: 连接超时时长bereq.proto:向后端发起请求时使用的协议

beresp内置变量

obj内置变量:

相关说明:

beresp.status: 后端响应码beresp.http.HEADER: 响应首部beresp.ttl: 响应ttl值,缓存时长beresp.backend.ip: 后端主机ipberesp.backend.port: 后端端口beresp.backend.name: 后端主机名

obj.status: 缓存对象响应码obj.ttl: 缓存时长obj.hits: 缓存是否命中obj.http.HEARDER: 命中状态首部

req: 是客户端发起的requestresp:是varnishi响应的responsebereq:是varnish向后端服务器发起请求beresp:是后端服务器响应给varnishobj:是缓存对象即将进入缓存

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 <img src="http://www.178linux.com/wp-content/themes/d8-4.0/img/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" data-tag="bdshare" data-bd-imgshare-binded="1">
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:

测试2:

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)利用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/

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-07-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏idba

ZanDB基于Celery定时任务的二次开发

ZanDB早期的任务需求中,大部分都是针对servant(跑在主机上的agent)做任务调度。也就是说,一期的任务系统,满足的是在特定时刻调用特定主机执行特定的...

16820
来自专栏大学生计算机视觉学习DeepLearning

c++ 网络编程(二)TCP/IP linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html

55390
来自专栏SDNLAB

OpenDaylight ping模块开发及分析

编者按:OpenDaylight ping模块开发及当ping操作触发数据流,对其进行分析及流程原理的疏通讲解,并在开发过程中遇到的问题进行总结,希望给大家能够...

35760
来自专栏柠檬先生

webpack 简单配置

1.webpack 是一个现代JavaScript 应用程序的静态打包器,它能够把各种资源,例如JS,样式,图片   等都作为模块来使用处理,将许多松散的模块按...

27070
来自专栏JavaEdge

GET和POST到底啥区别???

最普遍的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。 可能很多人都已经猜到了,他要的答案是:

12320
来自专栏Jackson0714

不惧面试:HTTP协议(1) - 基础扫盲

30770
来自专栏个人分享

用CRT connect MongoDB 使用Backspace无效

使用./mongo 10.1.235.62:27017 连接上后 打错了无法删除!? 这是在逗我,那就修改CRT个设置,点击选项,会话选项,仿真,把终端改成Li...

9220
来自专栏Jackson0714

不惧面试:HTTP协议(1) - 基础扫盲

21730
来自专栏iKcamp

基于Koa2搭建Node.js实战(含视频)☞ 中间件用法

中间件用法——讲解 Koa2 中间件的用法及如何开发中间件 文章 middleware 中间件 正是因为中间件的扩展性才使得 Koa 的代码简单灵活。 在 a...

29950
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第28章 RL-TCPnet之DNS应用

本章节为大家讲解RL-TCPnet的DNS应用,学习本章节前,务必要优先学习第27章的DNS基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效果。

11650

扫码关注云+社区

领取腾讯云代金券