返回顶部
首页 > 资讯 > 后端开发 > Python >varnish详解3
  • 522
分享到

varnish详解3

详解varnish 2023-01-31 02:01:20 522人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

1.Varnish简介Varnish是一款高性能的反向代理服务器和Http加速器,它的开发者Poul-Henning Kamp是FreeBSD的核心开发成员。2.Varnish特点基于内存进行缓存,数据在重启后将消失;利用虚拟内存方式,I/

1.Varnish简介

Varnish是一款高性能的反向代理服务器Http加速器,它的开发者Poul-Henning Kamp是FreeBSD的核心开发成员。

2.Varnish特点

  • 基于内存进行缓存,数据在重启后将消失;

  • 利用虚拟内存方式,I/O性能好;

  • 支持0-60s的精确缓存时间;

  • VCL配置管理灵活;

  • 32位机器上缓存文件大小最大为2GB;

  • 具有强大的管理功能,如top,stat,admin,list等。

3.Varnish与squid对比

squid是一个高性能的代理缓存服务器。

相同点:都是反向代理服务器

不同点:

  • Varnish稳定性高,两者在完成相同负荷工作时,squid服务器发生故障几率高于Varnish。

  • Varnish访问速度更快。Varnish采用“Visual Page Cache"技术,所有缓存数据直接从内存读取,而squid是从硬盘读取缓存数据,所以Varnish访问速度更快。

  • Varnish可以支持更多的并发连接,因为Varnish的tcp连接释放比squid快,因此在高并发连接情况下可以支持更多的TCP连接。

  • Varnish可以通过管理端口,使用正则表达式批量清除部分缓存,而squid做不到。

varnish缺点:

Varnish在高并发连接下CPU,I/O和内存等资源开销要高于squid.

Varnish一旦重启,缓存在内存中的数据都会从内存中释放,这时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。


4.Varnish系统架构

wKiom1V-5-qhSs3XAAHT87C6TXo291.jpg


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


Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。


Child进程包含多种类型的线程,常见的如:

  • Acceptor线程:接收新的连接请求并响应;

  • Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;

  • Expiry线程:从缓存中清理过期内容;


Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。



5.varnish日志


为了与系统的其它部分进行交互,Child进程使用了可以通过文件系统接口进行访问的共享内存日志(shared memory log),因此,如果某线程需要记录信息,其仅需要持有一个,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。而为了减少竞争,每个worker线程都使用了日志数据缓存。


共享内存日志大小一般为90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据。varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示。


6.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命令完成。


7.varnish的后端存储


varnish支持多种不同类型的后端存储,这可以在varnishd启动时使用-s选项指定。后端存储的类型包括:

  • file:使用特定的文件存储全部的缓存数据,并通过操作系统的mmap()系统调用将整个缓存文件映射至内存区域(如果条件允许);

  • (2)malloc:使用malloc()库调用在varnish启动时向操作系统申请指定大小的内存空间以存储缓存对象;

  • persistent(experimental):与file的功能相同,但可以持久存储数据(即重启varnish数据时不会被清除);仍处于测试期;


varnish无法追踪某缓存对象是否存入了缓存文件,从而也就无从得知磁盘上的缓存文件是否可用,因此,file存储方法在varnish停止或重启时会清除数据。而persistent方法的出现对此有了一个弥补,但persistent仍处于测试阶段,例如目前尚无法有效处理要缓存对象总体大小超出缓存空间的情况,所以,其仅适用于有着巨大缓存空间的场景。


选择使用合适的存储方式有助于提升系统性,从经验的角度来看,建议在内存空间足以存储所有的缓存对象时使用malloc的方法,反之,file存储将有着更好的性能的表现。然而,需要注意的是,varnishd实际上使用的空间比使用-s选项指定的缓存空间更大,一般说来,其需要为每个缓存对象多使用差不多1K左右的存储空间,这意味着,对于100万个缓存对象的场景来说,其使用的缓存空间将超出指定大小1G左右。另外,为了保存数据结构等,varnish自身也会占去不小的内存空间。


为varnishd指定使用的缓存类型时,-s选项可接受的参数格式如下:

malloc[,size] 或

     file[,path[,size[,granularity]]] 或

persistent,path,size {experimental}

file中的granularity用于设定缓存空间分配单位,默认单位是字节,所有其它的大小都会被圆整。

wKioL1V-61qBEdLIAAGrvew5tMk524.jpg


Varnish处理HTTP请求的过程大致分为如下几个步骤:

  • Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该Pass或Pipe,还是进入Lookup(本地查询)。

  • Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。

  • Pass状态,在此状态下,会进入后端请求,即进入Fetch状态。

  • Fetch状态,在Fetch状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储。

  • Deliver状态, 将获取到的数据发送给客户端,然后完成本次请求。


8.VCL函数

1)vcl_recv

vcl_recv是在Varnish完成对请求报文的解码为基本数据结构后第一个要执行的子例程,它通常有四个主要用途:

(1)修改客户端数据以减少缓存对象差异性;比如删除URL中的www.等字符;

(2)基于客户端数据选用缓存策略;比如仅缓存特定的URL请求、不缓存POST请求等;

(3)为某WEB应用程序执行URL重写规则;

(4)挑选合适的后端Web服务器;


可以使用下面的终止语句,即通过return()向Varnish返回的指示操作:

pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;

pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;

lookup:在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;

error:由Varnish自己合成一个响应报文,一般是响应一个错误类信息、重定向类信息或负载均衡器返回的后端web服务器健康状态检查类信息;


vcl_recv也可以通过精巧的策略完成一定意义上的安全功能,以将某些特定的***扼杀于摇篮中。同时,它也可以检查出一些拼写类的错误并将其进行修正等。


Varnish默认的vcl_recv专门设计用来实现安全的缓存策略,它主要完成两种功能:

(1)仅处理可以识别的HTTP方法,并且只缓存GET和HEAD方法;

(2)不缓存任何用户特有的数据;


安全起见,一般在自定义的vcl_recv中不要使用return()终止语句,而是再由默认vcl_recv进行处理,并由其做出相应的处理决策。


2)vcl_fetch

相对于vcl_recv是根据客户端的请求作出缓存决策来说,vcl_fetch则是根据服务器端的响应作出缓存决策。在任何VCL状态引擎中返回的pass操作都将由vcl_fetch进行后续处理。vcl_fetch中有许多可用的内置变量,比如最常用的用于定义某对象缓存时长的beresp.ttl变量。通过return()返回给arnish的操作指示有:

  • deliver:缓存此对象,并将其发送给客户端(经由vcl_deliver);

  • hit_for_pass:不缓存此对象,但可以导致后续对此对象的请求直接送达到vcl_pass进行处理;

  • restart:重启整个VCL,并增加重启计数;超出max_restarts限定的最大重启次数后将会返回错误信息;

  • error code [reason]:返回指定的错误代码给客户端并丢弃此请求;

3)vcl_pipe函数 此函数在进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭。 此函数一般以如下几个关键字结束。

  • error code [reason]

  • pipe

4).vcl_pass函数 此函数在进入pass模式时被调用,用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。 此函数一般以如下几个关键字结束。

  • error code [reason] 。

  • pass。

5)lookup 表示在缓存中查找被请求的对象,并且根据查找的结果把控制权交给函数vcl_hit或函数vcl_miss。

6)vcl_hit函数 在执行lookup指令后,在缓存中找到请求的内容后将自动调用该函数。 此函数一般以如下几个关键字结束。

  • deliver:表示将找到的内容发送给客户端,并把控制权交给函数vcl_deliver。

  • error code [reason] 。

  • pass。

(7).vcl_miss函数 在执行lookup指令后,在缓存中没有找到请求的内容时自动调用该方法,此函数可用于判断是否需要从后端服务器获取内容。 此函数一般以如下几个关键字结束。

  • fetch:表示从后端获取请求的内容,并把控制权交给vcl_fetch函数。

  • error code [reason] 。

  • pass。

8)vcl_deliver 函数 
将在缓存中找到请求的内容发送给客户端前调用此方法。此函数一般以如下几个关键字结束。

  • error code [reason]

  • deliver

9)vcl_timeout 函数 
在缓存内容到期前调用此函数。此函数一般以如下几个关键字结束。

  • discard:表示从缓存中清除该内容。

  • fetch。

10)vcl_discard 函数 
在缓存内容到期后或缓存空间不够时,自动调用该函数。该函数一般以如下几个关键字结束。

  • keep:表示将内容继续保留在缓存中。

  • discard。



9.内置公用变量

VCL内置的公用变量可以用在不同的VCL函数中。下面根据这些公用变量使用的不同阶段依次进行介绍。

(1).当请求到达后,可以使用的公用变量

  • req.backend 指定对应的后端主机

  • server.ip 表示服务器端IP

  • client.ip 表示客户端IP

  • req.request 指定请求的类型,例如GET、HEAD和POST等

  • req.url 指定请求的地址

  • req.proto 表示客户端发起请求的HTTP协议版本

  • req.http.header 表示对应请求中的HTTP头部信息

  • req. restarts ;/.l表示请求重启的次数,默认最大值为4

(2).Varnish在向后端主机请求时,可以使用的公用变量

  • beresp.request 指定请求的类型,例如GET合HEAD等

  • beresp.url 指定请求的地址

  • beresp .proto 表示客户端发起请求的HTTP协议版本

  • beresp .http.header 表示对应请求中的HTTP头部信息

  • beresp .ttl 表示缓存的生存周期,也就是cache保留多长时间,单位是秒

(3).从cache或后端主机获取内容后,可以使用的公用变量

  • obj.status 表示返回内容的请求状态代码,例如200、302和504等

  • obj.cacheable 表示返回的内容是否可以缓存,也就是说,如果HTTP返回的是200、203、300、301、302、404或410等,并且有非0的生存期,则可以缓存

  • obj.valid 表示是否是有效的HTTP应答

  • obj.response 表示返回内容的请求状态信息

  • obj.proto 表示返回内容的HTTP协议版本

  • obj.ttl 表示返回内容的生存周期,也就是缓存时间,单位是秒

  • obj.lastuse 表示返回上一次请求到现在的间隔时间,单位是秒

(4).对客户端应答时,可以使用的公用变量

  • resp.status 表示返回给客户端的HTTP状态代码

  • resp.proto 表示返回给客户端的HTTP协议版本

  • resp.http.header 表示返回给客户端的HTTP头部信息

  • resp.response 表示返回给客户端的HTTP状态信息



安装配置Varnish

官网下载这几个rpm包,貌似要×××才能下载,官方提供的yum源已不能用。

varnish-3.0.7-1.el6.x86_64.rpm  

varnish-docs-3.0.7-1.el6.x86_64.rpm  

varnish-libs-devel-3.0.7-1.el6.x86_64.rpm

varnish-debuginfo-3.0.7-1.el6.x86_64.rpm  

varnish-libs-3.0.7-1.el6.x86_64.rpm

# rpm -ivh varnish*.rpm


# vim /etc/sysconfig/varnish

VARNISH_LISTEN_PORT=80 #这里设置的监听端口设置为80
VARNISH_STORAGE="malloc,128M" #生产环境中尽量设置大

启动varnish

# /etc/init.d/varnish start

Starting Varnish Cache:                                    [  OK  ]


varnishadm 命令

# varnishadm -h
varnishadm: invalid option -- 'h'
usage: varnishadm [-n ident] [-t timeout] [-S secretfile] -T [address]:port command [...]
-n is mutually exlusive with -S and -T
[root@www ~]# varnish -S /etc/varnish/secret -T localhost:6082
-bash: varnish: command not found
[root@www ~]# varnishadm -S /etc/varnish/secret -T localhost:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
linux,2.6.32-504.el6.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-3.0.7 revision f544cd8
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish> help
200        
help [command]
ping [timestamp]
auth response
quit
banner
status
start
stop
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
vcl.show <configname>
param.show [-l] [<param>]
param.set <param> <value>
panic.show
panic.clear
storage.list
backend.list
backend.set_health matcher state
ban.url <regexp>
ban <field> <operator> <arg> [&& <field> <oper> <arg>]...
ban.list
acl purgers {    #设定清理缓存的规则,varnish允许localhost,127.0.0.1,192.168.1.0三个来源 IP通过PURGE方法清楚缓存
        "127.0.0.1";
        "localhost";
        "192.168.1.0"/24;
}
 
backend websrv1 {
        .host="192.168.1.138";
        .port="80";
        .probe={
                .url="/index.html";
                .interval=1s;
                .window=3;
                .threshold=1;
        }
}
backend websrv2 {
        .host="192.168.1.139";
        .port="80";
        .probe={
                .url="/index.html";
                .interval=1s;
                .window=3;
                .threshold=1;
        }
}
 
director websrv random {
        { .backend = websrv1; .weight=3; }
        { .backend = websrv2; .weight=3; }
}
 
sub vcl_recv {
        
    if (req.http.x-forwarded-for) {  #使得后端服务能记录访问者的真实IP
       set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
     } 
    else {
       set req.http.X-Forwarded-For = client.ip;
     }
     if (req.request=="PURGE") {  #当发送的PURGE请求的客户端不是在acl中设定的地址,返回405状态。
          if (!client.ip ~ purgers) {
                error 405 "NOT allowed.";
          }
           return (lookup);
      }
      set req.backend = websrv;
}
 
sub vcl_hit {
        if (req.request=="PURGE") {
                purge;
                error 200 "Purged.";
        }
sub vcl_miss {
        if (req.request=="PURGE") {
                purge;
                error 404 "Not in cache";
        }
}
  
sub vcl_deliver {  #增加一个响应头部
        if (obj.hits >0) {
                set resp.http.X-Cache="Hit from"+" "+server.ip;
        }
        else {
                set resp.http.X-Cache="Miss from"+" "+server.ip;
        }
}


--结束END--

本文标题: varnish详解3

本文链接: https://lsjlt.com/news/185590.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • varnish详解3
    1.Varnish简介Varnish是一款高性能的反向代理服务器和HTTP加速器,它的开发者Poul-Henning Kamp是FreeBSD的核心开发成员。2.Varnish特点基于内存进行缓存,数据在重启后将消失;利用虚拟内存方式,I/...
    99+
    2023-01-31
    详解 varnish
  • Varnish 3.X详解
    一、varnish定义Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。ch...
    99+
    2023-01-31
    详解 Varnish
  • varnish 3 telnet 认证
    varnish 3 telent 连接认证 telnet 连接varnish服务器,管理varnish,纠结了很久。一直报错~~ 官网方式 https://www.varnish-cache.org/docs/3.0/reference/v...
    99+
    2023-01-31
    varnish telnet
  • ×××技术详解(3)
    九、数据传输阶段   一旦完成上述4阶段的协商,PPP就开始在连接对等双方之间转发数据。每个被传送的数据报都被封装在PPP包头内,该包头将会在到达接收方之后被去除。如果在阶段1选择使用数据压缩并且在阶段4完成了协商,数据将会在被传送之间进行...
    99+
    2023-01-31
    详解 技术
  • MySQL-3(9000字详解)
    一:索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 1.1索引的意义 索引的意义:加快查找速度,但需要...
    99+
    2023-10-18
    mysql 数据库
  • java反射详解(3)
    动态代理 【案例】首先来看看如何获得类加载器:  class test{       } class hello{     public static void main(String[] args) {         test t=ne...
    99+
    2023-01-31
    反射 详解 java
  • 3-Nginx 命令详解
    一、Nginx命令详解Nginx     启动nginx服务Nginx  -v 查看版本信息Nginx  -V 查看编译信息Nginx  -t 检查配置文件Nginx  -T 检查配置文件,并打印详细信息Nginx  -s 发送信号:  ...
    99+
    2023-01-31
    详解 命令 Nginx
  • windows进程详解3
    winmgmt.exe进程文件: winmgmt or winmgmt.exe进程名称: Windows Management Service描述: Windows Management Service透过Windows Managemen...
    99+
    2023-01-31
    详解 进程 windows
  • Centos6中Varnish启动失败如何解决
    这篇文章将为大家详细讲解有关Centos6中Varnish启动失败如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Varnish是一款高性能的Web加速器,缓存性能非常好,于是我也学学...
    99+
    2023-06-10
  • 在Centos6中启动Varnish失败如何解决
    这篇文章给大家介绍在Centos6中启动Varnish失败如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码如下:rpm &ndash;nosignature -i https://repo.varni...
    99+
    2023-06-10
  • redis详解(3)其他功能
    慢查询 生命周期 client发送命令到redis 2.redis排队 3.redis执行命令(慢查询发生阶段) 4.redis返回结果到客户端 两个配置 slowlog-max-len 先进先出队列 固定长度 保存在内存中 config...
    99+
    2021-04-01
    redis详解(3)其他功能
  • Java类与对象详解(3)
    目录 封装 封装的概念 访问限定符 封装扩展之包 包的概念 导入包中的类 自定义包 基本规则 包的访问权限控制举例 常见的包 static 成员 static 修饰成员变量 static修饰成员方法  static 成员变量的初始化 代码...
    99+
    2023-08-31
    java 开发语言
  • Python 3 之 生成器详解
    ------ 生成器 ------------------------------------------------------------------如今Python对延迟提供更多的支持——它提供了工具在需要的时候才产生结果,而不是立即...
    99+
    2023-01-31
    生成器 详解 Python
  • Python 3 之 装饰器详解
    ------------ 装饰器 -----------------------------------------------------什么是装饰器装饰器是为函数和类指定管理代码的一种方式。装饰器本身的形式是处理其他的可调用对象的可调用...
    99+
    2023-01-31
    详解 Python
  • OSPF详解-3 邻接、度量值
    **一、OSPF邻接关系 运行链路状态路由协议的路由器必须首先与选定的邻居路由器建立邻接关系,这是通过与邻居路由器交换Hello分组来实现的。 1.邻接路由器建立步骤 路由器建立邻接关系的步骤如下: 1)路由器将Hello分组发送给邻居...
    99+
    2023-01-31
    度量 详解 OSPF
  • Python 3中的yield from语法详解
    前言 最近在捣鼓Autobahn,它有给出个例子是基于asyncio 的,想着说放到pypy3上跑跑看竟然就……失败了。 pip install asyncio直接报invalid syntax,粗看还以为...
    99+
    2022-06-04
    语法 详解 Python
  • Python 3 之 运算符重载详解
    基础知识实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。以下是对重载的关键概念的复习:运算符重载让类拦截常规的Python运算。...
    99+
    2023-01-31
    详解 运算符 Python
  • webpack打包的3种hash值详解
    目录前言当年的校招哪三种?实践讲解事先准备打包环境搭建hashchunkhashcontenthash前言 大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶...
    99+
    2024-04-02
  • pythotn条件分支与循环详解(3)
    目录1. break 语句2. continue 语句3. 复杂条件及处理总结在while和for循环过程中,为了更加灵活地控制循环的次数,python提供了break和contin...
    99+
    2024-04-02
  • 在 Ubuntu 上安装 Protobuf 3 的教程详解
    什么时候需要安装 如果使用 protoc 命令,遇到 Protoc not found,表示未安装。或者,执行时出现错误:This parser only recognizes "proto2",则表示不是3.0版。 安...
    99+
    2022-06-04
    ubuntu 安装 protobuf 3
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作