美文网首页
varnish配置文件详解(二)

varnish配置文件详解(二)

作者: 董大志 | 来源:发表于2018-07-02 19:31 被阅读0次

    参考链接详见:
    https://blog.csdn.net/keda8997110/article/details/8777153
    这篇文章是为了深入了解varnish的配置文件!!


    1.backend 创建

    1)定义一个webserver后台
    backend webserver {  
        .host = "127.0.0.1";  
        .port = "80";  
        .connect_timeout = 4s;             # 定义的是等待连接后端的时间
        .first_byte_timeout = 5s;          #等待从backend传输过来的第一个字节的时间
        .between_bytes_timeout = 20s;      # 两个字节的间隔时间
    }  
    

    既然Varnish需要在多台服务器上缓存数据,就需要Varnish映射所有的URL到一台单独的主机。该块配置用于定义一台Varnish默认访问的后端服务器,当Varnish需要从后端服务器获取数据时,就会访问自己的80端口。


    2)定义一个img后台
    backend img {  
        .host = "127.0.0.1";  
        .port = "8090";  
    }  
    

    Varnish也可以定义多台后端服务器实现负载均衡的目的。
    当然还可以增加一个backend,用于访问本机的8090端口,假设通过该端口提供图片服务。


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

    当匹配img的URL时,需把请求发送到上面定义的backend img,其他的请求发送到backend webserver。


    Varnish不仅仅可以定义多个backend,还可以把多个backend合成一个组,使用循环的方式把请求分配给组中的backends。并且Varnish会根据健康检查情况来判断后端服务器是否正常提供服务。


    2.各种模块

    Varnish使用区域语言VCL来管理定义Varnish的存取策略.

    1.vcl_recv模块:用于接收和处理请求

    此模块一般以如下几个关键字结束:
    pass:表示进入pass模式,把请求交给vcl_pass模块处理。
    pipe:表示进入pipe模式,把请求交给vcl_pipe模块处理。
    error code [reason]:表示把错误标识返回给客户端,并放弃处理该请求。错误标识包括200、405等。"reason"是对错误的提示信息。

    2.vcl_pipe模块

    此模块在请求进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,也就是在当前连接未关闭时,服务器将不变的内容返回给客户端,直到该连接被关闭。

    3.vcl_pass模块

    此模块表示当请求被pass后,用于将请求直接传递至后端应用服务器。后端应用服务器在接收请求后将数据发送给客户端,但不进行任何数据的缓存,在当前连接下每次都返回最新的内容。

    4.lookup

    一个请求在vcl_recv中被lookup后,Varnish将在缓存中提取数据。如果缓存中有相应的数据,就把控制权交给vcl_hit模块;如果缓存中没有相应的数据,请求将被设置为pass并将其交给vcl_miss模块。

    5.vcl_hit模块

    执行lookup指令后,Varnish在缓存中找到请求的内容后将自动调用该模块。在此模块中,deliver表示将找到的数据发送给客户端,并把控制权交给vcl_deliver模块。

    6.vcl_miss模块

    执行lookup后,Varnish在缓存中没有找到请求的内容时会自动调用该方法。此模块可以用于判断是否需要从后端服务器获取内容。在此模块中,fetch表示从后端获取请求的数据,并把控制权交给vcl_fetch模块。

    7.vcl_fetch模块

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

    8.vcl_deliver模块

    当一个没有被缓存的数据交付给客户端的时候被调用。

    9.vcl_timeout 模块

    在缓存数据到期前调用此模块。在此模块中,discard表示从缓存中清除到期数据。

    10.vcl_discard模块

    在缓存数据到期后或缓存空间不够时,自动调用该模块。在此模块中keep表示将数据继续保留在缓存中。


    3.模块解析

    acl purge {  
        "localhost";  
        "127.0.0.1";  
        "18.81.12.10";  
    }  
     
     
    if (req.request == "PURGE") {  
        if (!client.ip ~ purge) {  
            error 405 "Not allowed.";  
        }  
        return(lookup);  
    }  
    

    这两个规则定义了允许哪些主机通过HTTP来执行PURG进行缓存删除。如果不是指定的IP,就会出现HTTP 405错误,提示Not allowed错误字样。

    if (req.http.host ~ "^(read)?.aaa.com$") {  
        set req.backend = webserver;   
        if (req.request != "GET" && req.request != "HEAD") {  
            return(pipe);  
        }else {  
            return(lookup);  
        }  
    } else {  
        error 404 " Cache Server";   
        return(lookup);  
    }  
    

    这段条件判断用于对aaa.com域名进行缓存加速,aaa.com是泛指概念,也就是说所有以aaa.com结尾的域名都进行缓存。而if (req.request != "GET" && req.request != "HEAD") 表示"如果请求的类型不是GET与HEAD",则返回错误码404。

    if (req.url ~ "^/images") {  
        unset req.http.cookie;  
    }  
    

    这条规则的意思是清除服务器上/images目录下的所有缓存,当这个请求在后端服务器生效时,如果访问的URL匹配这个规则,那么头信息中的cookie就会被删除。

    if (req.request == "GET" && req.url ~ "\. (png|swf|txt|png|gif|jpg|css|js|htm| html)$") {  
        unset req.http.cookie;  
    }  
    if (req.http.x-forwarded-for) {   
        set reqreq.http.X-Forwarded-For =   req.http.X-Forwarded-For ", " client.ip;
    }else { 
        set req.http.X-Forwarded-For = client.ip; 
    }  
    

    因为Squid、Varnish都会把客户端的IP地址放在HTTP_X_FORWARDED_FOR里面传给后端的Web服务器,所以后端的Web程序都要对其进行调用。

    if (req.request != "GET" &&  
        req.request != "HEAD" &&  
        req.request != "PUT" &&  
        req.request != "POST" &&  
        req.request != "TRACE" &&  
        req.request != "OPTIONS" &&  
        req.request != "DELETE") {  
        return (pipe);  
     }  
    

    该if判断表示如果请求的类型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE时,则进入pipe模式。注意这里的"&&"是与的关系。

    if (req.request == "GET" && req.url ~ "\. (png|swf|txt|png|gif|jpg|css|js|htm| html)") {  
        set beresp.ttl = 180s;  
    } else {  
        set beresp.ttl = 30d; 
    }
    return (deliver);  
    

    该if判断用于对请求类型是GET,并且请求的URL以png、swf、txt、gif、css、js等结尾时,则进行缓存,缓存时间为180秒。其他缓存为30天。

    sub vcl_deliver {  
        set resp.http.x-hits = obj.hits ;  
        if (obj.hits > 0) {  
            set resp.http.X-Cache = "HIT read.easouu.com";  
        }else {  
        set resp.http.X-Cache = "MISS read.easou.com";  
        }  
    }
    

    这个模块定义的是添加一个Header标识,以判断缓存是否命中。

    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> 
          <hr> 
          <address> 
             <a href="http://read.easou.com/">read.easou.com</a> 
          </address> 
       </body> 
    </html> 
    "};  
     return (deliver);  
    }  
    

    最后这个模块定义了访问错误页面时的返回信息。
    现在varnish配置基本完成,可以在8080端口上启动varnish,并进行一些基本的测试。


    以上便是整个varnish的基本配置
    因为没有适用改文档的配置文件,只是用来了解的。
    完整的基本配置可参考:https://www.jianshu.com/p/ffdc53ed0115 里面的配置文件。还有详细的varnish的编译安装过程!!


    people people for me ,me for people people!!

    相关文章

      网友评论

          本文标题:varnish配置文件详解(二)

          本文链接:https://www.haomeiwen.com/subject/etrluftx.html