当客户端请求相同的页面时.varnish只发送一个请求到后端(backend)机器,等后面返回数据信息的时候再copy多份
serve – 服务
plethora – 过多
encounter – 遇到
hopefully – 希望
Guru – 领袖
meditation – 冥想
relevant – 有关
probably – 可能
clue – 线索
ransaction – 交易 Continue reading
当客户端请求相同的页面时.varnish只发送一个请求到后端(backend)机器,等后面返回数据信息的时候再copy多份
serve – 服务
plethora – 过多
encounter – 遇到
hopefully – 希望
Guru – 领袖
meditation – 冥想
relevant – 有关
probably – 可能
clue – 线索
ransaction – 交易 Continue reading
●varnishncsa(以 NCSA 的格式显示日志)
Author: Dag-Erling Sm?rgrav
Date: 2010-05-31
Version: 1.0
Manual section: 1
Display varnish logs in apache/NCSA combined log format
SYNOPSIS
varnishncsa [-a] [-b] [-C] [-c] [-D] [-d] [-f] [-I regex] [-i tag]
[-n varnish_name] [-P file] [-r file] [-V] [-w file] [-X regex] [-x tag]
DESCRIPTION
Varnishncsa 工具读取共享内存的日志,然后以 apache/NCSA 的格式显示出来。下 面的选项可以用。
-a 当把日志写到文件里时,使用附加,而不是覆盖。
-b 只显示 varnishd 和后端服务器的日志。 Continue reading
Varnish的一个关键特色就是它有能力防御 web和应用服务器宕机。
Grace mode
当几个客户端请求同一个页面的时候,varnish只发送一个请求到后端服务器,然后让那个其他几个请求挂起等待返回结果,返回结果后,复制请求的结果发送给客户端。
如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有cache 中的内容在 TTL过期以后30 分钟内不删除,使用以下VCL: Continue reading
让我们设置一个 director和两个后端,然后加上健康检查:
backend server1 { .host = "server1.example.com"; .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; } } backend server2 { .host = "server2.example.com"; .probe = { .url = "/"; .interval = 5s; .timeout = 1 s; .window = 5; .threshold = 3; } }
这些新的就是探针,varnish将检查通过探针检查每个后端服务器是否健康: Continue reading
您可以把多台 backends 聚合成一个组,这些组被叫做 directors。这样可以增强性能和弹力。您可以定义多个 backends和多个 group在同一个directors。
backend server1 { .host = "192.168.0.10"; } backend server2{ .host = "192.168.0.10"; }
现在我们创建一个 director:
director example_director round-robin { { .backend = server1; } # server2 { .backend = server2; } # foo }
这个 director 是一个循环的 director。它的含义就是 director 使用循环的方式把backends分给请求。
但是如果您的一个服务器宕了?varnish 能否指导所有的请求到健康的后端?当然可以,这就是健康检查在起作用了。
在某些时刻您需要 varnish 从多台服务器上缓存数据。您可能想要 varnish 映射所有的URL 到一个单独的主机或者不到这个主机。这里很多选项。
我们需要引进一个 java程序进出php的web站点。假如我们的java程序使用的 URL开始于/JAVA/
我们让它运行在8000端口,现在让我们看看默认的default.vcl:
backend default { .host = "127.0.0.1"; .port = "8080"; }
我们添加一个新的 backend:
backend java { .host = "127.0.0.1"; .port = "8000"; }
现在我们需要告诉特殊的URL 被发送到哪里:
sub vcl_recv { if (req.url ~ "^/java/") { set req.backend = java; } else { set req.backend = default. } }
这真的很简单,让我们停下来并思考一下。正如您所见,可以通过任意的后端来选择您要的数据。您想发送移动设备的请求到不同的后端?没问题
if (req.User-agent ~ /mobile/) …. \\这样做应该就可以成功。
现在 varnish 已经正常运行了,您可以通过 varnish 访问到您的 web 应用程序。如果您的 web 程序在设计时候没有考虑到加速器的架构,那么您可能有必要修改您的应用程序或者varnish配置文件,来提高varnish的命中率。
既然这样,您就需要一个工具用来观察您和web服务器之间HTTP头信息。服务器端您可以轻松的使用varnish 的工具,比如varnishlog和 varnishtop,但是客户端的工具需要您自己去准备,下面是我经常使用的工具。
Varnistop
您可以使用varnishtop 确定哪些URL经常命中后端。 Varnishtop –i txurl 就是一个基本的命令。您可以通过阅读“Statistics”了解其他示例。
Varnishlog
当您需要鉴定哪个 URL 被频繁的发送到后端服务器,您可以通过varnishlog对请求做一个全面的分析。 varnishlog –c –o /foo/bar 这个命令将告诉您所有(-o)包含”/football/bar”字段来自客户端(-c)的请求。 Continue reading
现在您的varnish已经正常运行,我们来看一下varnish在做什么,这里有些工具可以帮助您做到。
Varnishtop
Varnishtop工具读取共享内存的日志,然后连续不断的显示和更新大部分普通日志。
适当的过滤使用 –I,-i,-X 和-x 选项,它可以按照您的要求显示请求的内容,客户端,浏览器等其他日志里的信息。
varnishtop -i rxurl \\您可以看到客户端请求的 url次数。
Varnishtop -i txurl \\您可以看到请求后端服务器的url次数。
Varnishtop -i Rxheader –I Accept-Encoding \\可以看见接收到的头信息中有有多少次包含Accept-Encoding。
Varnishhist
Varnishhist工具读取varnishd的共享内存段日志,生成一个连续更新的柱状图,显示最后 N 个请求的处理情况。这个 N 的值是终端的纵坐标的高度,横坐标代表的是对数,如果缓存命中就标记“|”,如果缓存没有命中就标记上“#”符号。
Varnishsizes
Varnishsizes 和varnishhist相似,除了varnishsizes现实了对象的大小,取消了完成请求的时间。这样可以大概的观察您的服务对象有多大。
Varnishstat
Varnish 有很多计数器,我们计数丢失率,命中率,存储信息,创建线程,删除对象等,几乎所有的操作。Varnishstat将存储这些数值,在优化varnish的时候使用这个命令。
有一个程序可以定期轮询 varnishstat 的数据并生成好看的图表。这个项目叫做Munin。 Munin可以在 http://munin-monitoring.org/找到。在varnish的源码中有munin插件。
官方手册:https://www.varnish-cache.org/docs/3.0/tutorial/vcl.html
Varnish 有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。 Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish 就把VCL转换成二进制代码。
VCL 文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。
varnish 将在不同阶段执行它的子程序代码,因为它的代码是一行一行执行的,不存在优先级问题。随时可以调用这个子程序中的功能并且当他执行完成后就退出。 Continue reading
PutVarnish on port 80(使 varnish工作在 80 端口上)
如果您的程序正常运行,没有问题,我们就可以把varnish调整到80端口运行。先关闭vernish
pkill varnishd
然后停止您的 web服务器,修改web服务器配置,把 web服务器修改成监听8080端口,然后修改varnish 的default.vcl和改变默认的后端服务器端口为8080.
先启动您的web服务器,然后在启动varnish:
varnishd -f /usr/local/etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000
我们取消了-a 选项,这样varnish将监控默认端口,启动后,检查您的 web程序是否正常。
相关教程:
varnish中Varnishlog命令解析:http://blog.haohtml.com/archives/12014
linux下varnish配置及使用教程:http://blog.haohtml.com/archives/11985
Varnish Configuration Language – VCL (varnish 配置 语言-VCL):http://blog.haohtml.com/archives/12024
varnish中的Statistics(统计 varnish相关数据)-Varnishtop ,Varnishhist ,Varnishsizes ,Varnishstat:http://blog.haohtml.com/archives/12036
bankend Server后端服务高级配置:http://blog.haohtml.com/archives/12044
varnish中的backends 组Directors:http://blog.haohtml.com/archives/12049
varnish中常用的排错方法:http://blog.haohtml.com/archives/12055