varnish配置多台magento,varnish配置文件
先介绍一下清漆的一些原理:
首先,从功能上看,varnish是一个类似于squid的专业缓存服务。如果要做缓存服务,一定要选择专业的缓存服务,优先选择鱿鱼和清漆。
其次,它不同于鱿鱼。Varnish可以认为是速度一流的内存缓存,但是内存缓存也限制了它的容量。仍然可以缓存页面和图片。
清漆不能缓存在本地硬盘上。Varnish可以使用正则表达式快速批量清除部分缓存。Varnish的内存管理完全留给了内核。当缓存内容超过内存阈值时,内核会自动将部分缓存存储在swap中以放弃内存。Varnish用于缓存网站和小文件,功能相当强大。清漆适用于图像缓存等。varnish没有特殊的存储引擎。挪威有一份报纸,原来有12条鱿鱼。后来,建筑被修改为使用清漆和2 vainishs代替12鱿鱼。
官方地图
一些节点的解释:
Vcl_recv:收到客户端请求后,确定下一个流向。根据VCL规则,确定请求应该通过(vcl_pass)还是管道(vcl_pipe)或者进入查找(本地查询)。
Vcl_pass:如果不能检查缓存,直接传给后端主机。
Vcl_hit:缓存命中
Vcl_miss:缓存未命中
VCL _管道:Varnish无法理解的请求,或者非web服务的请求。
Vcl_purge:缓存清理
Vcl_synth:缓存修剪
Vcl_fetch:获取请求后端,发送请求,获取数据,根据设置存储在本地。
Vcl_deliver:生成并向客户端发送响应消息,以完成该请求。
后退:后端服务器
请求的执行过程:
1.接收到客户的请求。然后,根据报头信息,判断是否进入该流向(分支)。
2、分为三种情况:
答:如果是PASS,会直接转发到后端服务器,缓存一份后端服务器的数据发送到客户端。如果服务器找不到请求的内容,它将返回一个错误。
b:如果是PIPE,会直接返回客户端无法理解的请求。
c:如果是loopup,也叫本地搜索,根据头信息在本地缓存中搜索。如果找到所请求的信息,它将触发一个hit,这个hit将被直接发送到客户端。如果它没有发现缺失,它将被发送到后端服务器,而缓存的数据仍将被发送到客户端。
具体的配置:
1.首先下载代理和缓存:
http://varnish-cache.org/releases/rel5.2.1.html
我用的是5.2.1版本。
其实这个阿里云上也有,不过还是推荐用这个下载。阿里云上的比较复杂,需要下载语言环境,源码包,开发包。
安装一堆依赖包:
[root@varnish ~]# yum安装autoconf . no arch automake . no arch je malloc-devel . x86 _ 64 libedit-devel . x86 _ 64 libtool . x86 _ 64 ncurses-devel . x86 _ 64 pcre-devel . x86 _ 64 pkg config . x86 _ 64 Python-docutils . no arch Python-sphinx . no arch graphviz . x86 _ 64-y然后解压缩:
[root @ varnish ~]# gunzip varnish-5 . 2 . 1 . tgz[root @ varnish ~]# tarxf varnish-5.2.1.tar是个特殊的东西,不是直接焦油解压就能解决的。你必须在柏油路前打枪。
[根@清漆~] # CD清漆-5 . 2 . 1/[根@清漆~]#。/autogen.sh检查系统环境[root @ varnish ~] #。/configure-prefix=/usr/local/Varnish-enable-debugging-symbols-enable-developer-warnings configuration[root @ Varnish ~]# make install编译并安装[root @ Varnish ~]# CD/usr/local/Varnish/Create a connection以便于点击命令[root @ Varnish ~]# ln-s/usr/local/varnish/s小鹅/Varnish/s小鹅/[root @ Varnish ~]# ln-s/usr/local/Varnish/小鹅/*/usr/local
Varnish有2个配置文件:
一种是配置varnish全局工作模式的默认路径是/etc/etc/varnish/varnish . params
另一个是配置varnish的缓存逻辑,即VCL规则配置文件/etc /etc/varnish/default.vcl
[root @ varnish ~]# CP/usr/local/varnish/share/doc/varnish/example。VCL/美国/当地/清漆/默认。VCL[root @ varnish ~]# vim/usr/local/varnish/default。VCL后端web 1 .host= 172。16 .12 .142 ;port= 80}这个就是后端服务器的地址和端口。中间略默认就好sub vcl_deliver { #发生在我们拥有了所有需要的部分,并准备向客户端发送#响应的时候。# #您可以在此处计算或修改最终对象如果(obj。点击0){设置响应。http。x-Cache=从测试缓存命中;} else { set resp.http.X-Cache=测试缓存未命中;}退货(发货);这里做了个小判断,如果命中的缓存则返回上边的,打.没命中则返回下边的MISS}指定被监听端口启动光泽面
[root @ varnish ~]# varnishd-f/usr/local/varnish/default。VCL 0分。0 .0 .0:80-f指定培智稳健构成动植物的古名或拉丁化的现代名指定互联网协议(互联网协议)端口[root @ varnish ~]# netstat-anpt grep varnishd然后找另一台机器测试:
先写宿主文件
141 test.apache.comIP是光泽面的互联网协议(互联网协议)
第一次访问没有缓存,没出发小姐,也就是配置文件中下边的那个
第二次的时候就有缓存了:
可以看到打了命中缓存。
varnishadm ban.url .*$ #清除所有varnishadm ban.url /index.html #清除index.html页面缓存varnishadm ban.url /admin/$ #清除管理目录缓存
其实varnish的功能很强,可以多台主机进行配置,还能进行负载均衡。这里就先不写了
内置变量summary VCL _ recv在请求开始时以及请求被接收和解析后被调用。目的是决定是否处理这个请求,如何处理,以及使用哪个后端。Vcl_recv以return结尾,参数可以是以下关键字:错误码【原因】:向客户端返回错误码,放弃请求。通过:切换到通过模式。最后,控制权会转移到vcl_pass。管道:切换到管道模式。最后,控制权会转移到vcl_pipe。查找:在缓存中查找请求的对象。最后,根据对象是否在缓存中,控制将被转移到vcl_hit或vcl_miss。vcl_pipe在进入管道模式时被调用。在这种模式下,请求将被传输到后端,后续的数据,无论是来自客户端还是后端,都将保持不变地传输,直到连接关闭。Vcl_pipe以return结束,参数可以是以下关键字:错误码【原因】:返回错误码给客户端,放弃请求。管道:在管道模式下执行。进入pass模式时,将调用vcl_pass。在这种模式下,请求将被发送到后端,然后后端的响应将被发送回客户端,但响应不会进入缓存。接下来,通过同一个客户端连接发起的请求将以正常方式进行处理。Vcl_pass以return结束,参数可以是以下关键字:错误码【原因】:返回错误码给客户端,放弃请求。通过:以通过模式执行。重新启动:重新启动该事务。添加了重新启动计数。如果重新启动的次数大于max_restarts,varnish将导致错误。vcl_hash如果要向hash中添加数据,调用hash_data()。Vcl_hash以return结尾,参数可以是以下关键字:hash:执行哈希逻辑。vcl_hit如果在缓存中找到所请求的对象,则在缓存查找后会调用它。Vcl_hit以return结尾,参数可以是以下关键字:deliver:deliver将对象缓存到客户端。最后,控制权会转移到vcl_deliver。错误代码[原因]:将错误代码返回给客户端,并放弃请求。通过:切换到通过模式。最后,控制权会转移到vcl_pass。重新启动:重新启动该事务。添加了重新启动计数。如果重新启动的次数大于max_restarts,varnish将导致错误。vcl_miss如果在缓存中找不到请求的对象,将在缓存查找完成后调用它。目的是决定是否去后端获取这个请求对象,选择哪个后端。Vcl_miss以return结尾,参数可以是以下关键字:错误码【原因】:向客户端返回错误码,放弃请求。通过:切换到通过模式。最后,控制权会转移到vcl_pass。Fetch:到后端获取请求的对象。最后,控制权将转移到vcl_fetch。vcl_fetch当从后端成功获取对象时,将调用该方法。Vcl_fetch以return结束,参数可以是以下关键字:deliver:对象可能放在缓存中,然后交付给客户端。最后,控制权会转移到vcl_deliver。错误代码[原因]:将错误代码返回给客户端,并放弃请求。Esi:以ESI的形式处理刚刚获取的对象。通过:切换到通过模式。最后,控制权会转移到vcl_pass。重新启动:重新启动该事务。添加了重新启动计数。如果重新启动的次数大于max_restarts,varnish将导致错误。vcl_deliver当缓存的对象被传递到客户端时,将调用该方法。Vcl_deliver以return结束,参数可以是以下关键字:deliver:将对象发送给客户端。错误代码[原因]:将错误代码返回给客户端,并放弃请求。重新启动:重新启动该事务并增加重新启动计数。如果重新启动的次数大于max_restarts,varnish将导致错误。遇到错误时将调用vcl_error,该错误可能与后端或内部错误有关。Vcl_error以return结尾,参数可以是以下关键字:deliver:将对象发送给客户端。重新启动:重新启动该事务并增加重新启动计数。
如果重新启动的次数大于max_restarts,varnish将导致错误。重要变量子例程不带参数,信息一般通过全局变量传递。以下变量在后端中有效:主机:后端的主机名或IP。端口:后端的端口。在处理请求时,以下变量可用(例如VCL _ recv):client . ip:客户端IP地址。server.hostname:服务器的主机名。server.identity:服务器标识,在启动varnish时由“-i”参数指定。如果在启动varnish时没有指定“-i”参数,那么server.identity将被设置为使用“-n”参数指定的实例名称。server.ip:服务器的ip地址。server.port:服务器端口。req.request:请求类型(例如,“GET”、“HEAD”)。req.url:请求的url。req.proto:HTTP协议版本。req.backend:处理请求的后端服务器。req.backend.healthy:后端是否健康。要在后端探测器中设置的运行状况检查。req.http.header:相关的http头。请求。hash _ always _ miss:强制此请求的缓存查找结果为未命中。如果设置为“真”,那么varnish将忽略任何现有的缓存对象,并总是从后端重新获取资源。请求。hash _ ignore _ busy:在缓存查找期间忽略任何繁忙的对象。如果有两个服务器,互相寻找缓存内容,可以使用这个变量来避免潜在的死锁。当准备后端请求时(例如在高速缓存未命中或通过、管道模式下),以下变量可用:bereq.request:请求的类型(例如“GET”和“HEAD”)。bereq.url:请求的url。bereq.proto:与后端服务器交互的HTTP协议版本。贝雷克。HTTP.header:相关的HTTP头。bereq.connect_timeout:与后端连接的超时。Bereq.first _ byte _ timeout:等待后端返回第一个字节的秒数,在管道模式下不可用。Bereq.between _ bytes _ timeout:后端返回的每个字节之间的时间间隔,以秒为单位。在管道模式下不可用。在所请求的对象从后端返回之后、放入缓存之前,以下变量是可用的。换句话说,它在vcl_fetch中可用。beresp.proto:HTTP协议版本。beresp.status:后端返回的HTTP状态代码(如200、302等。).beresp.response:后端返回的状态内容(例如,“OK”、“Found”)。Beresp.cached:如果请求的结果可以缓存,那么这个变量就是“true”。如果HTTP状态代码是200、203、300、301、302、404、410中的一个,并且vcl_recv中没有调用pass,那么可以缓存这个结果。如果TTL和响应的宽限时间都为0,则beresp.cacheable将为0。Beresp.cacheable是可写的。beresp.ttl:缓存对象的生存期,以秒为单位。这个变量是可写的。当一个对象已经存在于缓存中并被查询时,一般在vcl_hit和vcl_deliver中,以下变量(多为只读)可用:obj.proto:用于与后端交互的HTTP版本协议。obj.status:后端返回的HTTP状态代码。obj.response:后端返回的HTTP状态内容。obj.cacheable:如果对象的beresp.cacheable为“true”,那么这个变量的值为“true”。除非强制交付,否则obj.cacheable始终为“true”。obj.ttl:缓存对象的生存期,以秒为单位。这个变量是可写的。obj.lastuse:从现在到上次访问对象之间的时间间隔,以秒为单位。obj.hits:对象发送到客户端的次数,0表示缓存查询未命中。确定对象哈希键时,可以使用以下变量:req.hash: Hashkey用于关联缓存中的对象。它将在读取和写入缓存时使用。准备向客户端发送响应时,可以使用以下变量:resp.proto:响应使用的HTTP协议版本。resp.status:要返回的HTTP状态代码。resp.response:要返回的HTTP状态内容。resp.http.header:相关的http头。