HTTP Proxy / FastCGI / SCGI Verbindung nicht geschlossen wird, wenn Client getrennt - Bug oder Feature?

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

Frage

Ich arbeite an Comet Unterstützung < a href = "http://cppcms.sourceforge.net/" rel = "nofollow noreferrer"> CppCMS Rahmen über lange XMLHttpRequest Umfragen. In vielen Fällen wird eine solche Anforderung durch Client geschlossen, bevor eine Antwort vom Server gegeben wurde - z. B. die Seite geschlossen ist, Benutzer zu anderen Seite oder es ist nur refeshed

Auf der Server-Seite erwarte ich, dass ich die Benachrichtigung empfangen würde, dass die Verbindung fallen gelassen wird. Getestet habe ich die Anwendung über 3 Anschlüsse: FastCGI, SCGI und einfache HTTP-Proxy

.

Von 3 großen UNIX-Web-Server, Apache2, lighttpd und Nginx, nur die letzte war geschlossen Verbindung wie erwartet so dass meine Anwendung die Anforderung von Warteschlange entfernen - dies sowohl für FastCGI gearbeitet und HTTP-Proxy-Anschlüsse. (Nginx nicht scgi Modul standardmäßig hat).

Andere, Apache und Lighttpd nicht schließen Verbindung oder das Backend über getrennt informieren Kunden, gehen die, als ob der Client noch online ist. Dies geschieht für alle drei unterstützten APIs. FastCGI, SCGI und HTTP-Proxy

hatte ich ein Problem für Lighttpd geöffnet, aber was mehr conserns mich ist die Tatsache, dass Apache - reifen und auch lighttpd unterstützten Web-Server und nicht offenbart den Server-Backend, dass Client gegangen war.

Fragen:

  1. Ist das ein Bug oder das ist ein Feature? Gibt es einen Grund, nicht die Verbindung zwischen Web-Server und Anwendung Backend zu schließen?
  2. Gibt es wirkliches Leben Comet Anwendung Arbeits hinter diesen Servern über FastCGI / SCGI / HTTP-Proxy-Backends?
  3. Wenn die oben wahr, wie sie mit diesem Problem umgehen? Ich verstehe, dass ich alle Verbindungen alle 10 Sekunden Timeout kann, aber ich mag sie so weit wie Client-Streams halten Leerlauf - weil dies einfache Skala ermöglicht bis - jede Verbindung sehr billig ist - die Kosten sind nur die opended Steckdose.

Danke!

War es hilfreich?

Lösung

(1) Feature. Oder, genauer gesagt, Fallout von einer Implementierung Detail.

Ein TCP / IP-Verbindung keinen konstanten Verkehrsfluss zurück beinhalten und her. Somit gibt es keine Möglichkeit zu wissen, dass ein Client ohne (a) gegangen ist der Kunde Sie sagen, es ist das Schließen der Verbindung oder (b) ein Timeout.

(2) Ich bin nicht besonders vertraut mit Comet oder CppCMS. Aber ja, es gibt alle Arten von CMS-Server hinter dem oben genannten Web-Server ausgeführt wird und sie alle mit diesem Thema beschäftigen muß (und, ja, es ist ein Schmerz).

(3) Timeouts sind der einzige Weg, aber man kann den Schmerz lindern, so zu sprechen. Haben Sie den Clientpingtests den Server über die Verbindung alle Sekunden N, wenn es sonst keine Aktivität ist. Hat nichts zu tun, und Sie können sich auf der Antwort Sachen heften; Meldungen von gleichzeitigen Änderungen oder was auch immer Sie brauchen.

Sie sind richtig, dass es, dass mod_fastcgi ist überraschend, unterstützt nicht das Backend zu sagen, dass Apache die disconnect oder die Verbindung Zeitüberschreitung erkannt hat. Und Sie sind nicht der erste verzagt werden.

Der zweite Patch auf dieser Seite soll dieses bestimmte Problem beheben:

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

Andere Tipps

http://ncannasse.fr/blog/tora_comet

Ich habe keine konkreten Informationen für Sie, aber dieser Artikel nicht erwähnt, dass sie erkennen kann, wenn der Client von Apache getrennt wird. Siehe tora.Queue. Und es klingt wie die Quelle in der neko CVS zur Verfügung steht, so Sie in der Lage sein könnten, einige Hinweise gab zu finden. Viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top