Varnish可以预先生成页面吗?

时间:2014-02-08 21:39:07

标签: php caching ubuntu varnish varnish-vcl

我有一个页面需要大约1-2分钟才能生成,并且需要尽可能最新/最快。该页面每天将被大约1000人访问。所有这些用户获得即时页面并且无法等待1-2分钟才能加载页面,这一点至关重要。

清漆过期时间设为1分钟。因此,如果用户在分钟结束时登陆页面,他们将等待它重新生成。我看到的解决方案是写一个微小的cron来抓取页面,这样它总是最新的...但是用户总是会有1-5%的泄漏达到1-2分钟的页面加载,这对我来说是不可接受的 - 案例。

有没有办法让Varnish在后台执行此操作?或另一种解决方法?

谢谢。

3 个答案:

答案 0 :(得分:0)

后端服务器超时有一些可选设置。参见

backend default {
    .host = "127.0.0.1";
    .port = "80";
    .connect_timeout = 2s;
    .first_byte_timeout = 10s; 
    .between_bytes_timeout = 1s;
}
  • .connect_timeout - 服务器响应的等待时间(ping)
  • .first_byte_timeout - 从后端服务器发送第一个字节的等待时间(对于PHP后端服务器,它将被设置为max_execution_time)
  • .between_bytes_timeout - 这在短连接
  • 时很有用

有关详细信息,请参阅https://www.varnish-software.com

答案 1 :(得分:0)

您可以使用后端,宽限期和自定义标题执行“脏”的变通方法。

或多或少:

  1. 更改您的cron脚本以发送自定义HTTP标头(例如“X-Cron:true”)(如果使用curl,-H选项)
  2. 使用虚假数据和一个标记后端始终为病的探测器定义一个新的后端“生病”
  3. vcl_recv上设置至少2分钟的宽限期
  4. 检查vcl_recv是否存在自定义标题,如果没有将后端更改为生病标题。
  5. vcl_fetch上设置至少2分钟的宽限期。
  6. 有了这个,只有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;
}