基于Varnish-Cache Time的访问

时间:2014-01-10 22:22:22

标签: varnish

我在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]

完美无缺。

我需要Varnish。 因为LoadBalancer后面的服务器它获得了具有真实客户端IP的X-Forwarded-For标头。因为安装了rpaf_module,我仍然检查Apache中的%{REMOTE_HOST}。 我在Varnish中添加了下一个帮助ipcast vmod

    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一样进行基于时间的访问吗?

1 个答案:

答案 0 :(得分:1)

你受限于简单的VCL,但Varnish允许做的不仅仅是简单的陈述。 您可以使用inline-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