Соединение сбрасывается при (большой) загрузке файла - PullRequest
6 голосов
/ 31 августа 2011

Итак, у меня довольно неприятная проблема с загрузкой файлов в Pylons, и я надеюсь, что кто-то сможет мне помочь.Первоначально я опубликовал проблему здесь , думая, что это проблема с Pylons, но с тех пор я пришел к выводу, что проблема связана с сервером, т. Е. Вставкой, и я выяснил, где именнопроблема возникает, но я не уверен, как ее решить.Поведение заключается в следующем.У меня есть веб-приложение Pylons, которое я использую через пастера.Одна часть приложения позволяет пользователям загружать файлы в системы, и иногда они могут быть довольно большими (> 50 МБ).Во время таких загрузок сервер время от времени сбрасывает соединение (т. Е. В Chrome появляется сообщение об ошибке «Ошибка 101 (net :: ERR_CONNECTION_RESET): соединение было сброшено.».) Это не всегда происходит, только~ 50% времени с большими файлами.

В этих случаях сервер никогда не передает POST до уровня приложения.Никаких исключений не выдается (по крайней мере, что я могу найти).Я сузил проблему до cascade.py (в частности, метод wsgi_application, вызываемый из httpserver.py).Из последнего:

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

В вызове функция каскада.py, файл кажется записанным во временный файл.Соответствующий цикл начинается с:

, а copy_len> 0:

Затем он записывает фрагменты один за другим в открытый файл.Ни одна из этих записей в отдельности не создает исключение.Тем не менее, сервер часто просто «уходит» во время этих записей, по-видимому, наугад (время, похоже, тоже не коррелирует с этим).Поэтому, если я распечатываю уменьшенный размер copy_len, я наблюдаю, как он уменьшается до некоторой точки, а затем сервер внезапно отправляет «сброс соединения» (или, по крайней мере, клиент так считает) и метод.кажется, что он завершен (copy_len перестает печататься, как если бы цикл был завершен, хотя он не был равен 0).

Я полностью озадачен, так как 1) это происходит только время от времени, и 2) я не могу отследить фактическую ошибку / Исключение - это просто ... умирает.

Если это имеет значение, я использую paste 1.7.3, Python 2.7 и Fedora OS.Кто-нибудь имеет представление о том, что может происходить, и как я мог бы решить эту проблему?Большое спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

На ум приходят две идеи ...

  • Тестируйте с помощью другого более надежного веб-сервера, такого как nginx .Он может быть запущен одновременно, если это необходимо.Посмотрите, если проблема не устранена.Насколько я знаю, команда paste может обрабатывать веб-приложения, но не предназначена для обработки больших объемов файлов.
  • Используете ли вы Chunked Transfer Encoding во время загрузки?
0 голосов
/ 19 сентября 2011

У меня нет проблем с использованием apache 2.2 + mod_python 3.3 в Ubuntu 10.04. Я успешно загрузил большие файлы (400 МБ).

Я использовал загрузчик для создания формы загрузки HTML.

...