【问题标题】:Varnish-Cache Time based accessVarnish-Cache 基于时间的访问
【发布时间】:2014-01-10 22:22:21
【问题描述】:

我在 Apache 中有类似的东西

    RewriteCond %{REMOTE_HOST} !^11\.22\.33\.[12]\d\d$ #As example allows from 100 till 200
    RewriteCond %{REMOTE_HOST} !^127\.0\.0\.1$
    RewriteCond %{TIME} <20140113090000
    RewriteRule ^/access-on-monday/ http://www.mysite.com/ [NC,L,R=302]

效果很好。

我需要同样的清漆。 因为 LoadBalancer 后面的服务器它获取带有真实客户端 IP 的 X-Forwarded-For 标头。我仍然在 Apache 中检查 %{REMOTE_HOST} 因为 rpaf_module 已安装。 我在 Varnish 中添加了下一个帮助 ipcastvmod

    import ipcast;
    acl office {
        "localhost";
        "11.22.33.100"/24; //Let's think that it matches with 11.22.33.100 - 11.22.33.200
    }
    sub vcl_recv {
            if (req.http.X-Forwarded-For !~ ",") {
                set req.http.xff = req.http.X-Forwarded-For;
            } else {
                set req.http.xff = regsub(req.http.X-Forwarded-For, "^[^,]+.?.?(.*)$", "\1");
            }
            if (ipcast.clientip(req.http.xff) != 0) {
                error 400 "Bad request";
            }
            if (!client.ip ~ office) {
                set req.http.X-Redir-Url = "http://" + req.http.Host + "/";
                error 751 "Found";
            }
    }

然后在 vcl_error 我进行重定向,但在这里没关系。 我的问题是可以像在 Apache 中那样进行基于时间的访问吗?

【问题讨论】:

    标签: varnish


    【解决方案1】:

    你受限于简单的 VCL,但 Varnish 允许做的不仅仅是简单的语句。 您可以使用内联 C 或 VMOD 增强和驱动您的主力,并在 C 中完成这项工作。

    例如,如果您想从以下位置添加基于时间的访问:

    backend server_available_in_2014 {
      .host="127.0.0.1";
      .port="8080";
    }
    
    sub vcl_recv {
       set req.backend = server_available_in_2014; # IT MUST BE AVAILABLE ONLY in 2014
    }
    

    您可以将日期201401010000 转换为UNIX 时间戳1389617122,并编写简单的内联-C:

    backend server_available_in_2014 {
        .host="127.0.0.1";
        .port="8080";
    }
    
    C{
    double TIM_real(void);
    }C
    
    sub vcl_recv {
        C{
                if (TIM_real() > 1389617122.0) {
                        VRT_l_req_backend(sp, VGCDIR(_server_available_in_2014));
                }
        }C
    }
    

    TIM_real() 正在返回当前时间戳(查看 varnish/lib/libvarnish/time.c),VRT_l_req_backend 语句与 set req.backend = server_available_in_2014; 完全相同,但用 C 编写VCL 的。

    如果你想要更多的调整,你可以通过执行以下命令将你的 VCL 编译成 C:varnishd -f default.vcl -C

    【讨论】:

    • 你好。非常感谢。这很好地暗示了如何进行。其实我这台服务器一直在线,但是inline-C比VCL能赚的多,就足以让人想对路了。
    • 请注意,如果您的代码比我的示例更复杂,则创建 VMOD 会更容易。值得!
    猜你喜欢
    • 2018-10-05
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多