我正在研究Varnish Cache背后的PHP应用程序。系统管理员希望将first_byte_timeout值保持在相对较低的水平。然而,在应用程序的一个特定角落,我需要一个长时间运行的PHP进程(一个大数据文件上传,它需要一两分钟处理它。)
问题是first_byte_timeout在进程完成之前很好地被击中。当然,该过程仍然完成,但Varnish返回503,因为没有数据已发送。对于用户来说,它看起来像是出了问题,如果有任何关于事情出现问题的反馈,用户将永远不会看到它。
我该怎么办?
更糟糕的情况是,我做了一个大的重构,所以这个过程可以在幕后的一个单独的过程中运行,但这将是很多工作。
是否可以通过PHP发送一些虚拟数据,以便Varnish保持连接打开?
这个解决方案有一个复杂的问题,但是在长时间运行的过程结束时,PHP会进行重定向(到另一个页面,它会向用户反馈事情的进展情况)。有了我尝试过的所有东西,如果php已经发送了HTTP头,那重定向就会失败,那么我发送的虚拟数据可能必须是虚头?或者某些不会让PHP认为标题已被发送的东西。
有没有办法为Varnish设置一个特殊的例外,所以在这一个屏幕上它会等待更长的全局first_byte_timeout?
(我是Varnish的新手,所以如果我遗漏了一些关键信息,请告诉我。谢谢。)
答案 0 :(得分:1)
快速修复并节省工程时间:仅在Varnish中修改此请求的first_byte_timeout设置。 E.g:
sub vcl_miss {
if ( req.url ~ "your/special/url" ) {
set bereq.first_byte_timeout = 5m;
}
}