首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[干货]varnish原理|杨过同学

[干货]varnish原理|杨过同学

作者头像
小小科
发布2018-05-04 10:59:18
发布2018-05-04 10:59:18
1K0
举报
文章被收录于专栏:北京马哥教育北京马哥教育

Varnish是一款高性能的开源HTTP加速器(其实就是带缓存的反向代理服务),可以把http响应内容缓存到内存或文件中,从而提高web服务器响应速度。与传统的 squid 相比,varnish具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来


Varnish程序结构

管理进程:编译VCL并应用新配置、监控varnish、初始化varnish,并提供一个CLI,初始化缓存的内存结构,对缓存内存结构实现分成各个类型大小的内存块。

  • Child/Cache线程有几类:
    • Acceptor:接收新的连接请求;
    • Worker:用于处理并响应用户请求;
    • Expiry:从缓存中清理过期cache object

日志:Shared Memory Log, 共享内存内存日志大小一般90MB;分为两部分:前一部分为计数器、后一部分为客户请求相关的数据。

  • 对varnish内的缓存数据的有效管理:
    • Expires:定义一个缓存时长,过了缓存时长就认为缓存失效。
    • http validation
  • If-Modified-Since/Last Modified : 每次客户端请求缓存内容,varnish会向后端主机询问这个缓存对象自它缓存的时间开始时有没有改变,没改变的话会返回一个304,证明可以返回varnish内的缓存内容,如果改变了,需要向后端请求该内容返回给客户端。
  • If-None-Match/Etag:会对varnish的缓存内容一个标签和一个缓存时间,过了这个时间,向后端主机询问这个缓存内容的标签是否有改变,没改变的话这个缓存内容增加其缓存时间。

Vcl内置函数和处理流程(状态引擎)

Vcl内置函数:vcl配置的缓存策略在此些内置函数发挥作用;

  • vcl_recv:用于接受和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。
  • vcl_fetch:根据服务器端的响应作出缓存决策,如判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
  • vcl_pipe:对于无法理解的用户请求,将请求直接发往后端主机;
  • vcl_hash:自定义hash生成时的数据来源
  • vcl_pass:用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存。
  • vcl_hit:从缓存中查找到缓存对象时要执行的操作;
  • vcl_miss:从缓存中款查找到缓存对象时要执行的操作;
  • vcl_deliver:将用户请求的内容响应给客户端时用到的方法;
  • vcl_error:在varnish端合成错误响应而时;

vcl的配置语法:

  • (1) //, #, /comment/用于注释;
  • (2) sub $NAME 用于定义函数;
  • (3) 不支持循环;
  • (4) 有众多内置变量;
  • (5) 支持终止语句,没有返回值;
  • (6) “域”专用语言;
  • (7) 操作符: =, ==, ~, !, &&, ||

常用变量:

  • 1、在任何引擎中均可使用:
    • .Now:获取当前系统当前时间
    • .host:获取当前主机名和ip地址
    • .port:后端服务器名称和端口
  • 2、用于处理请求阶段:
    • client.ip,server.hostname, server.ip, server.port :都不解释
    • req.request:请求方法
    • req.url:请求的URL
    • req.proto:HTTP协议版本
    • req.backend:用于服务此次请求的后端主机;
    • req.backend.healthy:后端主机健康状态;
    • req.http.HEADER:引用请求报文中指定的首部;
    • req.can_gzip:客户端是否能够接受gzip压缩格式的响应内容;
    • req.restarts:此请求被重启的次数;
  • 3、varnish向backend主机发起请求前可用的变量
    • bereq.request:请求方法
    • bereq.url:请求url
    • bereq.proto:HTTP协议版本
    • bereq.http.HEADER:调用服务此次请求的后端主机的报文首部
    • bereq.connect_timeout:等待与beckend建立连接的超时时长
  • 4、backend主机的响应报文到达本主机(varnish)后,将其放置于cache中之前可用的变量
    • beresp.backend.ip:获取后端响应ip
    • beresp.ttl:响应对象剩余的生存时长,单位为秒钟;
    • beresp.do_stream:流式响应(接收一个请求,响应一个请求)
    • beresp.do_gzip:是否压缩之后再存入缓存;
    • beresp.do_gunzip:如果从后端收到压缩格式的报文,是否解压缩在存放下来
    • beresp.http.HEADER:获取httpd的首部信息
    • beresp.proto:HTTP协议版本
    • beresp.status:响应状态码
    • beresp.response:响应时的原因短语
    • beresp.backend.name:此响应报文来源backend名称;
    • beresp.backend.port:获取后端响应端口
    • beresp.storage:强制varnish将缓存存储到缓存后端
  • 5、缓存对象存入cache之后可用的变量
    • obj.proto:响应时使用的协议
    • obj.status:响应时使用的状态码
    • obj.response:服务器返回响应报文的状态码
    • obj.ttl:缓存对象生存时长
    • obj.hits:缓存对象被用作响应时的次数
    • obj.http.HEADER:调用对应的响应报文
  • 6、在决定对请求键做hash计算时可用的变量
    • req.hash:指明把什么作为hash的键,作为缓存的键
  • 7、在为客户端准备响应报文时可用的变量
    • resp.http.HEADER:调用响应报文状态码
    • resp.proto:指明使用什么协议响应
    • resp.status:执行响应状态吗
    • resp.response:返回响应的状态码

变量在各状态引擎使用情况:

wKiom1WdOkLQKbelAAF0SUqSJgU337.jpg

varnish配置实例:

  • /etc/sysconfig/varnish 是定义varnish运行特性的配置文件;
  • /etc/varnish/default.vcl 是定义varnish的默认状态引擎的工作配置文件(使用vcl语言定义)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Varnish程序结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档