web-dev-qa-db-ja.com

uwsgi IOError:書き込みエラー

私のDjangoアプリのnginx + uwsgi構成に問題があります。uwsgiエラーログでこのエラーが発生し続けます。

2016年1月13日水曜日15:26:04-uwsgi_response_writev_headers_and_body_do():POST/company/get_unpaid_invoices_chart /(86.34.48.7)中にエラーが発生したパイプ[core/writer.c行296] IOError:書き込みエラー

2016年1月13日水曜日15:26:20-uwsgi_response_write_headers_do():GET/gestiune/print_pdf/nir/136194 /(89.122.255.186)中にエラーが発生したパイプ[core/writer.c行238] IOError:書き込みエラー

すべてのリクエストでそれらを取得しているわけではありませんが、毎分2つ取得しています。私はそれを検索しましたが、これはuwsgiが応答を書き込みたいときにnginxがuwsgiへの接続を閉じるために発生することを理解しています。私のnginx構成ではこれがあるのでこれは奇妙に見えます:

uwsgi_paramsを含めます。

uwsgi_pass unix:/home/project/Django/sbo_cloud/site.sock;

uwsgi_read_timeout 600;

uwsgi_send_timeout 600;

uwsgi_connect_timeout 60;

エラーが表示されたリクエストが600秒のタイムアウトを超えていないことは確かです。なぜこれが起こるのでしょうか?

ありがとう

23
Virgil Balibanu

問題は、クライアントが接続を中止し、その後Nginxがuwsgiに中止を指示せずに接続を閉じることです。次に、uwsgiが結果を返すと、ソケットはすでに閉じています。 Nginxは499エラーをログに書き込み、uwsgiはIOErrorをスローします。

最適ではない解決策は、ソケットを閉じないようにNginxに指示し、uwsgiが応答を返すのを待つことです。

Nginx.configにuwsgi_ignore_client_abortを追加します。

location @app {
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;

    # when a client closes the connection then keep the channel to uwsgi open. Otherwise uwsgi throws an IOError
    uwsgi_ignore_client_abort on;
}

Nginxにuwsgi接続を閉じるように指示できるかどうかは明確ではありません。この問題について別のSO Questinがあります:( http abort/close to nginxからuwsgi/Django ))

24
David Dehghan

代替ソリューションは、uWSGI構成に次の設定を配置することです:

ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

参照 https://github.com/getsentry/raven-python/issues/732

6
Andrei