varnish 基础应用

来源:互联网 发布:福建广播网络电视台 编辑:程序博客网 时间:2024/06/18 09:01

前言

这篇博客主要讲解关于varnish的基础应用。
Varnish是一款高性能的开源HTTP加速器,据传挪威最大的在线报纸 Verdens Gang 使用3台
Varnish代替了原来的12台Squid,性能比以前更好。varnish缓存已经成为了一种趋势。
但是因为varnish实在是更新换代太快了,而且每一代之间都有30%左右的不同,可以说网络上
都不能找到什么特别贴切有用的文档。
现在最新的版本已经是2017-09-15 出的Varnish 5.2.0版本了,
但是,在生产中,绝大部分还是使用的4版本,我这里也是使用的4版本来学习的。

原理

对了,现在7上epel源里面自带的是4.0.4版本
6上epel源里面自带的是2.1.5的版本,实在是太老的版本,建议使用时编译安装。

程序的运行具有局部性特征:
时间局部性:一个数据被访问过之后,可能很快会被再次访问到;
空间局部性:一个数据被访问时,其周边的数据也有可能被访问到。

cache:命中热区:局部性;    时效性:        缓存空间耗尽:LRU,最近最少使用的;        过期:缓存清理

缓存命中率:hit/(hit+miss)

页面命中率:基于页面数量进行衡量字节命中率:基于页面的体积进行衡量

缓存与否:建议只缓存共有数据就好,私有数据不建议缓存。

私有数据:privateprivate cache;公共数据:public, public or private cache;

条件式请求:

Last-Modified/If-Modified-Since:基于文件的修改时间戳来判别;Etag/If-None-Match:基于文件的校验码来判别;Expires:Thu, 13 Aug 2026 02:05:12 GMTCache-Control:max-age=315360000ETag:"1ec5-502264e2ae4c0"Last-Modified:Wed, 03 Sep 2014 10:00:27 GMT

缓存层级:

私有缓存:用户代理附带的本地缓存机制;公共缓存:反向代理服务器的缓存功能;

接收请求 -> 解析请求 -> 查询缓存 -> 新鲜度检测 -> 创建响应报文 -> 发送响应 -> 写入日志
请求报文用于通知缓存服务如何使用缓存响应请求:

cache-request-directive =     "no-cache""no-store"                             "max-age" "=" delta-seconds            "max-stale" [ "=" delta-seconds ]      "min-fresh" "=" delta-seconds          "no-transform"                        "only-if-cached"                      cache-extension                    

响应报文用于通知缓存服务器如何存储上级服务器响应的内容:

cache-response-directive =    "public"                                   "private" [ "=" <"> 1#field-name <"> ]     "no-cache" [ "=" <"> 1#field-name <"> ],可缓存,但响应给客户端之前需revalidation,即必须发出条件式请求进行缓存有效性验正;    "no-store" ,不允许存储响应内容于缓存中;                               "no-transform"                            "must-revalidate"                         "proxy-revalidate"                      "max-age" "=" delta-seconds               "s-maxage" "=" delta-seconds              cache-extension     

新鲜度检测机制:

过期时间检测    HTTP/1.0 Expires : expires:Mon, 06 Nov 2017 12:28:49 GMT    HTTP/1.1 Cache-Control : max-age=600有效性再验证    1、文件修改时间是否发送改变    2、文件内容etag 标签校验        如果原始内容未改变,则仅响应首部(不附带body部分),响应码304Not Modified)        如果原始内容发生改变,则正常响应,响应码200        如果原始内容消失,则响应404,此时缓存中的cache object也应该被删除

代理式缓存:
varnish
squid
旁挂式缓存:
memcached

varnish结构

程序架构:

这里写图片描述

Manager进程    Cacher进程,包含多种类型的线程:        accept, worker, expiry, ...     shared memory log:        统计数据:计数器;        日志区域:日志记录;            varnishlog, varnishncsa, varnishstat... 

Varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。

management : 编译VCL并应用新配置、监控varnish、初始化varnish、CLI接口Command line 命令行管理工具Child process mgmt 子进程管理initialisation 初始化child/cacheCommad line 线程 : 管理接口Storage/hashing 线程 :缓存存储Log/stats 线程:日志管理线程Backend Communication 线程:管理后端主机线程Accept : 接受新的连接请求worker threads : 处理用户请求,child进程会为每个会话启动一个worker线程Object Expiry : 清理缓存中的过期对象vcl : varnish configuration language,基于”域” 的编程语言,花括号{}括起来,

配置接口:VCL

Varnish Configuration Language,     vcl complier --> c complier --> shared object 

配置与参数

varnish的程序环境:
/etc/varnish/varnish.params: 配置varnish服务进程的工作特性,例如监听的地址和端口,缓存机制;
/etc/varnish/default.vcl:配置各Child/Cache线程的缓存策略;
主程序:
/usr/sbin/varnishd
CLI interface:
/usr/bin/varnishadm
Shared Memory Log交互工具:
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
测试工具程序:
/usr/bin/varnishtest
VCL配置文件重载程序:
/usr/sbin/varnish_reload_vcl
Systemd Unit File:
/usr/lib/systemd/system/varnish.service
varnish服务
/usr/lib/systemd/system/varnishlog.service
/usr/lib/systemd/system/varnishncsa.service
日志持久的服务;

varnish的缓存存储机制( Storage Types):
-s [name=]type[,options]

· malloc[,size]
内存存储,[,size]用于定义空间大小;重启后所有缓存项失效;
· file[,path[,size[,granularity]]]
磁盘文件存储,黑盒;重启后所有缓存项失效;
· persistent,path,size
文件存储,黑盒;重启后所有缓存项有效;实验;

varnish程序的选项:    程序选项:/etc/varnish/varnish.params文件        -a address[:port][,address[:port][...],默认为6081端口;         -T address[:port],默认为6082端口;        -s [name=]type[,options],定义缓存存储机制;        -u user        -g group        -f config:VCL配置文件;        -F:运行于前台;        ...    运行时参数:/etc/varnish/varnish.params文件, DEAMON_OPTS        DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"        -p param=value:设定运行参数及其值; 可重复使用多次;        -r param[,param...]: 设定指定的参数为只读

重载vcl配置文件

~ ]# varnish_reload_vcl

命令行工具varnishadm

[ root@YGL ~ ]#  varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082

VCL

  Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv、vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认的定义。

  VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成。

vcl状态引擎

  在varnish里面同iptables里面的四表五链一样,可以配置什么文件缓存,什么文件不缓存等等,在vcl里面这里的钩子我们称为状态引擎

这里写图片描述

VCL函数

函数 作用

  • vcl_recv 用户请求成功接收后,遇到的第一个函数,可以在这里对请求的数据进行处理,并决定选取下一步的处理策略
  • vcl_fetch 从后端主机获取内容,并判断是否缓冲此内容,然后发送给客户端
  • vcl_hash 对URL进行hash,可以自定义hash键
  • vcl_pass 将请求直接发给backend,而不是用缓存中的数据
  • vcl_hit 在缓存中找到缓存对象时,要执行的操作
  • vcl_miss 在缓存中未找到对象时,要执行的操作
  • vcl_deliver 响应给客户端时调用此方法
  • vcl_pipe 不经由varnish直接将请求发往后端主机的时候调用,请求和内容不做任何改变,如同为客户端和backend建立一个管道
  • vcl_error 在varnishi上合成错误响应页时,调用此函数

这些函数类似或就是回调函数,是Vanish调用用户逻辑的接口。

内置变量

请求到达时可以使用的变量

req.urlreq.httpreq.http.headerreq.restartserver.ipserver.hostnameserver.portreq.backend

请求发往后端主机时可以使用的变量

bereq.urlbereq.httpbereq.http.headerbereq.protobereq.connect_timeout

缓存对象进入cache后可用的变量

obj.responseobj.statusobj.http.headerobj.protoobj.ttlobj.hits

后端主机响应的内容可用的变量

beresp.responseberesp.http.headerberesp.ttlberesp.protoberesp.do_gzipberesp.do_gunzipberesp.backend.nameberesp.backend.ip

响应客户端可以使用的变量

resp.responseresp.protoresp.statusresp.http.header

这里写图片描述

varnish

配置varnish的三种应用

1、varnishd应用程序的命令行参数

监听的socket,使用的存储类型等等-p param=value-r param,param... 设定只读参数列表/etc/varnish/varnish.params

2、-p 选项指定的参数

运行时参数:可在程序运行中,通过其CLI进行配置
3、vcl

配置缓存系统的缓存机制通过vcl配置文件进行配置,先编译,后应用,依赖于c编译器

设定后端主机backend

修改default.vcl配置文件,指明backend,

backend default {                       # 为后台backend起一个名称    .host = "172.18.56.52";             # 设定后台backend主机地址    .port = "80";                       # 设定后台backend主机端口}

设定使用多个后端主机

backend default {    .host = "172.18.56.50";    .port = "80";}backend webimg {    .host = "172.18.56.51";    .port = "80";}# 设定两个backend后端主机,如果是php文件指定到一台服务器,如果是其他文件指定到默认服务器sub vcl_recv {    if (req.url ~ "(?i)\.php$"){        set req.backend_hint = webimg;    }else{        set req.backend_hint = default;    }}

varnish负载均衡

使用前需要导入 import directors;

varnish modulesub vcl_init{    new GROUP_NAME = directors.round_robin();    GROUP_NAME.add_backend(srv1);    GROUP_NAME.add_backend(srv2);}sub vcl_recv {    set req.backend.hint = GROUP_NAME.backend();    }

基于cookie的session sticky:

sub vcl_init {    new h = directors.hash();    h.add_backend(one, 1);   // backend 'one' with weight '1'    h.add_backend(two, 1);   // backend 'two' with weight '1'}sub vcl_recv {    // pick a backend based on the cookie header of the client    set req.backend_hint = h.backend(req.http.cookie);}               

后端服务器状态监测

BE Health Check:backend BE_NAME {    .host =      .port =     .probe = {        .url=         .timeout=         .interval=         .window=        .threshold=    }}.probe:定义健康状态检测方法;    .url:检测时要请求的URL,默认为”/";     .request:发出的具体请求;        .request =             "GET /.healthtest.html HTTP/1.1"            "Host: www.magedu.com"            "Connection: close"    .window:基于最近的多少次检查来判断其健康状态;     .threshold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;    .interval:检测频度;     .timeout:超时时长;    .expected_response:期望的响应码,默认为200

健康状态检测的配置方式:
示例:

probe check {    .url = "/.healthcheck.html";    .window = 5;    .threshold = 4;    .interval = 2s;    .timeout = 1s;}backend default {    .host = "10.1.0.68";    .port = "80";    .probe = check;}backend appsrv {    .host = "10.1.0.69";    .port = "80";    .probe = check;}

手动设定BE主机的状态:
sick:管理down;
healthy:管理up;
auto:probe auto;

设置后端的主机属性:

backend BE_NAME {    ...    .connect_timeout = 0.5s;    .first_byte_timeout = 20s;    .between_bytes_timeout = 5s;    .max_connections = 50;}

varnish的运行时参数:

线程模型:    cache-worker    cache-main    ban lurker    acceptor:    epoll/kqueue:    ...

varnish.params

[ root@YGL /etc/varnish ]# cat varnish.params # Varnish environment configuration description. This was derived from# the old style sysconfig/defaults settings# Set this to 1 to make systemd reload try to switch VCL without restart.RELOAD_VCL=1# Main configuration file. You probably want to change it.VARNISH_VCL_CONF=/etc/varnish/default.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=192.168.1.5VARNISH_LISTEN_PORT=6081# Admin interface listen address and portVARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1VARNISH_ADMIN_LISTEN_PORT=6082# Shared secret file for admin interfaceVARNISH_SECRET_FILE=/etc/varnish/secret# Backend storage specification, see Storage Types in the varnishd(5)# man page for details.VARNISH_STORAGE="malloc,256M"# User and group for the varnishd worker processesVARNISH_USER=varnishVARNISH_GROUP=varnish# Other options, see the man page varnishd(1)#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

varnish日志

shared memory log
计数器
日志信息

1、varnishstat - Varnish Cache statistics
-1
-1 -f FILED_NAME
-1:可用于-f选项指定的字段名称列表;

MAIN.cache_hit MAIN.cache_miss# varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss             显示指定参数的当前统计数据;# varnishstat -l -f MAIN -f MEMPOOL             列出指定配置段的每个参数的意义;

2、varnishtop - Varnish log entry ranking
-1 Instead of a continously updated display, print the statistics once and exit.
-i taglist,可以同时使用多个-i选项,也可以一个选项跟上多个标签;
-I <[taglist:]regex>
-x taglist:排除列表
-X <[taglist:]regex>

3、varnishlog - Display Varnish logs

4、 varnishncsa - Display Varnish logs in Apache / NCSA combined log format

最后

由于现阶段学习实在是过于繁重,没有太多的时间去细细的写博客,
只能写一些基础入门的东西,博客写的十分的粗糙。
等以后闲下来了,一定把这些东西都细细的来整理一遍。
嗯,vainish是一个非常强大的代理式缓存器,他取代squid的趋势基本已成定局。

原创粉丝点击