大文件上传时连接重置
我在使用Pylons上传文件时遇到了一个非常烦人的问题,希望有人能帮我解决。最开始我在这里发帖,认为这是Pylons的问题,但后来我发现其实是服务器的问题,也就是paste。我已经找到了问题发生的具体位置,但不太清楚该怎么解决。情况是这样的:我有一个通过paster提供服务的Pylons网络应用,其中有一部分功能允许用户上传文件,有时候这些文件会比较大(超过50MB)。在上传过程中,服务器会偶尔重置连接(在Chrome中显示的错误是“错误101(net::ERR_CONNECTION_RESET):连接被重置。”)。这种情况并不是每次都会发生,大约只有50%的概率会在上传大文件时出现。
在这些情况下,服务器根本没有把POST请求交给应用层处理。没有抛出任何异常(至少我找不到)。我把问题缩小到cascade.py文件(特别是从httpserver.py调用的wsgi_application方法)。在后者中:
result = self.server.wsgi_application(self.wsgi_environ, self.wsgi_start_response)
在cascade.py的call函数中,文件似乎被写入一个临时文件。相关的循环从这里开始:
while copy_len > 0:
然后它会一个一个地将数据块写入打开的文件。这些写入操作单独进行时并不会抛出异常。然而,服务器在这些写入过程中经常会“消失”,看起来是随机发生的(时间似乎与此没有关联)。所以当我打印出copy_len的大小时,它会逐渐减少到某个点,然后服务器突然发送一个“连接重置”的信号(或者至少客户端认为是这样),这个方法似乎就退出了(copy_len停止打印,仿佛循环已经退出,尽管它并没有到0)。
我完全搞不懂,因为1)这种情况只是偶尔发生,2)我似乎找不到实际的错误或异常——它就这样……死掉了。
如果这有关系的话,我正在运行paste 1.7.3、Python 2.7和Fedora操作系统。有没有人能提供一些关于可能发生了什么以及我该如何解决的见解?非常感谢任何帮助。