0

ラズベリーパイ(1/2 GB RAM、1 CPU)で実行される単純なファイルサーバーを作成しました。nginx(1ワーカー)の背後にあるgunicorn(3ワーカー)の下で実行されています。

あまりにも多くのファイルを同時にダウンロードしようとすると(たとえば5)、すべてが途中で終了してから中止されるという奇妙な問題があります。djangoサーバーからの出力はありません(開発サーバーを使用してもこの問題が発生するため、gunicornとnginxの背後で実行されていますが、それでも喜びはありません)。

私のダウンロードビューは次のとおりです。

@never_cache
def download_media(request, user_id, session_key, id, filepath):
    "Download an individual media file"

    context = RequestContext(request)

    # validate the user_id & session_key pair
    if not __validate_session_key(user_id, session_key):
        return HttpResponseRedirect(reverse('handle_logout'))

    filepath = unicode(urllib.unquote(filepath))

    if '..' in filepath:
        raise SuspiciousOperation('Invalid characters in subdir parameter.')

    location = MediaCollectionLocation.objects.get(id=id)

    path = os.path.join(location.path, filepath)

    response = HttpResponse(FileWrapper(file(path)), content_type='application/octet-stream')
    response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(path)

    response['Content-Length'] = os.path.getsize(path)
    response["Cache-Control"] = "no-cache, no-store, must-revalidate"
    return response

クライアントに認証を要求するため、この方法でファイルを提供しています(したがって、nginxを使用して静的コンテンツをリダイレクトして提供するだけでは不十分です)。

複数のリクエストを並行して行うと、なぜドロップアウトするのか考えている人はいますか?

4

1 に答える 1

0

ファイルが失敗する理由は完全にはわかりませんが、ワーカーよりも多くのファイルをダウンロードすること、またはnginxとgunicornの間でタイムアウトが発生していることに関係があると思います.

django がユーザーを認証した後でのみ、nginx がファイル自体を読み取って (内部のみ) 提供する特定のヘッダーを設定することによって、nginx にファイルを提供させることができます。

XSendFileは nginx がこれを行うために使用するものです。次に、いくつかのミドルウェアまたは関数を作成して、django から適切なヘッダーを設定するか、nginx バックエンドでdjango-sendfileのようなものを使用して、すべてを実行します。

発生している問題の原因が django と nginx の間のタイムアウトである場合は、この修正で解決するはずです。そうでない場合は、nginx ワーカーの数も増やします。これは、ファイルの提供を担当するようになるためです。

于 2013-02-25T01:42:11.783 に答える