What is varnish?
Varnish是一种状态艺术,高性能的web加速器,它运行在linux2.6 kernel,freebsd6/7 和solaris 10系统上。
包含的一些特点:
1、 现代先进的架构设计
2、 VCL,一种非常灵活的配置语言
3、 后端服务器的负载均衡和健康检查
4、 局部支持ESI
5、 URL地址重写
6、 优雅的处理后端服务器宕机的问题
未来的特点(试验中)
1、 支持头文件分类
2、 支持持久缓存
Varnish是一个自由软件,他使用改进的BSD licenced。请阅读指南,开始你的varnish之旅。
HOW……
我们需要分配多少内存/硬盘空间给varnish?
需要根据实际情况而定。
我认为我们目前最好的指导就是你考虑一个符合成本效益的RAM配置,比如1-16G,SSD硬盘。
除非你肯定你需要它,因为很少有主板可以安装以TB为单位的RAM。
在另一方面,如果你的流量在Gb/s,那么你需要尽可能多的分配RAM。
我怎么让varnish使用更少的内存?
你不能,varnish操作时在内存中进行的,分配多少RAM给进程是kernel来确定。
我怎么命令varnish的一个实例忽略某个请求的参数?
你可以通过正则表达式删除一个请求的参数
sub vcl_recv {
set req.url = regsub(req.url, "\?.*", "");
}
我怎么强制刷新varnish cache中的目标?
通常调用purging 一个内容。在varnish中,你至少有两种方法完成purge。
1、 命令行
在命令行输入以下代码:
url.purge ^/$
purge你的/目录,你可以发现url.purge命令使用一个正则表达式来匹配,因此“^”和“$”分别代表开始和结尾。所有以/开始的内容都会从cache中删除,所以,删除cache中所有的内容的写法如下:
url.purge .*
2、 HTTP PURGE
我怎么对一个单独的client请求DEBUG?
Varnishlog工具可以很好的整理输出,有能力对我们自己的流量做DEBUG。
ReqStart 包含客户端IP,我们可以查看匹配他的IP
$ varnishlog -c -o ReqStart 192.0.2.123
想要查看这个IP地址在后端服务器的操作,我们可以匹配TxHeader,客户端单独的IP地址包含在 X-Forwarded-For 头信息里,然后发送给后端服务器。
$ varnishlog -b -o TxHeader 192.0.2.123
我怎么在请求发送到后端服务器前重写URLS地址?
你可以使用regsub()函数来完成,下面是一个例子:
{ set req.url = regsub(req.url, "^", "/VirtualHostBase/http/example.com:80/Sites/example.com/VirtualHostRoot");
}
我有一个站点,它有很多主机名,我怎么保持cache的内容最少?
你可以在接收到头信息中规范所有主机名,VCL代码如下:
if (req.http.host ~ "^(www.)?example.com") {
set req.http.host = "example.com";
}
我怎么修改到后端的请求?
你可以通过bereq修改到后端的请求,但是你只能使用“set”值,因此你可以使用req.url构造一个request:
sub vcl_miss {
set bereq.url = regsub(req.url,"stream/","/");
fetch;
}
我怎么定制varnish返回的错误信息?
使用vcl_error可以定制一个错误页面。默认的错误页面如下:
sub vcl_error {
set obj.http.Content-Type = "text/html; charset=utf-8";
synthetic {"
<?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>"} obj.status " " obj.response {"</title>
</head>
<body>
<h1>Error "} obj.status " " obj.response {"</h1>
<p>"} obj.response {"</p>
<h3>Guru Meditation:</h3>
<p>XID: "} req.xid {"</p>
<address><a href="http://www.varnish-cache.org/">Varnish</a></address>
</body>
</html>
"};
deliver;
}
怎样让varnish忽略请求的参数和只缓存目标的实例之一?
删除请求的参数使用一下表达式:
sub vcl_recv {
set req.url = regsub(req.url, "\?.*", "");
}
where……
我怎么找到适合我自己操作系统的安装包?
我们知道varnish提供debin,ubuntu,RHEL,centos,(open)SuSE,gentoo和freebsd,这些系统的二进制包,不管你使用什么包管理器,请阅读 “安装varnish”
can i……
我可以使用varnish做正向代理吗?
不可以,varnish需要配置所有后端服务器到VCL。
我可以在32位机器上运行varnish吗?
可以,不过在32位机器上,会收到一定约束。Varnish在32位机器上不能支持大于2G的存储。推荐使用64 位机器。
我能够在一台机器上同时运行varnish和apache吗?
可以,很多人成功使用了这种方法,不过这会导致资争用。
我能在一个系统上运行多个varnish吗?
可以,指定不同的tcp端口就可以了。
我可以使用一个varnish缓存多个虚拟主机吗?
可以,但是注意内存空间。
我能查看varnish缓存了哪些东西吗?
一些原因导致不可能,如果一个命令列出所有缓存的内容,那么缓存的内容是上千万或者更多,这样会导致系统资源紧张,varnish暂停服务。
我能用varnish加速https吗?
目前还不行,请密切关注我们,我们现在还没计划添加HTTPS支持,不过我们会想办法完成,就像nginx那样。
我能够使用varnish负载均衡后端服务器吗?
可以,你可以使用以下VCL代码:
director foobar round-robin {
{ .backend = { .host = "www1.example.com; .port = "http"; } }
{ .backend = { .host = "www2.example.com; .port = "http"; } }
}
sub vcl_recv {
set req.backend = foobar;
}
(XXX: reference to docs, once written)
why……
为什么varnish将所有的请求都发到后端服务器去了?
通常是两个问题导致的:
1、 目标的TTL过短。通常的解决方式是后端服务器不设置TTL,使用varnish默认的TTL。(默认是120s)
2、 你使用了cookies:
默认情况下,varnish不会缓存backend返回的带cookie的结果。
默认情况下,varnish不对包含cookie的请求服务,直接pass他们到后端服务器。
为什么正则表达式有大小写之分?
在2.10版本之前使用POSIX的正则表达式没有大小写区分,但是2.10以后,使用了PCRE正则表达式,它就对大小写敏感了。(我们保证以后不会在改变这种思想)
让PCRE正则表达式不区分大小写,使用(?!)开始:
if (req.http.host ~ "?iexample.com$") {
...
}
查看PCRE man pages 了解更多信息。
为什么头信息中“Via:”显示1.1,而varnish版本是2.1.x?
Via:number是HTTP协议,不是varnish版本号。
为什么我们叫它“varnish”?
1、 像varnish一样覆盖
2、 顺利和平滑的完成任务
3、 掩盖所有,赋予光滑的表面
为什么安装varnish的系统需要C编译器?
VCL编译需要C编译器来完成。系统的C编译器把VCL编译成动态共享库,然后供varnish使用。所以没有C编译器,varnish不能运行。
安全问题?
你可以在必须的时候修改c编译器的权限或者删除C编译器。
排错
为什么我收到一个缓存命中,而请求还是会发送到后端服务器?
Varnish有一个特色,就是hit for pass,当varnish得到一个后端服务器的响应但是发现这个目标不能被缓存,在这种情况,varnish将创建一个缓存目标记录这个事件,所以下次请求就会直接被pass。