Varnish / NGINX 基于时间的限制
Varnish / NGINX time based restrictions
我正在尝试为我们的 CMS 实施基于时间和地理位置的限制。以下是当前设置的样子
- Nginx(端口:443): 用于 SSL 终止和 URL 操作
- Varnish(端口:80):从后端缓存动态内容
- Apache,PHP,MySQL: 自定义 CMS 在此堆栈上运行
要求是在特定时间段内,来自特定国家/地区的流量无法访问特定的 URL / 类别,但来自世界其他地区的流量可以访问相同的 URL /类别不受任何限制。
地理位置部分似乎并不令人生畏,但我还没有找到任何关于根据时间限制流量的信息。
当然,我可以设置两个 varnish 或 nginx 配置,一个有限制,一个没有限制,让 cron 作业根据我想要完成的时间替换物理文件,但我希望有一个更干净的解决方案。
我知道所有这些都可以用 PHP 处理,但我无法从堆栈中删除 Varnish,我必须放入 5-6 个服务器来处理负载,这会增加成本我无法证明。
帮忙?
您可以在 varnish 中使用 now
,然后在 varnish 中对日期执行正则表达式以生成 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 在 varnish 中执行此操作。 (还没有亲自测试)
我正在尝试为我们的 CMS 实施基于时间和地理位置的限制。以下是当前设置的样子
- Nginx(端口:443): 用于 SSL 终止和 URL 操作
- Varnish(端口:80):从后端缓存动态内容
- Apache,PHP,MySQL: 自定义 CMS 在此堆栈上运行
要求是在特定时间段内,来自特定国家/地区的流量无法访问特定的 URL / 类别,但来自世界其他地区的流量可以访问相同的 URL /类别不受任何限制。
地理位置部分似乎并不令人生畏,但我还没有找到任何关于根据时间限制流量的信息。
当然,我可以设置两个 varnish 或 nginx 配置,一个有限制,一个没有限制,让 cron 作业根据我想要完成的时间替换物理文件,但我希望有一个更干净的解决方案。
我知道所有这些都可以用 PHP 处理,但我无法从堆栈中删除 Varnish,我必须放入 5-6 个服务器来处理负载,这会增加成本我无法证明。
帮忙?
您可以在 varnish 中使用 now
,然后在 varnish 中对日期执行正则表达式以生成 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 在 varnish 中执行此操作。 (还没有亲自测试)