我正在通过长 XMLHttpRequest 轮询为CppCMS框架提供Comet 支持。在许多情况下,这样的请求在服务器给出任何响应之前就被客户端关闭了——例如页面被关闭,用户移动到其他页面或者它只是被刷新。
在服务器端,我希望我会收到连接断开的通知。我通过 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 秒超时一次所有连接,但我想让它们在客户端监听时保持空闲——因为这样可以更容易地扩大规模——每个连接都非常便宜——成本只是打开的套接字。
谢谢!