gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:29:21 27 4
gpt4 key购买 nike

我正在研究 Comet support对于 CppCMS通过长 XMLHttpRequest 轮询的框架。在许多情况下,此类请求在服务器给出任何响应之前由客户端关闭 - 例如页面关闭,用户移动到其他页面或只是刷新。

在服务器端,我希望收到连接断开的通知。我通过 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 秒超时一次所有连接,但我想让它们在客户端监听时保持空闲状态——因为这样可以更容易地扩展——每个连接都非常慢——成本只是打开的套接字。

谢谢!

最佳答案

(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

关于客户端断开连接时 HTTP 代理/FastCGI/SCGI 不关闭连接 - 错误或功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1354690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com