• varnish


    安装:

    yum install epel-release
    rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
    yum install varnish gcc varnish-libs-devel-4.0.3 -y

    稍微配置:

    vi /etc/sysconfig/varnish  修改listen port为80

    vi /etc/varnish/default.vcl  添加backend web server

    web缓存核心技术:

    http://mp.weixin.qq.com/s?__biz=MzIyMDA1MzgyNw==&mid=2651968866&idx=1&sn=25554c31eac32e78664b962412f515de&chksm=8c349d4ebb431458bef22609db7e9e76d33035ad92c31cbb2d201d13ce94bb8203c69ab9fb33&scene=21#wechat_redirect

    引用自:  http://467754239.blog.51cto.com/4878013/1577216

    # Configure VCL
     
    probe static_chk {    #静态网页的健康状态检查
            .url = "/test.html";
            .interval = 2s;
            .timeout = 2s;
            .expected_response = 200;
    }
    probe dynamic_chk {    #动态网页的健康状态检查
            .url = "/test.php";
            .interval = 2s;
            .timeout = 2s;
            .expected_response = 200;
    }
    backend apache01 {    #静态请求负载均衡1
            .host = "192.168.0.108";
            .port = "80";
                    .probe = static_chk;
    }
    backend apache02 {    #静态请求负载均衡2
            .host = "192.168.0.110";
            .port = "80";
                    .probe = static_chk;
    }
    backend nginx01 {    #动态请求分发地址
            .host = "192.168.0.100";
            .port = "80";
                    .probe = dynamic_chk;
    }
     
    director myload random {    #分发器和调度算法
            .retries = 2;
            {
                    .backend = apache01;
                    .weight = 1;
            }
            {
                    .backend = apache02;
                    .weight = 1;
            }
    }
    sub vcl_recv {
            set req.http.X-Forward-For = client.ip;    #记录客户端的ip地址
            if (req.url ~ ".(html)$" ) {
                    return(lookup);
            }
            if (req.url ~ ".(php)$") {  #如果请求的是php文件则将请求发送给nginx代理的服务器
                    set req.backend = nginx01;
            }else{
                    set req.backend = myload; #如果请求的是html文件则将请求发送给myload代理的服务器
            }
    }
    sub vcl_fetch {
            if (req.request == "GET" && req.url ~ ".(html|jpg|jpeg)$") {
                    set beresp.ttl = 3600s;
            }
    }
     
    sub vcl_deliver {            #记录命中和未命中的变量设定
            if (obj.hits > 0) {
                    set resp.http.X-Cache = "HIT from" + " " + server.ip;
            } else {
                    set resp.http.X-Cache = "MISS";
            }
            return(deliver);
    }

    引用自:  http://www.cnblogs.com/xiaocen/p/3715266.html

    #
    # This is an example VCL file for Varnish.
    #
    # It does not do anything by default, delegating control to the
    # builtin VCL. The builtin VCL is called when there is no explicit
    # return statement.
    #
    # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
    # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.
    # Marker to tell the VCL compiler that this VCL has been adapted to the
    # new 4.0 format.
    vcl 4.0;
    import directors;
    probe backend_healthcheck { # 创建健康监测
        .url = /health.html;
        .window = 5;
        .threshold = 2;
        .interval = 3s;
    }
    backend web1 {    # 创建后端主机
        .host = "static1.lnmmp.com";
        .port = "80";
        .probe = backend_healthcheck;
    }
    backend web2 {
        .host = "static2.lnmmp.com";
        .port = "80";
        .probe = backend_healthcheck;
    }
    backend img1 {
        .host = "img1.lnmmp.com";
        .port = "80";
        .probe = backend_healthcheck;
    }
    backend img2 {
        .host = "img2.lnmmp.com";
        .port = "80";
        .probe = backend_healthcheck;
    }
    vcl_init {    # 创建后端主机组,即directors
        new web_cluster = directors.random();
        web_cluster.add_backend(web1);
        web_cluster.add_backend(web2);
        new img_cluster = directors.random();
        img_cluster.add_backend(img1);
        img_cluster.add_backend(img2);
    }
    acl purgers {    # 定义可访问来源IP
            "127.0.0.1";
            "192.168.0.0"/24;
    }
    sub vcl_recv {
        if (req.request == "GET" && req.http.cookie) {    # 带cookie首部的GET请求也缓存
            return(hash);
    }
        if (req.url ~ "test.html") {    # test.html文件禁止缓存
            return(pass);
        }
        if (req.request == "PURGE") {    # PURGE请求的处理
            if (!client.ip ~ purgers) {
                return(synth(405,"Method not allowed"));
            }
            return(hash);
        }
        if (req.http.X-Forward-For) {    # 为发往后端主机的请求添加X-Forward-For首部
            set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
        } else {
            set req.http.X-Forward-For = client.ip;
        }
        if (req.http.host ~ "(?i)^(www.)?lnmmp.com$") {    # 根据不同的访问域名,分发至不同的后端主机组
            set req.http.host = "www.lnmmp.com";
            set req.backend_hint = web_cluster.backend();
          } elsif (req.http.host ~ "(?i)^images.lnmmp.com$") {
                set req.backend_hint = img_cluster.backend();
          }
            return(hash);
        }
    sub vcl_hit { # PURGE请求的处理
        if (req.request == "PURGE") {  
            purge;
            return(synth(200,"Purged"));
        }
    }
    sub vcl_miss {    # PURGE请求的处理
        if (req.request == "PURGE") {
            purge;
            return(synth(404,"Not in cache"));
        }
    }
    sub vcl_pass {    # PURGE请求的处理
        if (req.request == "PURGE") {
            return(synth(502,"PURGE on a passed object"));
        }
    }
    sub vcl_backend_response { # 自定义缓存文件的缓存时长,即TTL值
        if (req.url ~ ".(jpg|jpeg|gif|png)$") {
            set beresp.ttl = 7200s;
        }
        if (req.url ~ ".(html|css|js)$") {
            set beresp.ttl = 1200s;
        }
        if (beresp.http.Set-Cookie) { # 定义带Set-Cookie首部的后端响应不缓存,直接返回给客户端
            return(deliver);
        }
    }
    sub vcl_deliver {
        if (obj.hits > 0) {    # 为响应添加X-Cache首部,显示缓存是否命中
            set resp.http.X-Cache = "HIT from " + server.ip;
        } else {
            set resp.http.X-Cache = "MISS";
        }
    }

    http://xiaodong88.blog.51cto.com/1492564/1304988/  varnish

    https://www.varnish-cache.org/docs/4.0/whats-new/upgrading.html#directors-have-been-moved-to-the-vmod-directors    4.0改动

    4.0改动后新的负载均衡配置:

    vcl 4.0;
    import directors;
    backend apache1 {
        .host = "10.188.12.201";
        .port = "80";
    }
    backend apache2 {
        .host = "10.188.12.203";
        .port = "80";
    }
    
    sub vcl_init {
            new cluster1 = directors.round_robin();
            cluster1.add_backend(apache1);
            cluster1.add_backend(apache2);
    }
    
    sub vcl_recv {
    set req.backend_hint = cluster1.backend();
    }
  • 相关阅读:
    <转>iOS SDK中使用NSXMLParser解析XML
    [原创]闲来无事,写了个c#的数据库附加工具,现附上源代码
    [转载]php数组操作foreach、each、reset、list
    [原创]xml序列化
    [原创]一个简单的药店用的会员积分管理系统
    [原创]我的cms项目
    简洁、标准的对联广告代码
    C#混淆 xenocode使用说明
    .net 随机数
    [原创]c# as用法
  • 原文地址:https://www.cnblogs.com/feral/p/6884472.html
Copyright © 2020-2023  润新知