三、Varnish参考手册
 
         VCLvarnish configuration language
         Author:    Dag-Erling Smørgrav
Author:    Poul-Henning Kamp
Author:    Kristian Lyngstøl
Author:    Per Buer
Date:        2010-06-02
Version:   1.0
Manual section:       7
 
DESCRIPTION描述
         VCL语言是varnish HTTP加速器)的一种限定域语言,目的在于规定请求的处理和内容的缓存策略。
         当一个新的配置文件被加载,varnish管理进程把vcl转换成c代码,然后编译成动态共享库连接到服务器进程。
SYNTAX语法
         VCL的语法相当简单,和cperl相似。使用花括号做界定符,使用分号表示声明结束。注释和CC++perl语法一样,你可以自己选择。
         除此之外还类似c语法,比如赋值(=)、比较(==)、和一些布尔值(!、&&||),VCL支持正则表达式,ACL匹配使用 ~ 操作。
         不同于Cperl的地方,反斜杠(\)在VCL中没有特殊的含义。只是用来匹配URLs,所以没有反斜线,请大家自由使用正则表达式。
         把所有的字符串都连接在一起,并不对他们做任何操作。
         分配和介绍设置关键字,VCL没有用户定义的变量,只能给backend、请求、内容这些目标的变量赋值,这些内容大部分是手工输入得,而且给这些变量分配值的时候,必须有一个VCL兼容的单位        
VCLif测试,但是没有循环。
Backend declarations(声明backend
一个backend申明创建和初始化一个backend目标:
backend www {
.host = "www.example.com";
.port = "http";
}
一个请求可以选着一个Backend
if (req.http.host ~ "^(www.)?example.com$") {
  set req.backend = www;
}
为了避免后端服务器过载,.max_connections 可以设置连接后端服务器得最大限制数。
                   backend中申明的timeout参数可以被覆盖,.connect_timeout 等待连接后端的时间,.first_byte_timeout 等待从backend传输过来的第一个字符的时间,.between_bytes_timeout 两个字符的间隔时间
                   示例:
backend www {
  .host = "www.example.com";
  .port = "http";
  .connect_timeout = 1s;
  .first_byte_timeout = 5s;
  .between_bytes_timeout = 2s;
}
         DIRECTORS
Directors 基于健康状态和per-director算法选择不同的客户端。现在存在随机和循环两种director
         定义Directors
director b2 random {
  .retries = 5;
  {
    // We can refer to named backends
    .backend = b1;
    .weight  = 7;
  }
  {
    // Or define them inline
    .backend  = {
      .host = "fs2";
    }
  .weight         = 3;
  }
}
         The random director
         任意的director使用.retries.这个参数指定查找可用后端的次数。默认director中的所有后端的.retries相同。
                   每个后端的选项 .weight ,和发送多少流量到这个后端有关。
         THE round-robin director
                   Round-robin没有什么选项。
         Bckend probes(后端探针)
                   探测后端,确定他们是否健康。返回的状态使用req.backend.healthy核对。.window我们检查到的最近的polls数量。.threshold 多少polls成功,我们就认为后端是健康的。.intial是多少探针确定varnish状态正常,默认和threshold值一样。
                   一个后端定义探针示例:
backend www {
  .host = "www.example.com";
 .port = "http";
  .probe = {
    .url = "/test.jpg";
    .timeout = 0.3 s;
    .window = 8;
    .threshold = 3;
    .initial = 3;
  }
}
                   他可以指定原始的http请求:
backend www {
  .host = "www.example.com";
  .port = "http";
  .probe = {
    # NB: \r\n automatically inserted after each string!
    .request =
      "GET / HTTP/1.1"
      "Host: www.foo.bar"
      "Connection: close";
  }
}
         ACLS
一个ACL给一个访问控制列表命名,随后可以通过调用ACL名字来匹配对应的客户端地址。
acl local {
  "localhost";         // myself
  "192.0.2.0"/24;      // and everyone on the local network
  ! "192.0.2.23";      // except for the dialin router
}
                   如果一个ACL中指定一个主机名,varnish不能解析,他将解析匹配到所有地址。
                   果你使用了一个否定标记(!),那么将拒绝匹配所有主机。
                   下面是一个匹配的示例:
                   if (client.ip ~ local) {
                     pipe;
                   }