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
                             使用VCL代码完成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()函数来完成,下面是一个例子:
                           
                            if (req.http.host ~ "^(www.)?example.com")
                             { 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 {"
                               
                               
                                 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                               
                                 
                                    "} obj.status " " obj.response {"
                                 
                                 
                                 

Error "} obj.status " " obj.response {"

                                 

"} obj.response {"

                                   

Guru Meditation:

                                   

XID: "} req.xid {"

                                 
                                
                                 "};
                                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。