varnish/nginx基于时间的限制

zynd9foi  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(300)

我正在尝试为我们的cms实施基于时间和地理位置的限制。下面是当前设置的样子
nginx(端口:443):用于ssl终止和url操作
varnish(端口:80):从后端缓存动态内容
apache、php、mysql:定制cms在这个堆栈上运行
该要求是这样的:在某个特定的时间段内,来自特定国家的流量不能访问特定的url/类别,但是来自世界其他地区的流量可以访问相同的url/类别而不受任何限制。
地理位置的部分似乎并不令人望而生畏,但我还没有找到任何限制交通的基础上的时间。
当然,我可以设置两个varnish或nginx配置,一个有限制,一个没有限制,让cron作业在我想做的时候替换物理文件,但是我希望有一个更干净的解决方案。
我知道所有这些都可以用php来处理,但我不能从堆栈中删除varnish,我必须投入5-6个服务器来处理负载,这将增加我无法证明的成本。
救命啊?

mbskvtky

mbskvtky1#

你可以用 now 在清漆,做一个正则表达式的日期在清漆生产403或任何东西
这是一个样本 varnishtest 展示如何使用的案例 now ```
varnishtest "Time Gate"

server s1 {
rxreq
txresp

} -start

varnish v1 -vcl+backend {
import std;

sub vcl_recv {
    //now is in RFC format: Thu, 26 Apr 2018 08:40:22 GMT
    //set it in a "ghost header" to convert it to a STRING otherwise it is a TIME
    // and regex won't work
    set req.http.now_string = now;

    //Check the hour
    if(req.http.now_string ~ "^.* [0-9]{4} 08") {
          // Do stuff when its 08:xx
    } else {
         // Otherwise do something else.
    }

}

sub vcl_deliver {
    set resp.http.x-forwarded-for = client.ip;
    set resp.http.now_string = req.http.now_string;
}

} -start

client c1 {
txreq -url "/1"
rxresp
expect resp.http.now_string ~ "2018"

} -run

关于地理保护,你也可以用清漆来做https://github.com/varnish/libvmod-geoip 这个vmod(没有亲自测试过)

相关问题