IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    varnish简明教程

    mckee发表于 2016-01-21 01:11:12
    love 0

    varnish介绍
    Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,使用内存缓存,性能优秀.以下是varnish和其它软件的对比:
    9cf7059c7e989a140d001314222250bb_b.jpg
    varnish原理
    从客户端接收请求然后尝试从缓存中获取数据来响应客户端的请求,如果varnish不能从缓存中获得数据来响应客户端,它将转发请求到后端(backend servers),获取响应同时存储,最后交付给客户端。
    varnish安装(ubuntu)

    sudo apt-get install apt-transport-https
    sudo curl https://repo.varnish-cache.org/ubuntu/GPG-key.txt | apt-key add -
    echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list
    sudo apt-get update
    sudo apt-get install varnish

    varnish快速使用
    (1)编辑/etc/varnish/default.vcl中backend default部分:
    backend default {
        .host = "www.phpddt.com";
        .port = "80";
    }

    (2)启动varnish
    /usr/sbin/varnishd -P /run/varnishd.pid -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

    (3)参数选项说明:
    • -f 指定 varnish 的配置文件位置
    • -s 指定 varnish 缓存存放的方式,常用的方式有:“-s file,<dir_or_file>,<size>”。
    • -T address:port 设定 varnish 的 telnet 管理地址及其端口
    • -a address:port 表示 varnish 对 http 的监听地址及其端口

    varnish配置
    (1)VCL配置语言介绍
    Varnish使用领域专用语言(DSL)作为Varnish配置语言,简写VCL.
    • 块是由花括号分隔,语句以分号结束,使用‘ # ’符号可以添加注释。
    • VCL 使用指定运算符“=”、比较运算符“==”、逻辑运算符“!,&&,!!”等形式,还支持正则表达式和用“~”进行 ACL 匹配运算。
    • VCL 没有用户自己定义的变量,你可以在 backend、request 或 object 上设置变量值,采用 set 关键字进行设置。例如 set req.backend = director_employeeui;
    • 两个字符串的连接,他们之间没有任何运算符

    (2)后端集合director
    VCL 可以把多个 backends 聚合成一个组,这些组被叫做 director,这样可以增强性能和弹力,当组里一个 backend 挂掉后,可以选择另一个健康的 backend。VCL 有多种 director,不同的 director 采用不同的算法选择 backend,主要有以下几种:
    • Random director 会根据所设置的权值(weight)来选择 backend,.retries 参数表示尝试找到一个 backend 的最大次数,.weight 参数表示权值
    • Round-robin director 在选择 backend 时,会采用循环的方式依次选择。
    • Client director 根据 client.identity 来选择 backend,您可以设置 client.identity 的值为 session cookie 来标识 backend。 

    (3)使用probe进行健康检测
    backend server1 {
      .host = "server1.example.com";
      .probe = {
             .url = "/test.jpg"; //哪个 url 需要 varnish 请求
             .interval = 5s;     //检查的时间间隔
             .timeout = 1 s;     //等待多长时间超时
             .window = 5;        //维持 5 个 sliding window 的结果 
             .threshold = 3;     //至少有三次 window 是成功的,就宣告 backend 健康
        }
      }
    backend server2 {
       .host = "server2.example.com";
       .probe = {
             .url = "/test.jpg";
             .interval = 5s;
             .timeout = 1 s;
             .window = 5;
             .threshold = 3;
       }
     }

     (4)VCL 内置函数
    vcl_recv 函数
    用于接收和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。

    vcl_pipe 函数
    此函数在进入 pipe 模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个连接被关闭。

    vcl_pass 函数
    此函数在进入 pass 模式时被调用,用于将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容

    vcl_hash 函数
    当您想把一个数据添加到 hash 上时,调用此函数。

    vcl_hit 函数
    在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数。

    vcl_miss 函数
    在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容

    vcl_fetch 函数
    在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。

    vcl_deliver 函数
    将在缓存中找到请求的内容发送给客户端前调用此方法。

    vcl_error 函数 出现错误时调用此函数。 
    简单例子:
    当匹配img的URL时,需把请求发送到上面定义的backend img,其他的请求发送到backend webserver。

    sub vcl_recv {  
    	if (req.url ~ "^/img/") {  
    		set req.backend = img;  
    	} else {  
    		set req.backend = webserver.  
    	}  
    } 

    参考资料
    • http://www.ibm.com/developerworks/cn/opensource/os-cn-varnish-intro/#resources
    • https://www.varnish-cache.org/docs/4.0/users-guide/index.html



沪ICP备19023445号-2号
友情链接