【问题标题】:Django+gunicorn+nginx upload large file 502 errorDjango+gunicorn+nginx上传大文件502错误
【发布时间】:2013-03-13 09:46:32
【问题描述】:

问题

上传 1-2mb 的文件可以正常工作。 当我尝试上传 16mb 文件时,几秒钟后出现 502 错误

更详细:

  1. 我点击“上传”
  2. 谷歌浏览器上传文件(上传状态在左下角从 0% 变为 100%)
  3. 状态更改为“等待 HOST”,其中 HOST 是我的站点主机名
  4. 半分钟后服务器返回“502 Bad Gateway”

我的看法:

def upload(request):
    if request.method == 'POST':
        f = File(data=request.FILES['file'])
        f.save()
        return redirect(reverse(display),  f.id)
    else:
        return render('filehosting_upload.html', request)

render(template, request [,data]) 是我自己处理一些 ajax 东西的速记;

filehosting_upload.html:

{% extends "base.html" %}
{% block content %}
    <h2>File upload</h2>
    <form action="{% url nexus.filehosting.views.upload %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="file">
        <button type="submit" class="btn">Upload</button>
    </form>
{% endblock %}

日志和规格

我在日志中找不到任何信息。

版本:

  • Django==1.4.2
  • Nginx==1.2.1
  • gunicorn==0.17.2

命令行参数

command=/var/www/ernado/data/envs/PROJECT_NAME/bin/gunicorn -b localhost:8801 -w 4 PROJECT_NAME:application

相关位置的Nginx配置:

   location /files/upload {
    client_max_body_size 100m;
    proxy_pass http://HOST;
    proxy_connect_timeout 300s;
    proxy_read_timeout 300s;
   }

Nginx 日志条目(更改了 MY_IP 和 HOST)

2013/03/23 19:31:06 [error] 12701#0: *88 upstream prematurely closed connection while reading response header from upstream, client: MY_IP, server: HOST, request: "POST /files/upload HTTP/1.1", upstream: "http://127.0.0.1:8801/files/upload", host: "HOST", referrer: "http://HOST/files/upload"

Django 日志

2013-03-23 19:31:06 [12634] [CRITICAL] WORKER TIMEOUT (pid:12829)
2013-03-23 19:31:06 [12634] [CRITICAL] WORKER TIMEOUT (pid:12829)
2013-03-23 19:31:06 [13854] [INFO] Booting worker with pid: 13854

问题

  1. 如何解决?
  2. 没有 nginx 上传模块可以解决这个问题吗?

更新 1 尝试了建议的配置

 gunicorn --workers=3 --worker-class=tornado  --timeout=90 --graceful-timeout=10 --log-level=DEBUG --bind localhost:8801 --debug

现在对我来说很好。

【问题讨论】:

    标签: django nginx gunicorn


    【解决方案1】:

    我用那个参数运行我的gunicorn,试试:

    python manage.py run_gunicorn --workers=3 --worker-class=tornado  --timeout=90 --graceful-timeout=10 --log-level=DEBUG --bind 127.0.0.1:8151 --debug
    

    或者如果你以不同的方式运行,你可以使用该选项运行

    【讨论】:

    • 谢谢,用 gunicorn --workers=4 --worker-class=tornado --timeout=90 --graceful-timeout=10 --log-level=DEBUG --bind localhost 为我工作:8801 --调试
    • gunicorn server.wsgi:application --bind 127.0.0.1:8152 --debug --log-level debug -w=2 --env DJANGO_SETTINGS_MODULE=server.settings --log-file=- --preload
    • gunicorn server.wsgi:application --bind 127.0.0.1:8152 --debug --log-level debug -w=2 --worker-class=gevent --env DJANGO_SETTINGS_MODULE=server.settings --log-file=- --preload
    【解决方案2】:

    对于大文件处理,您应该使用 worker-class。我在 python 3.7 中使用 gevent 时也遇到了一些问题,最好使用 3.6。

    Django,Python 3.6 示例:

    安装

    pip install gevent
    

    运行

    gunicorn --chdir myApp myApp.wsgi --workers 4 --worker-class=gevent --bind 0.0.0.0:80 --timeout=90 --graceful-timeout=10
    

    【讨论】:

    • 是否会使用新的 asgi 服务器之一(uvicorn 等)在不需要 Gevent 的情况下解决此问题?
    【解决方案3】:

    您需要使用其他工作类型类,如 geventtornado 之类的异步类,请参阅此以获得更多说明: 第一次解释:

    如果您预计您的应用程序代码可能需要在请求处理期间暂停较长时间,您可能还需要安装 Eventlet 或 Gevent

    第二个:

    默认同步工作器假定您的应用程序在 CPU 和网络带宽方面是资源受限的。一般来说,这意味着您的应用程序不应该做任何花费未定义时间的事情。例如,对 Internet 的请求符合此标准。在某些时候,外部网络会出现故障,导致客户端堆积在您的服务器上。

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2012-05-28
      • 2017-05-17
      • 2018-12-05
      • 2021-12-11
      • 2017-07-07
      • 2020-11-04
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多