多年来,由于性能原因,我已经开启了apache keep-alive。它允许重用连接并使我的页面加载速度更快。然而,在过去的几个月里,一个奇怪的问题已经开始发生。
有时,从用户浏览器到我的应用程序的连接被删除,导致数据无法保存并显示错误。我做了大量的测试,并认为我已经缩小了问题范围。我使用哪种浏览器并不重要。数据库和服务器端脚本不是一个因素。它只发生在没有GET的POST中,这很有意思。如果我禁用keep-alive,它就会消失。
这是我认为正在发生的事情。我将KeepAliveTimeout设置为1秒。 1秒钟后,服务器终止连接,但客户端需要很短的时间(比方说100毫秒)才能终止连接。因此,在1秒到1.1秒之间,如果客户端尝试重用连接并POST一些数据,那么POST将失败。我通过制作一个脚本以1秒的间隔准确地发布一些数据来重现这一点,我可以看到来自客户端的所有其他连接都被删除了。如果我以0.9秒的间隔或1.1秒的间隔将脚本更改为POST,则它永远不会断开连接,因为避免了特定的时间窗口。如果我将KeepAliveTimeout更改为2秒或其他数字,那么它只是推出时间窗口并没有真正解决问题。
我的帖子来自javascript(jquery.ajax),但我想如果你的时间正确,它也可能来自常规表单POST。
在Safari和IE中,连接立即被删除并失败。在Firefox和Chrome中,浏览器会停滞几十秒,然后在成功的新连接上重新发送请求。
如果这只是keepalive的一个基本问题,那么为什么这种情况多年来一直有效并且在过去几个月才开始这样做是令人困惑的。暂时,我已经禁用了keep-alive,但是如果可能的话我想找到一种方法来使用它。我希望有人知道解决方案。