【问题标题】:Django file upload took forever with Phusion PassengerPhusion Passenger 的 Django 文件上传需要很长时间
【发布时间】:2015-08-30 18:32:42
【问题描述】:

我有一个使用 Passenger 部署的 Django 应用程序(我没有选择 mod_wsgi,因为 mod_passenger 已经存在并且正在使用)。当我上传一个 MP3 文件 (900 kB) 时,谷歌浏览器显示上传百分比非常快地达到了 100%,但结果页面却花了很长时间。数据库(包含文件的元数据)没有显示任何上传的内容。

Django 逻辑应该没问题,因为一切都在开发机器上运行(内置 Python 服务器)

我的配置:Django 1.8、Apache 2.4、Ubuntu 14.04

【问题讨论】:

  • 分享 Django 设置和乘客日志将有助于回答。
  • 我找不到乘客日志,只有 apache 错误/访问日志没有显示任何相关内容。这不是rails应用而是django应用,根目录没有log子目录
  • 我可以找到 /tmp/passenger.1.0.1354/generation-1/buffered_uploads 属于 www-data 并且有权限 drwx------ 这个目录的时间戳反映了我上传的时间,但在上传大文件的时间里内容总是空的
  • 还有 /tmp/passenger.1.0.1354/generation-1/logging 属于 root 并且有权限 srwxrwxrwt 但大小始终为零,时间戳保持不变。

标签: django apache file-upload passenger


【解决方案1】:

这里是乘客作者。尝试将passenger_log_level 设置为更高的值,这可能会让您了解发生这种情况的原因。

我不知道你用的是哪个Passenger版本,但是在第5版中,Passenger请求处理周期是这样的:

  1. Apache 收到请求。标头完成后,它将请求转发到乘客服务器进程,同时将请求正文流式传输到乘客服务器进程。
  2. Passenger 服务器进程缓冲整个请求,包括正文。这种缓冲发生在一个立即取消链接的临时文件中。
  3. 一旦缓冲完成,Passenger 服务器进程将请求(包括正文)转发到 Django 应用程序。乘客然后等待应用生成响应。
  4. Passenger 服务器进程将来自 Django 应用程序的响应流式传输到 Apache。这里没有阻塞缓冲。
  5. Apache 将来自Passenger 服务器进程的响应流式传输到客户端。此处不进行缓冲。

通过足够高的日志级别,您可以查看每个步骤花费了多少时间,以便找出罪魁祸首。

请注意,请求处理周期在早期版本的 Passenger 中有所不同。我的建议仅适用于版本 5。

【讨论】:

  • 我的乘客是:ruby-passenger:amd64/trusty 4.0.37-2 我已将日志级别设置为 4,我正在准备 error.log 的摘录,我将在下一条评论中发布.
  • 日志文件没有显示任何错误。所有请求几乎立即得到处理。您遇到什么样的响应时间?
  • 您是否已经尝试升级到版本 5? 4.0.37 版本已经很老了。
  • 我只能 apt-get 更新/升级包,但不能安装自定义包。但我尝试上传一个小文本文件(390 字节)而不是 mp3(965k),它成功了。所以问题很可能是上传文件大小限制。我没有使用 LimitRequestBody 指令之类的东西来限制 Apache,同样的 Django 代码也适用于 965k mp3。所以缩小到乘客问题。有没有办法用Passenger定义上传文件的大小?
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多