• 【一周"纪"录】"狐狸"外逃,海外群众也不会放过他们 2019-06-24
  • 浙江宁波:全国失信被执行人将面临联合信用惩戒 2019-06-24
  • 其实逻辑跟简单:小萌们如果能把自己计划好又何至于悲催到要通过混淆所有制形式把别人的钱偷到自己口袋里? 2019-06-20
  • 您访问的页面找不回来了 2019-06-19
  • 人工智能驱动数字经济发展 2019-06-11
  • 再添4个代建项目 轻资产模式加速下的建业地产千亿图景 ——凤凰网房产北京 2019-06-11
  • 俄媒:普京高度评价中国之行} 2019-06-09
  • 南通如皋为应对督察“回头看”违法掩埋危险废物 2019-06-09
  • 惊险刺激!300米悬崖荡秋千 体验180°空中回荡 2019-06-08
  • 特氏说让日韩买单并没有提中国。你为何把中国加上啊? 2019-06-08
  • 关于开展对我市改革建言献策活动的启事 2019-06-08
  • 南宁前7月有115个空气优质天 美丽“南宁蓝”常现 2019-06-07
  • 警车化身“产房” 冰雪路上“生命接力” 2019-06-07
  • 为何一个不在城中心的儿童之家成为全省最美? 2019-06-07
  • 美对华发起第七次双反调查 专家:或另有深意 2019-06-06
  • Jquery中文网 码报 www.okkrb.tw
    Jquery中文网 >  服务器技术  >  应用加速  >  正文 varnish反向代理缓存配置详解

    2018年神童透码报:varnish反向代理缓存配置详解

    发布时间:2014-08-15   编辑:码报 www.okkrb.tw
    varnish反向代理缓存配置详解
    本文介绍varnish的反向代理配置
    Varnish软件主页地址:
    //www.varnish-cache.org
    Varnish下载地址:
    //repo.varnish-cache.org/source/varnish-2.1.5.tar.gz
    下载:
    Wget //repo.varnish-cache.org/source/varnish-2.1.5.tar.gz
    解压:
    tar –zxvf varnish-2.1.5.tar.gz
    cd varnish-2.1.5
    ./configure –prefix=/soft/varnish
    Varnish需要pcre支持,如果服务器没有安装pcre-devel会提示需要指定prce目录。
    Centos服务器上使用yum install pcre-devel安装
    编译:make
    安装:make install
    varnish的配置文件非常简单,只要将默认配置文件中的一些注释去掉,稍加修改就可以使用了。
    Varnish的配置文件路径:
    /soft/varnish/etc/varnish/default.vcl
    需要修改的地方:
    复制代码 代码如下:
    backend default {
         .host = "127.0.0.1";
         .port = "80";
    }
    这是varnish读取后端服务器的地址和端口,根据自己需要修改。在安装varnish之前确保服务器的web服务已经配置正确并可以访问,本机的web服务运行在80端口。
    安装配置好之后就可以启动varnish了。
    /soft/varnish/sbin/varnishd -f /soft/varnish/etc/varnish/default.vcl -s malloc,200M -T 127.0.0.1:2000 -a 0.0.0.0:8080
    这里解释一下,-f参数是制定配置文件的路径,-s malloc是指后端缓存类型为内存,大小200M,单位也可以是G,-T 127.0.0.1:2000 是监听的管理地址和端口,-a 0.0.0.0:8080是varnish对外服务的地址端口,这里监听本机所有地址的8080端口,8080端口就是我们访问缓存对外的服务端口。
    启动之后就可以通过浏览器测试缓存是否启用:
    访问://ip:8080看访问的信息是不是后端web服务器的信息,如果看到和原web服务器一样的信息表示缓存配置成功。
    也可以通过firefox的firebug插件来观察访问请求是否通过了缓存系统,正常情况下可以看到:
    响应头信息
    Server Apache/2.2.17 (Unix) PHP/5.3.3
    Content-Type text/html;charset=ISO-8859-1
    Content-Length 437
    Date Mon, 28 Feb 2011 10:51:03 GMT
    X-Varnish 1343878737 1343878732
    Age 7
    Via 1.1 varnish
    Connection keep-alive
    Varnish和squid不同的地方在于,varnish将缓存的文件全部放置在一个文件中,这在第一次启动缓存时会创建。而Squid将缓存文件放在多个多层目录中。
    现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varni
    3、内置公用变量
     VCL内置的公用变量可以用在不同的VCL函数中,根据这些公用变量使用的不同阶段,下面依次介绍。
    当请求到达后,可以使用的公用变量如表2所示:
    表2
    公用变量名称    含义
    req.backend        指定对应的后端主机
    server.ip              表示服务器端IP
    client.ip               表示客户端IP
    req.request          指定请求的类型,例如GET、HEAD、POST等
    req.url                 指定请求的地址
    req.proto            表示客户端发起请求的HTTP协议版本
    req.http.header   表示对应请求中的http头部信息
    req. restarts         表示请求重启的次数,默认最大值为4
    Varnish               在向后端主机请求时,可以使用的公用变量如表3所示:
    表3
    公用变量名称 含义
    beresp.request 指定请求的类型,例如GET、HEAD等
    beresp.url 指定请求的地址
    beresp .proto 表示客户端发起请求的HTTP协议版本
    beresp .http.header 表示对应请求中的http头部信息
    beresp .ttl 表示缓存的生存周期,也就是cache保留多长时间,单位是秒
    从cache或者后端主机获取内容后,可以使用的公用变量如表4所示:
    表4
    公用变量名称 含义
    obj.status 表示返回内容的请求状态代码,例如200、302、504等
    obj.cacheable 表示返回的内容是否可以缓存,也就是说,如果HTTP返回是200、203、300、301、302、404、410等,并且有非0的生存期,则可以缓存
    obj.valid 表示是否是有效的HTTP应答
    obj.response 表示返回内容的请求状态信息
    obj.proto 表示返回内容的HTTP协议版本
    obj.ttl 表示返回内容的生存周期,也就是缓存时间,单位是秒
    obj.lastuse 表示返回上一次请求到现在的间隔时间,单位是秒
    对客户端应答时,可以使用的公用变量如表5所示:
    表5
    公用变量名称 含义
    resp.status 表示返回给客户端的HTTP状态代码
    resp.proto 表示返回给客户端的HTTP协议版本
    resp.http.header 表示返回给客户端的HTTP头部信息
    resp.response 表示返回给客户端的HTTP状态信息
    在上面的讲述中,我们只是介绍了常用的VCL内置公用变量,如果需要了解和使用更多的公用变量信息,请登录varnish官方网站查阅。

    三 、配置一个简单的Varnish实例
     由于版本的不同,Varnish配置文件的写法也存在一定差异,varnish2.x版本和1.x版本之间不但配置文件写法不同,而且新的版本功能也增加很多,并且去除了很多应用BUG,这里讲述的版本是varnish2.1.2,配置文件写法也以varnish2.x版本为基准。
    Varnish安装完成后,默认的配置文件为/usr/local/varnish/etc/varnish/default.vcl,此文件内容默认全部被注释掉了,这里,我们以这个文件为模板,创建一个新的文件vcl.conf,并且放到/usr/local/varnish/etc目录下,配置完成的vcl.conf文件如下:
    #通过backend定义了一个名称为webserver的后端主机,“.host”指定后端主机的IP地址或者域名,“.port”指定后端主机的服务端口。其中,“192.168.12.26”就是后端的一个web服务器。
    复制代码 代码如下:
    backend webserver {
         .host = "192.168.12.26";
         .port = "80";
     }
    #调用vcl_recv开始。
    sub vcl_recv {
            if (req.http.x-forwarded-for) {
                    set req.http.X-Forwarded-For =
                        req.http.X-Forwarded-For ", " client.ip;
            } else {
                    set req.http.X-Forwarded-For = client.ip;
            }
    #如果请求的类型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE时,进入pipe模式。注意这里是“&&”的关系。
            if (req.request != "GET" &&
               req.request != "HEAD" &&
               req.request != "PUT" &&
               req.request != "POST" &&
               req.request != "TRACE" &&
               req.request != "OPTIONS" &&
               req.request != "DELETE") {
               return (pipe);
            }
    #如果请求的类型不是GET与HEAD,则进入pass模式。
       if (req.request != "GET" && req.request != "HEAD") {
               return (pass);
            }
    #对ixdba.net或者ixdba.cn两个域名进行缓存加速,这是个泛域名的概念,也就是所有以ixdba.net或者ixdba.cn结尾的域名都进行缓存。
            if (req.http.host ~ "^(.*).ixdba.net" || req.http.host ~ "^(.*).ixdba.cn") {
               set req.backend = webserver;
            }
    #对以.jsp和.do结尾以及带有?的URL时,直接从后端服务器读取内容。
            if (req.url ~ ".(jsp|do)($|?)") {
               return (pass);
            } else {
            return (lookup);
            }
    }
     
    sub vcl_pipe {
        return (pipe);
    }
     
    sub vcl_pass {
        return (pass);
    }
     
    sub vcl_hash {
        set req.hash += req.url;
        if (req.http.host) {
            set req.hash += req.http.host;
        } else {
            set req.hash += server.ip;
        }
        return (hash);
    }
     
    sub vcl_hit {
        if (!obj.cacheable) {
            return (pass);
        }
        return (deliver);
    }
     
    sub vcl_miss {
        return (fetch);
    }
     
    sub vcl_fetch {
         if (!beresp.cacheable) {
             return (pass);
         }
         if (beresp.http.Set-Cookie) {
             return (pass);
         }
    #当url中包含servlet时,不进行缓存。
        if (req.url ~ "^/servlet/") {
            return (pass);
        }
    #当url中包含services时,不进行缓存。
        if (req.url ~ "^/services/") {
            return (pass);
        }
    #对于请求类型是GET,并且请求的URL中包含upload,那么就进行缓存,缓存的时间是300秒,即5分钟。
        if (req.request == "GET" && req.url ~ "^/upload(.*)$") {
           set beresp.ttl = 300s;
        }
    #对于请求类型是GET,并且请求的URL以png、xsl、xml、gif、css、js等结尾时,则进行缓存,缓存时间为600秒。
        if (req.request == "GET" && req.url ~ ".(png|xsl|xml|pdf|ppt|doc|docx|chm|rar|zip|bmp|jpeg|swf|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|swf|txt|png|gif|jpg|css|js|html|htm)$") {
           set beresp.ttl = 600s;
        }
        return (deliver);
    }
      #下面是添加一个Header标识,以判断缓存是否命中。
    sub vcl_deliver {
        if (obj.hits > 0) {
           set resp.http.X-Cache = "HIT from www.ixdba.net";
        } else {
          set resp.http.X-Cache = "MISS from www.ixdba.net";
        }
        return (deliver);
    }

    三、squid3.0安装及其配置
    官方地址https://www.varnish-cache.org/
    tar varnish-3.0.0.tar.gz
    cd varnish-3.0.0
    ./configure --prefix=/usr/local/varnish3.0
    make && make install
    配置实例及说明
    vim /usr/local/varnish3.0/etc/varnish/default.vcl
    #设置后端服务
    复制代码 代码如下:
    backend test1 {
        .host = "192.168.100.5";
        .port = "80";
        .connect_timeout = 1s;
        .first_byte_timeout = 5s;
        .between_bytes_timeout = 2s;
    }
    backend test2 {
        .host = "192.168.100.6";
        .port = "80";
        .connect_timeout = 1s;
        .first_byte_timeout = 5s;
        .between_bytes_timeout = 2s;
    }
    #定义负载均衡
    director lb_test random {
        {
          .backend = test1;
          .weight = 5;
         }
         {
           .backend = test2;
           .weight = 5;
         }
    }
    #定义访问控制列表
    acl purge {
        "localhost";
        "127.0.0.1";
        "192.168.100.0"/24;
        "192.168.0.0"/24;
    }
    sub vcl_recv {
    #开启压缩模式,图片格式取消压缩
    if (req.http.Accept-Encoding) {
        if (req.url ~ ".(jpg|png|gif|jpeg|flv)" ) {
            remove req.http.Accept-Encoding;
            remove req.http.Cookie;
        } else if (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } else if (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            remove req.http.Accept-Encoding;
        }
    }
    #根据host设置后端服务器
      if (req.http.Host ~ "(?i)(www.test1.com|www.test2.com)") {
         set req.backend = lb_test;
       }else
      if (req.http.Host ~ "(?i)image.wdj.com"){
         set req.backend = test1;
      }else
      {
        error 408 "Hostname not found";
      } 
    #如果为purge请求,客户端ip不在访问列表中,返回405拒绝
      if (req.request == "PURGE") {
         if (!client.ip ~purge) {
           error 405 "Not Allowed";
       }
    #本地缓存查找
       return(lookup);
      }
    #如果为GET请求,url后缀为jpg,png,gif等 取出cookie
      if (req.request == "GET"&&req.url ~ "(?i).(jpg|png|gif|swf|jpeg|ico)$") {
            unset req.http.cookie;
      }
    #如果GET请求,url为php,则穿过cache,不缓存
      if (req.request =="GET"&&req.url ~ "(?i).php($|?)"){
            return (pass);
      }
    #简单防盗链
    if (req.http.referer ~ "//.*") {
      if ( !(req.http.referer ~ "//.*test1.com"
         || req.http.referer ~ "//.*test2.com"
         || req.http.referer ~ "//.*wdj.com"
         || req.http.referer ~ "//.*google.com"
         || req.http.referer ~ "//.*baidu.com"
         || req.http.referer ~ "//.*yahoo.cn"
      )) {
          error 404 "Not Found!";
     }
    }
    #获取客户端ip
    #     if (req.restarts == 0) {
            if (req.http.x-forwarded-for) {
                set req.http.X-Forwarded-For =
                    req.http.X-Forwarded-For + ", " + client.ip;
            } else {
                set req.http.X-Forwarded-For = client.ip;
            }
    #   }
    #不是以下请求进入pipe???br />     if (req.request != "GET" &&
          req.request != "HEAD" &&
          req.request != "PUT" &&
          req.request != "POST" &&
          req.request != "TRACE" &&
          req.request != "OPTIONS" &&
          req.request != "DELETE") {
            /* Non-RFC2616 or CONNECT which is weird. */
            return (pipe);
        }
    #不是GET 和HEAD请求不缓存
        if (req.request != "GET" && req.request != "HEAD") {
            /* We only deal with GET and HEAD by default */
            return (pass);
        }
        if (req.http.Authorization) {
            /* Not cacheable by default */
            return (pass);
        }
        return (lookup);
    }
    #
     sub vcl_pipe {
         return (pipe);
     }
    #
    sub vcl_pass {
        return (pass);
    }
    #使用url+host hash算法查找数据
    sub vcl_hash {
        hash_data(req.url);
        if (req.http.host) {
            hash_data(req.http.host);
        } else {
            hash_data(server.ip);
        }
        return (hash);
    }
    # 如果请求为purge 将清除缓存
    sub vcl_hit {
       if (req.request == "PURGE") {
           set obj.ttl = 0s;
           error 200 "Purged";
        }
        return (deliver);
    }
    sub vcl_miss {
        return (fetch);
    }
    #
    sub vcl_fetch {
        if (beresp.ttl <= 0s ||
            beresp.http.Set-Cookie ||
            beresp.http.Vary == "*") {
                    /*
                     * Mark as "Hit-For-Pass" for the next 2 minutes
                     */
                    set beresp.ttl = 0 s;
                    return (hit_for_pass);
        }
        if (beresp.http.Pragma ~"no-cache" ||
        beresp.http.Cache-Control ~"no-cache" ||
        beresp.http.Cache-Control ~"private") {
          return (deliver);
       }
    #为特定格式文件设置缓存时间
        if (req.request == "GET"&&req.url ~ "(?i).(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$") {
        set beresp.ttl = 30d;
      }
       if (req.request == "GET"&&req.url ~ "(?i).(html|htm)$") {
        set beresp.ttl = 1d;
      }
        return (deliver);
    }
    # 设置返回状态
     sub vcl_deliver {
         set resp.http.x-hits = obj.hits;
         if (obj.hits > 0) {
          set resp.http.X-Cache = "Hit test.com";
       }else {
           set resp.http.X-Cache = "Miss test.com";
       }
         set resp.http.Server = "BWM";
         return (deliver);
     }
    # 定义错误
    sub vcl_error {
        set obj.http.Content-Type = "text/html; charset=utf-8";
        set obj.http.Retry-After = "5";
        synthetic {"
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "//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>"} + obj.response + {"<h3>Guru Meditation:</h3>XID: "} + req.xid + {"<hr>Varnish cache server
      </body>
    </html>
    "};
        return (deliver);
    }
    sub vcl_init {
            return (ok);
    }
    sub vcl_fini {
            return (ok);
    }

    四、启动
    启动命令
    /usr/local/varnish3.0/sbin/varnishd  -f /usr/local/varnish3.0/etc/varnish/default.vcl  -s malloc,2G  -a 0.0.0.0:80 -w 1024,51200,10 -t
    3600 -T 192.168.100.2:3500
    检测配置文件是否存在错误
    /usr/local/varnish3.0/sbin/varnishd -C -f /usr/local/varnish3.0/etc/varnish/default.vcl
    参数
    -a  address:port 监听端口
    -f  指定配置文件
    -s 指定缓存类型 malloc为内存, file 文件缓存
    -t 默认TTL
    -T address:port 管理端口
    -w 最小线程,最大线程,超时时间
    记录varnish日志
     /usr/local/varnish3.0/bin/varnishncsa -w /var/logs/varnish.log &

    五、缓存刷新
    php脚步如下:
    复制代码 代码如下:
    <?php  
    function purge($ip, $url)  
    {  
        $errstr = '';  
        $errno = '';  
        $fp = fsockopen ($ip, 80, $errno, $errstr, 2);  
        if (!$fp)  
        {  
             return false;  
        }  
        else 
        {  
            $out = "PURGE $url HTTP/1.1rn";  
            $out .= "Host:image.wdj.comrn";  
            $out .= "Connection: closernrn";  
            fputs ($fp, $out);  
            $out = fgets($fp , 4096);  
            fclose ($fp);  
             return true;  
        }  
    }  
    if(isset($_POST['content'])) {
    //$str=str_replace("r","
    ",$_POST[content]);
    $arr=(explode("n",$_POST['content']));
    $Server="192.168.100.2";
    foreach ($arr as $value)
    {
      echo $value;
      purge($Server, $value);  
      echo "刷新成功"."<br />";
    }
    //purge($Server, "$_POST[content]");  
    //echo "刷新成功";
    }
    ?> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="//www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>varnish缓存刷新</title>
    </head>
    <body>
    <form action="?" method="post">
    填写需要刷新url<br />
    <textarea name="content" cols="40" rows="10"></textarea>
    <input type="submit" value="submit" />
    </form>
    </body>
    </html>
     
    ######################
    通过管理端口清除缓存
    telnet 192.168.100.2 3500
    3.0版本 为ban.url aaaa.html
    2.版本为purge.url aaaa.html
    vcl.load平滑切换配置文件
    vcl.load 配置文件名   文件路径
    例如vcl.load 123  /usr/local/varnish3.0/etc/varnish/default.vcl。 

    码报 www.okkrb.tw 您可能感兴趣的文章:
    nginx配置反向代理的简单示例
    Varnish2.1.4配置缓存服务器
    varnish反向代理缓存配置详解
    varnish缓存策略及缓存时间计算方法
    squid反向代理配置(web服务器的前端内容缓存器)
    varnish的VCL的配置详解
    varnish 503和varnish 400错误的解决方法
    squid2.6反向代理实验模型
    Ubuntu下varnish的安装配置文档
    使用Xcache加速你的PHP网站

    [关闭]
  • 【一周"纪"录】"狐狸"外逃,海外群众也不会放过他们 2019-06-24
  • 浙江宁波:全国失信被执行人将面临联合信用惩戒 2019-06-24
  • 其实逻辑跟简单:小萌们如果能把自己计划好又何至于悲催到要通过混淆所有制形式把别人的钱偷到自己口袋里? 2019-06-20
  • 您访问的页面找不回来了 2019-06-19
  • 人工智能驱动数字经济发展 2019-06-11
  • 再添4个代建项目 轻资产模式加速下的建业地产千亿图景 ——凤凰网房产北京 2019-06-11
  • 俄媒:普京高度评价中国之行} 2019-06-09
  • 南通如皋为应对督察“回头看”违法掩埋危险废物 2019-06-09
  • 惊险刺激!300米悬崖荡秋千 体验180°空中回荡 2019-06-08
  • 特氏说让日韩买单并没有提中国。你为何把中国加上啊? 2019-06-08
  • 关于开展对我市改革建言献策活动的启事 2019-06-08
  • 南宁前7月有115个空气优质天 美丽“南宁蓝”常现 2019-06-07
  • 警车化身“产房” 冰雪路上“生命接力” 2019-06-07
  • 为何一个不在城中心的儿童之家成为全省最美? 2019-06-07
  • 美对华发起第七次双反调查 专家:或另有深意 2019-06-06
  • 丧尸来袭走势图 千斤顶或更好彩金 西甲巴拉多利德叫什么 阿布扎比瓦赫达vs塔什干火车头 柔佛dt亚冠 皇家贝蒂斯vs毕尔巴鄂竞技 四灵游戏 巴萨vs莱万特视频直播 公鸡王电子 西班牙人生活英文