Varnish的基本应用详解

一、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错误。

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

[[email protected] 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响应之后的用户请求。

时间: 2024-10-27 12:58:58

Varnish的基本应用详解的相关文章

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

Varnish应用和实例详解

varnish 是squid的升级版,主要应用于http得反向代理和http缓存来提供加速功能 1.varnish工作原理是:是每个线程响应一个用户请求的(某个用户请求到来,accept接收这个请求并分配到某个空闲的worker进程进行处理, (由worker线程读入缓存根据请求的url,如果能够在缓存中查找到,直接把查找的内容直接响应给客户:如果在缓存中查找不到,就负责到后端服务器查找数据,查找到数据后,根据缓存机制,如果能够缓存,就缓存到本地,再响应给客户端.)) 2.varnish能够响应

varnish页面缓存代理服务详解

一.Web缓存 1.web缓存 web缓存是可以自动保存常见文档副本的HTTP设备.当Web请求抵达缓存时,如果本地有"已缓存的"副本,可以从本地的存储设备而不是原始服务器设备中提取这个文档. 通过key-value键值方式缓存,key中保存了URL路径,value中保存了web内容,其均使用hash格式,算法保证能在海量数据中快速命中缓存内容 (1)缓存优点 1) 减少冗余的数据传输,节省带宽 2) 缓解网络瓶颈问题,无需耕宇宽带就能更快的加载页面 3) 降低对原始服务器的要求,服务

Varnish要点及案例详解

1. Varnish简介 Vanish是一款开源的.高效的的HTTP加速器,可以提供代理服务和缓存服务. 目前最新的版本是4.0.X,而生产环境中用的最多的还是3.x.x的版本.epel源中的rpm过于老旧,不推荐使用. 1.1 Varnish架构 Varnish也采用了多进程的架构,有2个主要的进程: 主进程,也称管理进程 管理进程 应用VCL配置,编译VCL 监视Varnish 初始化Varnish 提供命令行接口 子进程的管理 子进程 管理线程池 移除过期缓存数据 上游服务器通讯和健康检查

Varnish原理和配置详解

一.varnish的简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进varnish 迅速发展起来. 1.varnish的架构 varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程).它们的工作原理大致如下图: M

缓存varnish的管理及配置详解

一 工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server.严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器.同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方

缓存varnish配置详解

一 工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server.严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器.同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方

36 web系统架构及cache基础、varnish4基础应用、varnish状态引擎详解及vcl

02 varnish4基础应用 配置环境: node1 CentOS7.2 192.168.1.131 [[email protected] ~]# yum -y install varnish [[email protected] ~]# vim /etc/varnish/varnish.params 修改 VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" 为 VARNISH_STORAGE="ma

varnish详解与实际应用案例

varnish是一款高性能且开源的反向代理服务器和Http加速器,开发者Poulhenning Kamp,其也是FreeBSD核心的开发人员之一,比较有名的应用安全当数,挪威最大的在线报纸Verdens Gang(vg.no)使用3台varnish代替了原有的12台squid,而且性能比以前更好,(思密达,google时都有此说明)可以运行于多种平台,如FreeBSD6.0,7.0 Solaris和Linux 2.6内核及以上版本的运行一.原理概念介绍 1.varnish系统架构    varn