2017-07-03 56 views
0

我无法理解在后端500错误情况下Varnish的行为。 - 为什么它会增加MAIN.n_object计数器?我认为它应该只缓存20x和重定向。 - 如果第一个请求使用来自后端的500响应完成,则对相同url不进行缓存的所有后续请求,即使后端开始返回200响应。 帮我理解这个逻辑。为什么Varnish在500错误后停止缓存200响应

回答

1

如果你真的使用默认的VCL,那么默认的逻辑就像你描述的那样。但是你错过了它在一段时间后开始缓存它。通常2分钟。

  1. 光油看到500个状态 - >会谈到后端,并且不缓存页面2分钟
  2. 后来光油看到200个状态 - >光油缓存页面,并从缓存中提供进一步上。

这需要实现hit-for-pass - 我对此的理解是:光油会默认堆积requets到后端,而不是给他们,他们到达了优化。当Varnish看到某些东西不可缓存(500状态等)时,它不会执行堆积行为并直接与后端对话(即时通过)。

如果您想要减少页面被标记为按转换时间的时间量,则需要添加一些VCL。这将确保没有运行内置的具有120s值的VCL。以下将以500秒状态标记为不可缓存10秒的页面:

sub vcl_backend_response { 
    if (beresp.status == 500) { 
     set beresp.ttl = 10s; 
     set beresp.uncacheable = true; 
     return (deliver); 
    } 
} 
+0

你是100%正确的!最近我用计时器测量了它的2分钟问题期。如果刚刚发生500错误,后端再次正常,为什么在这2米通过之前无法缓存它的响应? – Molfar

+0

如果在500次错误后的10秒内后端没问题,如何避免在110秒内一次又一次地取回? – Molfar

+0

查看更新的答案。类似的东西应该工作(未经测试的代码)。 –

相关问题