2011-08-31 14 views
6

Tengo un problema bastante molesto con las cargas de archivos en Pylons con las que espero que alguien pueda ayudarme. Originalmente publiqué el problema here pensando que esto era un problema con Pylons, pero desde entonces llegué a la conclusión de que el problema se debe al servidor, es decir, pegar, y he rastreado exactamente dónde ocurre el problema, pero no estoy seguro como resolverlo. El comportamiento es el siguiente. Tengo una aplicación web de Pilones que estoy sirviendo a través de paster. Una parte de la aplicación permite a los usuarios subir archivos a los sistemas y, a veces, estos pueden ser bastante grandes (> 50 mb). Durante dichas cargas, el servidor restablece esporádicamente la conexión (es decir, en Chrome el error dice "Error 101 (net :: ERR_CONNECTION_RESET): la conexión se reinició".) Esto no ocurre siempre, solo aproximadamente ~ 50% de el tiempo con archivos más grandes.La conexión se restablece al cargar archivos (grandes)

En estos casos, el servidor nunca entrega el POST hasta el nivel de la aplicación. No se lanza ninguna excepción (al menos, que puedo encontrar). Reduje el problema a cascade.py (en particular, el método wsgi_application invocado desde httpserver.py). A partir de este último:

resultado = self.server.wsgi_application (self.wsgi_environ, self.wsgi_start_response)

En el llamada función de cascade.py, el archivo parece estar escrita a un archivo temporal. El bucle relevante comienza en:

mientras copy_len> 0:

A continuación, escribe trozos uno por uno para el archivo abierto. Ninguno de estos escribe individualmente arroja una excepción. Sin embargo, el servidor a menudo simplemente 'desaparecerá' durante estas escrituras, aparentemente al azar (el tiempo tampoco parece estar correlacionado con esto). Así que si imprimo el tamaño de copy_len, que se está reduciendo, lo veo disminuir hasta cierto punto, y luego el servidor envía de repente un 'restablecimiento de la conexión' (o al menos el cliente cree que sí) y el método parece salir (el copy_len deja de imprimirse, como si el bucle se hubiera salido, aunque no estaba en 0).

Estoy completamente perplejo, ya que 1) esto solo ocurre esporádicamente, y 2) Parece que no puedo rastrear un error real/Excepción - simplemente ... muere.

Si es importante, ejecuto la pasta 1.7.3, Python 2.7 y el sistema operativo Fedora. ¿Alguien tiene alguna idea de lo que podría estar sucediendo y cómo podría resolverlo? Muchas gracias por cualquier ayuda.

Respuesta

1

dos ideas vienen a la mente ...

  • Prueba con otro más robusto servidor web, tales como nginx. Se puede ejecutar al mismo tiempo si es necesario. Vea si el problema persiste. Si bien pegar puede manejar aplicaciones web, no está diseñado para manejar grandes transferencias de archivos hasta donde yo sé.
  • ¿Está utilizando Chunked Transfer Encoding durante la carga?
+0

+1 Es probable que un problema de servidor web sea más que un problema de python/pilones. – Kekoa

0

No tengo problemas para usar apache 2.2 + mod_python 3.3 en Ubuntu 10.04. He cargado con éxito archivos grandes (400 mb).

He usado uploader para crear el formulario de carga html.

Cuestiones relacionadas