【问题标题】:HTTP Proxy/FastCGI/SCGI not closing connection when client disconnected - bug or feature?客户端断开连接时 HTTP 代理/FastCGI/SCGI 未关闭连接 - 错误或功能?
【发布时间】:2009-08-30 19:20:45
【问题描述】:

我正在通过长 XMLHttpRequest 轮询为 CppCMS 框架开发 Comet support。在许多情况下,此类请求在服务器给出任何响应之前就已被客户端关闭——例如页面已关闭、用户移动到其他页面或只是重新刷新。

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

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

其他,Apache 和 Lighttpd 不关闭连接或通知后端断开连接 客户端,继续进行,就好像客户端仍然在线一样。这适用于所有 3 个受支持的 API:FastCGI、SCGI 和 HTTP 代理。

我为Lighttpd 开了一个问题,但是什么 更让我担心的是 Apache——作为 lighttpd 的成熟且支持良好的 Web 服务器 并且没有透露客户端已经离开的服务器后端。

问题:

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

谢谢!

【问题讨论】:

  • 如果那里有 cppcms 标签会很酷,但最多只能有 5 个标签...我让您决定可以删除 5 个现有标签中的哪一个支持新的“cppcms”标签。最好有直接影响 cppcms 的 SO 问题被适当地标记。 +1。

标签: http comet fastcgi http-proxy scgi


【解决方案1】:

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

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

【讨论】:

  • 我知道除非客户端关闭连接,否则您无法知道是否发生了迪斯科。通常,Web 浏览器会执行此操作。感谢您提供补丁链接...接受答案。 ;)
【解决方案2】:

http://ncannasse.fr/blog/tora_comet

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

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2021-05-11
    • 2017-09-29
    • 2017-07-17
    • 2016-03-11
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多