7

問題

1〜2MBのファイルのアップロードは正常に機能します。16MBのファイルをアップロードしようとすると、数秒後に502エラーが発生します

より詳細:

  1. 「アップロード」をクリックします
  2. Google Chromeがファイルをアップロードします(アップロードステータスは左下隅で0%から100%に変化しています)
  3. ステータスが「WaitingforHOST」に変わります。ここで、HOSTは私のサイトのホスト名です。
  4. 30分後、サーバーは「502BadGateway」を返します

私の見解:

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

今はうまくいきます。

4

3 に答える 3

4

私はそのパラメータで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

または、別の方法で実行する場合は、そのオプションを使用して実行できます

于 2013-03-23T19:05:58.700 に答える
3

大きなファイルを処理するには、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
于 2018-08-10T16:32:49.437 に答える
1

他のワーカータイプクラスをgeventtornadoのような非同期クラスを使用する必要があります。詳細については、これを参照してください:最初の外植:

リクエスト処理中にアプリケーションコードを長期間一時停止する必要があると予想される場合は、EventletまたはGeventをインストールすることもできます。

二つ目 :

デフォルトの同期ワーカーは、アプリケーションがCPUとネットワーク帯域幅の観点からリソースにバインドされていることを前提としています。一般に、これは、アプリケーションが未定義の時間を要することを実行してはならないことを意味します。たとえば、インターネットへのリクエストはこの基準を満たしています。ある時点で、クライアントがサーバーに蓄積するような方法で外部ネットワークに障害が発生します。

于 2014-05-07T10:31:53.073 に答える