一、Varnish简介:

Varnish是一款高性能的开源HTTP加速器,varnish项目是2006年发布的第一个版本,现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少,在功能上,它可以作为反向代理服务器和缓存服务器使用,不过它的反向代理功能不如haproxy或者nginx性能强大,所以它的应用多数都在缓存服务器的场景下。

二、Varnish的核心引擎以及常用变量类型:

Varnish有9个核心引擎,用于处理用户请求以及后端服务器响应的报文,当然处理的报文更多的目的是判断是否需要缓存以及与缓存相关的特性或者是要处理的执行动作。在很多时候,我们需要从连贯的角度考虑数据流经这几个引擎上的可能,需要考虑数据报文经由这些引擎时可能执行的流程,这有助于我们完整的编写其配置文件,也有助于我们更好的理解Varnish内部的数据处理机制。

Varnish内部的核心引擎:

vcl_recv、vcl_pipe、vcl_pass、vcl_hash、vcl_hit、vcl_miss、vcl_fetch、vcl_deliver、vcl_error

Varnish中可用的内置变量:

请求到达时可用的内置变量

req.url、req.request、req.http.header、req.restarts、server.ip、server.port、server.hostname、client.ip、req.backend

向后端主机请求时可用的内置变量

bereq.url、bereq.request、bereq.http.header、bereq.connect_timeout、bereq.proto

从后端主机获取到相应的object时可用的内置变量

beresp.response、beresp.status、beresp.http.header、beresp.backend.name、beresp.backend.ip、beresp.backend.port、beresp.ttl

二、Varnish的应用:

1、Varnish在作为缓存服务器工作的同时,它的另外一个角色与Haproxy相同,也就是要作为反向代理使用,而请求后端服务器数据时,请求者的身份是Varnish而不再是客户端,也意味着在上游服务器的日志记录中记录的请求者的信息是代理服务器的IP地址,这通常不是我们需要的,通常需要记录的是真实的客户端IP地址,如果要在后端服务器端记录该地址,使用的方式如下:

首先需要定义后端的服务器信息,Varnish的配置文件如果是基于RPM包安装的方式安装的,为/etc/varnish目录下的default.vcl,如果后端主机为172.16.103.2,那么相应在配置文件中定义内容为:

backend default {.host = "172.16.103.2";.port = "80";
}

注意:在Varnish的配置文件中默认就是将客户端的真实IP地址发送给服务器端,所以我们需要启用Varnish的默认配置文件中vcl.req段的配置,然后修改的是后端服务器记录日志的格式就可以了。

sub vcl_recv {if (req.restarts == 0) {if (req.http.x-forwarded-for) {set req.http.X-Forwarded-For =req.http.X-Forwarded-For + ", " + client.ip;} else {set req.http.X-Forwarded-For = client.ip;}}    return (lookup);
}

修改后端服务器的httpd服务的配置文件保存日志的格式为:

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" combined

这样在客户端请求数据报文发给前端的Varnish主机时,如果没有缓存,会将请求发往后端服务器,并记录真实的客户端IP地址,例如:

172.16.103.111 - - [26/Sep/2014:23:54:26 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36" -

2、当有些请求的资源不需要缓存时,可以在Varnish的配置文件中的vcl_recv段中使用如下的方式定义:

if (req.url ~ "^/test.html$") {return (pass);

语句的含义是使用正则表达式来匹配以/test.html开头的uri,如果用户请求的是这种类型的资源,就直接将请求发往后端主机,而不使用缓存,使用这种方式我们也可以测试客户端的请求是否可以直接发往后端的服务器。测试效果如下:

3、当某些缓存资源需要清理时,我们需要执行PURGE操作,定义的方式如下:

这个操作可能出现的情况比较多,首先,因为Varnish缓存的数据在实际的应用场景中会非常重要,不能随意允许其他人连入直接删除缓存的操作,所以要执行这种操作时,需要判断用户的身份,在Varnish的配置文件中,可以使用acl列表定义允许使用PURGE的用户列表,然后在各个可能出现PURGE操作的执行引擎位置定义该操作的执行效果。示例如下:

acl purgers {"127.0.0.1";"172.16.103.0"/24;
}
sub vcl_recv {
if (req.request == "PURGE") {if (client.ip !~ purgers) {error 405 "Method not allowed.";}return(lookup);}return (lookup);
}
sub vcl_pass {if (req.request == "PURGE") {error 502 "PURGE on a passwd object";}return (pass);}
sub vcl_hit {if (req.request == "PURGE") {purge;error 200 "Purged";}return (deliver);}
sub vcl_miss {if (req.request == "PURGE") {purge;error 404 "Not in cache";}return (fetch);}

这样定义好之后,每当用户发起PURGE请求时,数据报文在到达vcl.recv时会先判断用户的身份,如果用户的身份与定义的acl中的规则匹配,则允许用户执行后续的操作,后续的操作中如果用户删除的缓存条目存在,则显示200返回码,并显示Purged,如果删除的缓存条目不存在,则显示错误404,并提示要删除的条目不在缓存中,当用户的数据报文如果经过vcl_pass时,由于是发往后端主机的,所以不可能有删除缓存的可能性,所以会提示502错误。

具体删除缓存条目时的删除示例:

[root@node2 html]# curl -X PURGE http://172.16.103.1/index.html
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head><title>200 Purged</title></head><body><h1>Error 200 Purged</h1><p>Purged</p><h3>Guru Meditation:</h3><p>XID: 1703226672</p><hr><p>Varnish cache server</p></body>
</html>

4、Varnish可以实现对后端服务器提供健康检测的功能,定义的方式如下:

backend default {.host = "172.16.103.2";.port = "80";.probe = {.url = "/index.html";.interval = 2s;.window = 8;.threshold = 2;}
}

具体查看时可以使用telnet连接到Varnish使用其中的backend.list命令来查看后端服务器的健康状况:

# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish> backend.list
200
Backend name                   Refs   Admin      Probe
default(172.16.103.2,,80)      1      probe      Healthy (no probe)
web1(172.16.103.2,,80)         1      probe      Healthy 8/8

5、当Varnish作为反向代理时,其后端可以有多个服务器提供服务,在Varnish配置文件中可以定义多个后端的backend server同时还可以将多个服务器定义为一个组,使用director关键字来定义,在处理引擎中需要用到各director时再调用即可,在定义director时,由于Varnish有负载均衡的效果,所以调度的时候有相应的算法,算法有两种,分别的random和round-robin,配置示例:

backend web1 {.host = "172.16.103.2";.port = "80";.probe = {.url = "/index.html";.interval = 2s;.window = 8;.threshold = 2;}
}
backend web2 {.host = "172.16.103.3";.port = "80";.probe = {.url = "/index.html";.interval = 2s;.window = 8;.threshold = 2;}
}
acl purgers {"127.0.0.1";"172.16.103.0"/24;
}
director webservers round-robin {{ .backend = web1; }{ .backend = web2; }
}

定义好各后端的服务器及director之后,就可以在需要调用director的处理引擎段中调用director了,比如在vcl.recv段中定义:

sub vcl_recv {set req.backend = webservers;

这样当数据请求报文到达Varnish主机时,会自动将数据请求报文依据定义的算法调度至后端的各服务器进行响应,同时,如果响应的结果可以缓存,那么会有一份结果保存在Varnish中,之后再次请求时,会直接由Varnish响应之后的用户请求。

转载于:https://blog.51cto.com/9164364/1558691

Varnish的基本应用详解相关推荐

  1. varnish配置详解

       varnish配置详解 能用到缓存的服务器的原因是,应用到了程序的局部性. 空间局部性:一个程序最近访问了一个空间,那么他周边的空间也将被访问. 时间的局部性:一条指令一段时间内被执行,之后的一 ...

  2. Tomcat原理详解和各种集群的实现

    注意:本篇博文涉及的知识内容如下,实验中所用的系统环境为RHEL6.4. 1.Java基础知识讲解 2.Tomcat的安装和实现 3.通过apache的mod_proxy模块代理并实现Tomcat负载 ...

  3. Tomcat原理详解和各种集群的实现(转自:http://harisxiong.blog.51cto.com/7513022/1304746)

    标签:apache Java Tomca mod_proxy 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://harisxiong ...

  4. puppet 学习总结(1)——puppet 入门详解

    一.puppet 介绍 1.概述 puppet 是一个 IT 基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning).配置(configuratio ...

  5. Linux进程最大socket数,Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  6. 自动化运维工具——puppet详解(二)

    自动化运维工具--puppet详解(二) 目录 一.class 类 1)什么是类? 2)带有参数的类 3)类的继承 1.新增属性 2.新增原有值 3.修改原有值 4.整体调用父类,并重写部分值 二.模 ...

  7. openTSDB详解之Writing Data

    [译]openTSDB详解之Writing Data[待完善] 本文译自:http://opentsdb.net/docs/build/html/user_guide/writing/index.ht ...

  8. 26.Nginx详解

    文章目录 一 Web服务基础介绍: 1.1 互联网发展历程回顾: 1.2:web服务介绍: 1.2.1 Apace-早期的web服务端: 1.2.1.3:Apache event模型 1.2.2 Ng ...

  9. Memcached对象缓存详解

    一.NoSQL概述 NoSQL数据存储不需要固定的表结构,通常也不存在连接操作.在大数据存取上具备关系型数据库无法比拟的性能优势.随着互联网web2.0网站的兴起,NoSQL数据库现在成了一个极其热门 ...

  10. 中型公司网络架构拓扑与详解

    综合架构图: 综合架构详解: 详细总结: 公司第一大环境(生产环境): 1.整个web的访问过程其实就是数据流怎么处理的. 2.访问请求分为:动态 静态请求 3.代理:分为 反向代理(reporxy) ...

最新文章

  1. 各种媒体在线播放代码
  2. SAP RETAIL 寄售模式公司间STO流程里收货过账不能基于外向交货单?
  3. Netty聊天之发送图片
  4. python安装numpy-python及numpy安装
  5. 现在很多技术知识点缺乏来龙去脉的介绍
  6. 15.基于Hadoop的数据仓库Hive第2部分
  7. P142-144使用Tensorflow自定义一个线性分类器用于对“良/恶性乳腺癌肿瘤”进行预测
  8. 【图论】最短路上的统计(ssl 1500)
  9. muduo for v210
  10. MyBatis在Oracle中插入数据并返回主键的问题解决
  11. 【Kaggle微课程】Natural Language Processing - 2.Text Classification
  12. 基于JAVA+SpringMVC+MYSQL的人事管理系统
  13. day34-常见内置模块三(re模块)
  14. VMware Workstation 15 解锁Mac OS安装
  15. SQL索引及表的页的逻辑顺序与物理顺序
  16. 数据--第51课 - 二叉排序树
  17. 自动驾驶 5-3 前馈速度控制 Feedforward Speed Control
  18. IOS开发笔记_5.线程,HTTP请求,定时器
  19. 计算机网络原理学习笔记
  20. 关于饿了么ui框架的使用之Form 表单的应用

热门文章

  1. html读取本地json数据库,用Javascript读取本地JSON到HTML
  2. parallels恢复linux密码,在Parallels Desktop中忘记Windows密码怎么办 Parallels Desktop忘记Windows密码的解决方法...
  3. 三校生计算机高考试卷及答案,云南三校生计算机专业课高考试卷3
  4. php里= 啥意思,PHP natcasesort() 函数 | 菜鸟教程
  5. 广播风暴检测_什么是广播路由算法?如何解决广播风暴?
  6. 2011通信展:应用为王 国内3G终端企业集体发力
  7. IBM主机增加“交易实时分析”新能力
  8. 本地Exchange和exchange online混合部署后OWA统一登录的实现
  9. 如何实现服务器启动自动创建日志
  10. 20天精通 Windows 8:系列课程资料集