Proxy HTTP / FastCGI / SCGI no cerrar la conexión cuando el cliente está desconectado - falla o función?

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

Pregunta

Estoy trabajando en Comet apoyo para < a href = "http://cppcms.sourceforge.net/" rel = "nofollow noreferrer"> CppCMS marco a través de encuestas XMLHttpRequest largos. En muchos casos, dicha solicitud se cierra por el cliente antes de que se le dio ninguna respuesta del servidor -., Por ejemplo, la página se cierra, usuario se mueve a otra página o simplemente se refeshed

En el lado del servidor espero que iba a recibir la notificación de que se cae la conexión. Probé la aplicación a través de 3 conectores:. FastCGI, SCGI y proxy HTTP sencilla

A partir de 3 grandes servidores web Apache 2, UNIX, lighttpd y Nginx, sólo la última habían cerrado conexión como permitir que se esperaba de mi aplicación para eliminar la solicitud de la cola de espera - esto funcionó para ambos conectores de proxy HTTP y FastCGI. (Nginx no tiene módulo scgi por defecto).

Otros, Apache y Lighttpd hacer la conexión se cierra o informar sobre el backend desconectado clientes, al proceder como si el cliente está todavía en línea. Esto sucede para todos 3 API soportados:. FastCGI, SCGI y proxy HTTP

Yo había abierto un problema para Lighttpd , pero lo más conserns mí es el hecho de que Apache - madura y bien soportado como servidor web lighttpd y no describe el backend de servidor que el cliente había ido.

Preguntas:

  1. ¿Es esto un error o se trata de una función? ¿Hay alguna razón para no cerrar la conexión entre el servidor web y el back-end de aplicaciones?
  2. ¿Hay vida real aplicación Comet trabajo detrás de estos servidores a través de FastCGI backends / SCGI / HTTP Proxy?
  3. Si lo anterior cierto, ¿cómo hacer frente a este problema? Entiendo que puedo tiempo de espera que todas las conexiones cada 10 segundos, pero me gustaría para mantenerlos inactivo En la medida de lo cliente escucha - porque esto permite que la escala más fácil para arriba - cada conexión es muy barato - el costo es sólo el zócalo opended.

Gracias!

¿Fue útil?

Solución

(1) Característica. O, más específicamente, consecuencias de un detalle de implementación.

Una conexión TCP / IP no implica un flujo constante de tráfico de ida y vuelta. Por lo tanto, no hay manera de saber que un cliente se ha ido sin (a) el cliente le dice que se cierre la conexión o (b) un tiempo de espera.

(2) No estoy especialmente familiarizado con el cometa o CppCMS. Pero, sí, hay todo tipo de servidores CMS corriendo detrás de los servidores web mencionados y todos ellos tienen que hacer frente a este problema (y, sí, es un dolor).

(3) Los tiempos de espera son la única manera, pero se puede mitigar el dolor, por así decirlo. Tener el cliente de ping al servidor a través de la conexión de cada N segundos cuando no hay otra manera ninguna actividad. No tiene que hacer nada y se puede virar cosas en la respuesta; notificaciones de ediciones concurrentes o lo que usted necesita.

Tiene usted razón en que es sorprendente que mod_fastcgi no admite diciendo al servidor que Apache ha detectado la desconexión o la conexión de tiempo de espera agotado. Y usted no es el primero en desmayes.

El segundo parche en esta página debería solucionar ese tema en particular:

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

Otros consejos

http://ncannasse.fr/blog/tora_comet

No tengo ninguna información concreta para usted, pero este artículo se menciona que pueden detectar cuando el cliente se ha desconectado de Apache. Ver tora.Queue. Y parece que la fuente está disponible en el CVS neko, por lo que podría ser capaz de encontrar algunas pistas allí. Buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top