私は長い XMLHttpRequest ポーリングを介してCppCMSフレームワークのコメット サポートに取り組んでいます。多くの場合、そのようなリクエストは、サーバーからの応答が返される前にクライアントによって閉じられます。たとえば、ページが閉じられたり、ユーザーが他のページに移動したり、ページが更新されたりします。
サーバー側では、接続が切断されたという通知を受け取ることを期待しています。FastCGI、SCGI、シンプルな HTTP プロキシの 3 つのコネクタを介してアプリケーションをテストしました。
3 つの主要な UNIX Web サーバー、Apache2、lighttpd、および Nginx から、最後の 1 つだけが期待どおりに接続を閉じ、アプリケーションが待機キューから要求を削除できるようになりました。これは、FastCGI コネクタと HTTP プロキシ コネクタの両方で機能しました。(Nginx にはデフォルトで scgi モジュールがありません)。
その他、Apache と Lighttpd は、接続を閉じたり、切断されたクライアントについてバックエンドに通知したりせず、クライアントがまだオンラインであるかのように処理を進めます。これは、サポートされている 3 つの API (FastCGI、SCGI、および HTTP プロキシ) すべてで発生します。
私はLighttpdの問題をオープンしましたが、さらに気になるのは、Apache -- lighttpd として成熟し、十分にサポートされている Web サーバーであり、クライアントが行ったサーバー バックエンドを公開していないという事実です。
質問:
- これはバグですか、それとも機能ですか? Web サーバーとアプリケーション バックエンド間の接続を閉じない理由はありますか?
- FastCGI/SCGI/HTTP-Proxy バックエンドを介してこれらのサーバーの背後で動作する実際の Comet アプリケーションはありますか?
- 上記が当てはまる場合、彼らはこの問題にどのように対処しますか? すべての接続を 10 秒ごとにタイムアウトできることは理解していますが、クライアントがリッスンしている限り、それらをアイドル状態に保ちたいと考えています。
ありがとう!