【发布时间】: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 服务器 并且没有透露客户端已经离开的服务器后端。
问题:
- 这是一个错误还是一个功能?是否有任何理由不关闭 Web 服务器和应用程序后端之间的连接?
- 现实生活中的 Comet 应用程序是否通过 FastCGI/SCGI/HTTP-Proxy 后端在这些服务器后面工作?
- 如果上述情况属实,他们如何处理这个问题?我知道我可以每 10 秒超时一次所有连接,但我想让它们在客户端监听时保持空闲——因为这样可以更容易地扩大规模——每个连接都非常便宜——成本只是打开的套接字。
谢谢!
【问题讨论】:
-
如果那里有 cppcms 标签会很酷,但最多只能有 5 个标签...我让您决定可以删除 5 个现有标签中的哪一个支持新的“cppcms”标签。最好有直接影响 cppcms 的 SO 问题被适当地标记。 +1。
标签: http comet fastcgi http-proxy scgi