当客户端断开连接时,HTTP 代理/FastCGI/SCGI 不会关闭连接 - 错误还是功能?

StackOverflow https://stackoverflow.com/questions/1354690

我正在尝试 彗星支持 为了 CMS 通过长 XMLHttpRequest 轮询的框架。在许多情况下,此类请求在服务器给出任何响应之前就会被客户端关闭——例如页面关闭、用户移动到其他页面或刚刚刷新。

在服务器端,我希望收到连接断开的通知。我通过 3 个连接器测试了该应用程序:FastCGI、SCGI 和简单的 HTTP 代理。

从3个主要的Unix Web服务器,Apache2,LightTPD和Nginx,只有最后一个已封闭的连接,允许我的应用程序从WAIT队列中删除请求 - 这对FastCGI和HTTP代理连接器都起作用。(Nginx 默认没有 scgi 模块)。

其他,Apache和LightTPD没有关闭连接或有关断开客户的后端的通知,请继续,就像客户端仍在线上一样。所有 3 个受支持的 API 都会发生这种情况:FastCGI、SCGI 和 HTTP 代理。

我已经打开了一个问题 莱特普德, ,但更令人信服的是,Apache(Apache)是LightTPD的成熟且支持良好的Web服务器,并且没有透露客户端已消失的服务器后端。

问题:

  1. 这是一个错误还是一个功能?有什么理由不关闭Web服务器和应用程序后端之间的连接吗?
  2. 是否有现实生活中的 Comet 应用程序通过 FastCGI/SCGI/HTTP-Proxy 后端在这些服务器后面工作?
  3. 如果上述情况属实,他们如何处理这个问题?我知道我可以每 10 秒超时所有连接,但我想让它们在客户端监听时保持空闲状态 - 因为这可以更轻松地扩展 - 每个连接都非常便宜 - 成本只是打开的套接字。

谢谢!

有帮助吗?

解决方案

(一)特点。或者,更具体地说,是实施细节的影响。

TCP/IP 连接不涉及持续的来回流量。因此,如果没有(a)客户端告诉您它正在关闭连接或(b)超时,就无法知道客户端已经消失。

(2) 我对 Comet 或 CppCMS 不是特别熟悉。但是,是的,上面提到的 Web 服务器后面运行着各种各样的 CMS 服务器,它们都必须处理这个问题(是的,这很痛苦)。

(3) 暂停是唯一的方法,但可以这么说,你可以减轻痛苦。当没有任何活动时,让客户端每 N 秒通过连接对服务器执行 ping 操作。无需执行任何操作,您可以在回复中添加内容;并发编辑或任何您需要的通知。

您是正确的,令人惊讶的是 mod_fastcgi 不支持告诉后端 Apache 已检测到断开连接或连接超时。你并不是第一个感到沮丧的人。

此页面上的第二个补丁应该可以解决该特定问题:

http://osdir.com/ml/web.fastcgi.devel/2006-02/msg00015.html

其他提示

http://ncannasse.fr/blog/tora_comet

我没有任何具体信息给您,但本文确实提到他们可以检测客户端何时与 Apache 断开连接。看 tora.Queue. 。听起来 neko CVS 中提供了源代码,因此您也许可以在那里找到一些线索。祝你好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top