Proxy HTTP / FastCGI / SCGI non fermeture de la connexion lorsque le client déconnecté - bug ou fonctionnalité?

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

Question

Je travaille sur support Comet pour < a href = "http://cppcms.sourceforge.net/" rel = "nofollow noreferrer"> cadre de CppCMS par sondages à long XMLHttpRequest. Dans de nombreux cas, cette demande est fermée par le client avant a reçu une réponse du serveur -. Par exemple, la page est fermée, l'utilisateur se déplace à d'autres page ou il est juste refeshed

Du côté du serveur, je pense que je recevoir la notification que la connexion est abandonnée. Je l'ai testé l'application via 3 connecteurs:. FastCGI, SCGI et Proxy HTTP simple

A partir de 3 principaux serveurs Web UNIX, Apache2, lighttpd et Nginx, seule la dernière avait fermé connexion comme prévu permettant ma demande de retirer la demande de la file d'attente - cela a fonctionné pour les deux FastCGI et HTTP connecteurs proxy. (Nginx ne pas module scgi par défaut).

D'autres, Apache et Lighttpd ne ferme pas la connexion ou informer le back-end au sujet déconnecté les clients, le faire comme si le client est toujours en ligne. Cela se produit pour tous les trois pris en charge API:. FastCGI, SCGI et Proxy HTTP

J'avais ouvert un problème pour Lighttpd , mais ce plus conserns moi est le fait que Apache - mature et bien serveur Web pris en charge en tant que lighttpd et ne divulgue pas le back-end du serveur que le client avait disparu.

Questions:

  1. Est-ce un bug ou c'est une fonctionnalité? Y at-il raison de ne pas fermer la connexion entre le serveur Web et back-end d'application?
  2. Y at-il la vie réelle demande Comet travail derrière ces serveurs via FastCGI / SCGI / backends proxy HTTP?
  3. Si ce qui précède vrai, comment traitent-ils cette question? Je comprends que je peux délai d'attente toutes les connexions toutes les 10 secondes, mais je voudrais les garder oisifs pour autant que le client écoute - car cela permet échelle plus facile jusqu'à - chaque connexion est très bon marché - le coût est que la prise opended.

Merci!

Était-ce utile?

La solution

(1) Caractéristique. Ou, plus précisément, les retombées d'un détail de mise en œuvre.

Une connexion TCP / IP ne comporte pas un flux constant de la circulation dans les deux sens. Ainsi, il n'y a aucun moyen de savoir qu'un client est parti sans (a) le client vous dit qu'il ferme la connexion ou (b) un délai d'attente.

(2) Je ne suis pas particulièrement familier avec la comète ou CppCMS. Mais, oui, il y a toutes sortes de serveurs CMS courir derrière les serveurs Web mentionnés et ils ont tous à traiter cette question (et, oui, il est une douleur).

(3) sont Timeouts la seule façon, mais vous pouvez atténuer la douleur, pour ainsi dire. Avoir le ping client le serveur via la connexion toutes les N secondes quand il n'y a par ailleurs aucune activité. N'a pas à faire quoi que ce soit et vous pouvez virer de bord des choses sur la réponse; notifications de modifications simultanées ou tout ce que vous avez besoin.

Vous avez raison en ce sens qu'il est surprenant que mod_fastcgi ne supporte pas dire le backend que Apache a détecté la déconnexion ou la connexion expiré. Et vous n'êtes pas le premier à être consterné.

Le deuxième patch sur cette page devrait résoudre ce problème particulier:

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

Autres conseils

http://ncannasse.fr/blog/tora_comet

Je ne dispose pas d'informations concrètes pour vous, mais cet article ne mentionne qu'ils peuvent détecter lorsque le client est déconnecté de Apache. Voir tora.Queue. Et il semble que la source est disponible dans le neko CVS, alors vous pourriez être en mesure de trouver quelques indices là-bas. Bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top