美文网首页
Varinsh 安装与配置

Varinsh 安装与配置

作者: w也不知道 | 来源:发表于2017-08-07 09:55 被阅读0次

    一: HTTP相关内容

    1. 常见 HTTP 状态码
    200:成功
    206:请求体太大,分段请求
    301:永久重定向
    302:暂时重定向
    304:浏览器缓存文件内容没发生改变,可以继续使用
    403:网站服务器没有权限读取该请求内容
    404:请求页面找不到
    405:禁用的请求方法
    5XX:服务器内部发生错误
    
    1. HTTP 头部信息
    通用
        Connection:close|keep-alive
        Date:日期时间
        Host:请求的主机
        paragma:no-cache
        Via:请求或响应消息,在客户端和服务器端之间所经过的代理
        Transfer-Encoding:消息主机的传输编码方式,chunked表示采用块编码的方式
     请求
        If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它
        If-None-Match
        Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
        User-Agent:客户端浏览器类型
         Host:请求的主机
        Accept-Encoding:接受的编码方式
        Accept-Language:接受的自然语言
        Accept-Charest:接受字符集
        Authorization:服务器发送www-authenticat时,客户通过此首部提供认证信息
     响应
        Etag:内容的标签
        Location:重定向后的新位置
        Server:服务器软件信息
        WWW-Authenticate:要求对客户端进行认证
     实体
        Content-Encoding
        Content-Language
        Content-Length:实体大小
        Content-Type:内容的MIME格式
        Expires:应该在什么时候认为文档已经过期,从而不再缓存它
        Last-Modified:文档最后改动时间
    
    1. 缓存处理的具体步骤
    接受请求
    解析请求(代理的功能)
    查询缓存(检查本地缓存中是否存在对方请求的内容的副本)
    副本的新鲜度检测(检查本地缓存的副本是否为最新版本)
    构建响应(代理的功能)
    发送响应
    记录日志
    

    二: varinsh

    1. varinsh 程序架构


    Management 进程:编译VCL并应用新配置、监控varnish、初始化varnish,并提供一个CLI。
    Child/Cache 线程:
        Acceptor:接收新的连接请求;
        Worker:用于处理并响应用户请求;
        Expiry:从缓存中清理过期cache object
        日志进程:Shared Memory Log,  共享内存内存日志大小一般90MB;分为两部分:前一部分为计数器、后一部分为客户请求相关的数据。
        varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示
    
    1. Vcl内置函数和处理流程(状态引擎)
      vcl内置函数:
    vcl_recv:用于接受和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。
    vcl_fetch(vcl_backend_response):根据服务器端的响应作出缓存决策,如判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。
    vcl_pipe:对于无法理解的用户请求,将请求直接发往后端主机;
    vcl_hash:自定义hash生成时的数据来源
    vcl_pass:用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存。
    vcl_hit:从缓存中查找到缓存对象时要执行的操作;
    vcl_miss:从缓存中查找不到缓存对象时要执行的操作;
    vcl_deliver:将用户请求的内容响应给客户端时用到的方法; 
    vcl_error:在varnish端合成错误响应而时;
    

    vcl配置语法:

    (1) //, #, /*comment*/用于注释;
    (2) sub $NAME 用于定义函数;
    (3) 不支持循环;
    (4) 有众多内置变量;
    (5) 支持终止语句,没有返回值;
    (6) “域”专用语言;
    (7) 操作符: =, ==, ~, !, &&, ||
    
    vcl状态转换图
    1. varnish4 安装
    https://varnish-cache.org/releases/install_redhat.html#install-redhat #CentOS 安装方法地址
    varnish4安装:
    curl -s https://packagecloud.io/install/repositories/varnishcache/varnish41/script.rpm.sh | sudo bash
    yum -y install varnish 
    
    1. varnish4 规则配置示例
    vcl 4.0;
    #允许清除缓存的IP地址
    import std;
    import directors;
    
    acl purgers {
        "127.0.0.1";
        "192.168.71.0"/24;
    }
    probe healthcheck {
        .url = "/index.html";
        .interval = 3s;
        .timeout = 1s;
        .window = 5;
        .threshold = 3;
    }
    #后端服务器1
    backend web1 {
        .host = "192.168.48.31";
        .port = "80";
        .probe = healthcheck;
    }
    #后端服务器2
    #backend web2 {
    #   .host = "192.168.48.32";
    #   .port = "80";
    #   .probe = healthcheck;
    #}
    
    sub vcl_init {
        new vdir = directors.round_robin();
        vdir.add_backend(web1);
        #vdir.add_backend(web2);
        return (ok);
    }
    
    sub vcl_recv {
        #添加原来请求的地址到X-Forwarded-For
        #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;
        #}
    
    
        #不在acl列表内的IP不允许清除缓存
        if (req.method == "PURGE") {
            if (!client.ip ~ purgers) {
                return(synth(405,"Method not allowed!"));
            }
            return(purge);
        }
        if (req.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|otf|ogg|ogm|opus|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
            unset req.http.cookie;
        }
        #不缓存about.html页面
        if (req.url ~ "^[^?]*\.php(\?.*)?$") {
            return(pass);
        }
    }
    
    sub vcl_hash {
    #set req.hash = req.url;
    #   if (req.http.Accept-Encoding ~ "gzip") {
    #       set req.hash += "gzip"
    #   }
    #   return (hash);
    }
    sub vcl_purge {
        return (synth(200, "Purged"));
    }
    
    sub vcl_backend_response {
        #不同的文件类型设置不同时长度缓存时间
        if (bereq.url ~ "\.(jpg|jpeg|gif|png|css|js|)$") {
            set beresp.ttl = 86400s;
        }
        if (bereq.url ~ "\.(html|htm)$") {
            set beresp.ttl = 300s;
        }
        if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|otf|ogg|ogm|opus|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
            #set beresp.do_gzip = false;
            unset bereq.http.cookie;
        }
    }
    
    sub vcl_deliver {
        #添加缓存命中显示
        if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT from " + server.ip;
        } else {
            set resp.http.X-Cache = "MISS";
        }
    }
    
    1. 测试结果
    实验环境:
      varnish 服务器IP:192.168.71.11;192.168.48.133
      web1:192.168.48.31
      web2:192.168.48.32
    
    第一次请求 第二次请求

    相关文章

      网友评论

          本文标题:Varinsh 安装与配置

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