2012-10-25 33 views
7

NGINXでボトルアプリケーションをuWSGIを使用してホストしようとしています。NGINX + uWSGIピアによって接続がリセットされる

は、ここで私は、私はPOSTリクエストを使用しています。この

uwsgi --enable-threads --socket :8080 --plugin python -- wsgi-file ./myApp/myapp.py 

としてuwsgi実行している私の

nginx.conf
location /myapp/ { 
     include uwsgi_params; 
     uwsgi_param X-Real-IP $remote_addr; 
     uwsgi_param Host $http_host; 
     uwsgi_param UWSGI_SCRIPT myapp; 
     uwsgi_pass 127.0.0.1:8080; 
    } 

です。 dev Http Clientを使用している場合私は

http://localhost/myapp 

uWSGIサーバが要求して印刷

[pid: 4683|app: 0|req: 1/1] 127.0.0.1() {50 vars in 806 bytes} [Thu Oct 25 12:29:36 2012] POST /myapp => generated 737 bytes in 11 msecs (HTTP/1.1 404) 2 headers in 87 bytes (1 switches on core 0) 

が、nginxのエラーログ

2012/10/25 12:20:16 [error] 4364#0: *11 readv() failed (104: Connection reset by peer) while reading upstream, client: 127.0.0.1, server: localhost, request: "POST /myApp/myapp/ HTTP/1.1", upstream: "uwsgi://127.0.0.1:8080", host: "localhost" 

何をするで

を受け取り、要求を送信するときにどちらが無限に行きますか?

答えて

6

お客様のアプリケーションでデータを読み取らずにクライアントからデータを送信することはできません。これはuWSGIでは問題ではありませんが、nginxは失敗します。 uWSGIの--post-bufferingオプションを使用して、ソケットからのデータを自動的に読み取ることができますが、(たとえ私がそのバグを考慮していなくても) "修正する"方が良いでしょう。アプリ

+0

私はすでに - ポストバッファリング32768を試みました。まだ動作していません –

+2

あなたのアプリでポストデータを消費していますか? – RickyA

1

スレッドを使用していません!

私は、Global Interpretator Lock with Pythonでuwsgiの問題を抱えています。 私はスレッドを使用しません - 接続リセットではありません。

(サーバー上の1Gb RAM)uwsgi設定の例

[[email protected] uwsgi]# cat myproj_config.yaml 
uwsgi: 
    print: Myproject Configuration Started 
    socket: /var/tmp/myproject_uwsgi.sock 
    pythonpath: /sites/myproject/myproj 
    env: DJANGO_SETTINGS_MODULE=settings 
    module: wsgi 
    chdir: /sites/myproject/myproj 
    daemonize: /sites/myproject/log/uwsgi.log 
    max-requests: 4000 
    buffer-size: 32768 
    harakiri: 30 
    harakiri-verbose: true 
    reload-mercy: 8 
    vacuum: true 
    master: 1 
    post-buffering: 8192 
    processes: 4 
    no-orphans: 1 
    touch-reload: /sites/myproject/log/uwsgi 
    post-buffering: 8192 
5

あなたはPythonアプリケーション

def my_view(request): 

    # ensure to read the post data, even if you don't need it 
    # without this you get a: failed (104: Connection reset by peer) 
    data = request.DATA 

    return HttpResponse("Hello World") 
+1

これは、nginx-uwsgi-djangoの実装での私の問題を確実に解決しました。私はスタブビューを構築していて、最初は受信XMLを気にしませんでした。小さなインバウンドxmlは機能しますが、大きいものはピアによってリセットされます。ビューに 'body = request.body'を追加すると、どんなサイズの投稿も動作し始めました。 – bskinnersf

+2

これはDjango/UWSGI/Nginxスタックの私にとっても問題でした。私はこれが事であることを知らなかった。これに関するドキュメンテーション/リソースはありますか?なぜ私はPOSTデータを消費する必要がありますか?編集:ここにいくつかの詳細(非常に曖昧ですが):http://uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html –

3

を持っている場合、例えば、アプリケーション

であなたのポストのデータを消費することを確認してくださいこの問題は、uwsgiがある時点でまだ必要かどうかを知ることができないため、要求の本体が消費されない場合に発生します。だから、uwsgiは消費されるまで、またはnginxが接続をリセットするまでアップストリームのタイムアウトのためにデータを保持し続けます。

uwsgiの作者はhereそれを説明する:

08:21 < unbit> plaes: does your DELETE request (not-response) have a body ? 
08:40 < unbit> and do you read that body in your app ? 
08:41 < unbit> from the nginx logs it looks like it has a body and you are not reading it in the app 
08:43 < plaes> so DELETE request shouldn't have the body? 
08:43 < unbit> no i mean if a request has a body you have to read/consume it 
08:44 < unbit> otherwise the socket will be clobbered 

をだから、あなたは(常にどちらかそれが必要でない場合は、本体を送信するために全体のリクエストボディを読んだりしないように確認する必要があり、この問題を解決するためにDELETEなど)。

+0

これは多くの助けになりました!ありがとうございました! – vincent

関連する問題