我有一个页面需要大约1-2分钟才能生成,并且需要尽可能最新/最快。该页面每天将被大约1000人访问。所有这些用户获得即时页面并且无法等待1-2分钟才能加载页面,这一点至关重要。
清漆过期时间设为1分钟。因此,如果用户在分钟结束时登陆页面,他们将等待它重新生成。我看到的解决方案是写一个微小的cron来抓取页面,这样它总是最新的...但是用户总是会有1-5%的泄漏达到1-2分钟的页面加载,这对我来说是不可接受的 - 案例。
有没有办法让Varnish在后台执行此操作?或另一种解决方法?
谢谢。
答案 0 :(得分:0)
后端服务器超时有一些可选设置。参见
backend default {
.host = "127.0.0.1";
.port = "80";
.connect_timeout = 2s;
.first_byte_timeout = 10s;
.between_bytes_timeout = 1s;
}
有关详细信息,请参阅https://www.varnish-software.com
答案 1 :(得分:0)
您可以使用后端,宽限期和自定义标题执行“脏”的变通方法。
或多或少:
vcl_recv
上设置至少2分钟的宽限期vcl_recv
是否存在自定义标题,如果没有将后端更改为生病标题。vcl_fetch
上设置至少2分钟的宽限期。有了这个,只有cron请求会到达后端......其余的将从缓存中提供。
小心,这个“解决方案”不会处理后端故障
答案 2 :(得分:0)
在这里,我尝试使用@NITEMAN建议的标题创建要复制和粘贴的配置,为了安全起见,我使用max 1h
设置了宽限期,并限制了对生成器URL的cron检查以防止整个网站因任何原因进入宽限模式。
PS:我还是个新朋友,所以如果有什么问题请帮我改进这个答案。
我使用了清漆书中的evil hack example,但几乎没有任何更改,仅供参考。
backend good {
.host = "localhost"
.port = "8080"; # if this is your nginx port
}
backend bad {
.host "localhost"
.port "12345" #random port
.probe {.url = "/unavailable-url"; .initial = 0; .interval = 1d;}
}
sub vlc_recv {
if ( req.url ~ '^/generator-url' ) {
if ( req.http.X-cron == true ) {
set req.backend = good;
else {
set req.backend = bad;
}
if ( req.backend.healthy ) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}