Django + gunicorn + nginx上传大文件502错误

时间:2013-03-23 16:08:18

标签: django nginx gunicorn

问题

上传1-2mb文件工作正常。 当我尝试上传16mb文件时,几秒后我得到502错误

更多信息:

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

    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 %}
    

    日志&amp;功能

    我能找到的日志中没有任何信息。

    版本:

    • 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 log

    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
    

    问题(S)

    1. 如何解决?
    2. 是否可以在没有nginx上传模块的情况下解决这个问题?
    3. 更新1 试过建议的配置

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

      现在适合我。

3 个答案:

答案 0 :(得分:3)

我用这些参数运行我的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

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

答案 1 :(得分:0)

您需要使用其他工作类型类,如 gevent tornado 等异步,请参阅此更多说明: 第一个解释:

  

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

第二个:

  

默认同步工作者假定您的应用程序在CPU和网络带宽方面受资源限制。通常这意味着您的应用程序不应该执行任何需要不确定时间的事情。例如,对互联网的请求符合此标准。在某些时候,外部网络将以客户端堆积在服务器上的方式失败。

答案 2 :(得分:0)

对于大文件处理,您应该使用工人级。另外在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