クライアントが切断されたときに HTTP プロキシ/FastCGI/SCGI が接続を閉じない - バグまたは機能?

StackOverflow https://stackoverflow.com/questions/1354690

質問

取り組んでいます コメットのサポート のために CppCMS 長い XMLHttpRequest ポーリングを介したフレームワーク。多くの場合、そのようなリクエストは、サーバーからの応答が返される前にクライアントによって閉じられます。たとえば、ページが閉じられる、ユーザーが他のページに移動する、またはページが更新されるだけです。

サーバー側では、接続が切断されたという通知を受け取ることを期待しています。3 つのコネクタを介してアプリケーションをテストしました。FastCGI、SCGI、および単純な HTTP プロキシ。

3つのメジャーUNIX Webサーバー、Apache2、LightTPD、およびNginxから、最後の1つだけが予想どおりに接続を閉じていたため、アプリケーションが待機キューからリクエストを削除できるようになりました。これは、FastCGIおよびHTTPプロキシコネクタの両方で機能しました。(Nginx にはデフォルトで scgi モジュールがありません)。

その他、ApacheおよびLightTPDは、接続を閉じたり、切断されたクライアントについてバックエンドに通知したりすることはありません。これは、サポートされている 3 つの API すべてで発生します。FastCGI、SCGI、HTTP プロキシ。

私が問題を開いたのは、 ライトTPD, 、しかし、さらに私を識別しているのは、ApacheがLightTPDとして成熟したよくサポートされているWebサーバーであり、クライアントが行ったサーバーのバックエンドを開示していないという事実です。

質問:

  1. これはバグですか、それとも機能ですか?Web サーバーとアプリケーション バックエンド間の接続を閉じない理由はありますか?
  2. FastCGI/SCGI/HTTP-Proxy バックエンドを介してこれらのサーバーの背後で動作する実際の Comet アプリケーションはありますか?
  3. 上記が真実である場合、彼らはこの問題にどのように対処しますか?すべての接続を 10 秒ごとにタイムアウトできることは理解していますが、クライアントがリッスンする限りアイドル状態に保ちたいと考えています。これにより、スケールアップが容易になるためです。各接続は非常に安価です。コストはオープンされたソケットのみです。

ありがとう!

役に立ちましたか?

解決

(1)機能。または、より具体的には、実装の詳細から放射性降下物ます。

TCP / IP接続が前後にトラフィックの一定の流れを必要としません。したがって、クライアントは(a)のクライアントが接続または(b)のタイムアウトを閉じているあなたを告げず消えていることを知る方法はありません。

(2)Iは、彗星やCppCMSと特異的に慣れていませんよ。しかし、はい、前述のWebサーバーの背後で実行CMSサーバのすべての種類があり、それらはすべて、この問題に対処する必要が(そして、はい、それは苦痛である)。

(3)タイムアウトが唯一の方法ですが、あなたはいわば、痛みを緩和することができます。 N秒毎にそれ以外のアクティビティがないとき、クライアントのPingに接続を介してサーバーを持っています。何もする必要はありません、あなたは返信にものをタックすることができます。何が必要同時編集やの通知ます。

mod_fastcgiのは、Apacheの切断を検出したか、接続がタイムアウトしたバックエンドを語ってサポートしていないことは驚くべきことであるという点で、

あなたは正しいです。そして、あなたはうろたえされる最初ではありません。

このページの第2のパッチは、その特定の問題を修正する必要があります:

http://osdir.com/ml/web .fastcgi.devel / 2006-02 / msg00015.htmlする

他のヒント

http://ncannasse.fr/blog/tora_cometする

私はあなたのための任意の具体的な情報を持っていないが、この記事では、クライアントは、Apacheから切断されたとき、彼らが検出できることを言及しません。 tora.Queueを参照してください。そして、ソースは猫CVSで利用可能であるように聞こえるので、あなたはそこにいくつかの手がかりを見つけることができるかもしれません。幸運を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top