客户端断开连接时HTTP代理/ FastCGI / SCGI未关闭连接 - 错误或功能?

时间:2009-08-30 19:20:46

标签: http comet fastcgi http-proxy scgi

我正在通过长XMLHttpRequest民意调查为Comet support框架CppCMS工作。在许多情况下,在给出服务器的任何响应之前,客户端会关闭此类请求 - 例如,页面关闭,用户移动到其他页面或者只是刷新。

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

从3个主要的UNIX Web服务器,Apache2,lighttpd和Nginx,只有最后一个已关闭 连接按预期允许我的应用程序从等待队列中删除请求 - 这适用于FastCGI和HTTP代理连接器。 (默认情况下,Nginx没有scgi模块。)

其他人,Apache和Lighttpd不会关闭连接或通知后端有关断开连接的信息 客户端,就像客户端仍然在线一样。所有3种支持的API都会出现这种情况:FastCGI,SCGI和HTTP代理。

我为Lighttpd打开了一个问题,但是什么 更让我感到震惊的是Apache - 成熟且支持良好的Web服务器作为lighttpd 并且没有公开客户端已经离开的服务器后端。

问题:

  1. 这是一个错误还是这个功能?有没有理由不关闭Web服务器和应用程序后端之间的连接?
  2. 现实生活Comet应用程序是否通过FastCGI / SCGI / HTTP-Proxy后端在这些服务器后面工作?
  3. 如果以上是真的,他们如何处理这个问题?我知道我可以每隔10秒超时所有连接,但我想让它们在客户端监听时保持空闲 - 因为这样可以更容易地扩展 - 每个连接非常简单 - 成本只是开放式套接字。
  4. 谢谢!

2 个答案:

答案 0 :(得分:4)

(1)功能。或者,更具体地说,从实现细节中得出结论。

TCP / IP连接不涉及来回的持续流量。因此,没有办法知道客户端没有(a)客户端告诉你它正在关闭连接或(b)超时。

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

(3)超时是唯一的方法,但你可以减轻痛苦,可以这么说。当没有活动时,让客户端每隔N秒通过连接ping服务器。不需要做任何事情,你可以在答复上加以处理;并发编辑或任何你需要的通知。

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

此页面上的第二个补丁应修复该特定问题:

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

答案 1 :(得分:0)

http://ncannasse.fr/blog/tora_comet

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