web-dev-qa-db-ja.com

uWSGIがOSErrorを発生させる:大きなリクエスト中に書き込みエラーが発生する

私のアプリケーションはnginxを使用しており、サーバー側にuWSGIがあります。大きなリクエスト(応答時間> 4秒)を実行すると、次のように表示されます。

SIGPIPE: writing to a closed pipe/socket/fd (probably the client
    disconnected) on request _URL_ (ip XX.XX.XX.XX) !!!

uwsgi_response_writev_headers_and_body_do(): Broken pipe
    [core/writer.c line 287] during GET _URL_ (XX.XX.XX.XX)

OSError: write error

UWSGIがストリームに書き込もうとしたようですが、このストリームはすでに閉じられています。 nginxログ(error.log)を確認すると:

upstream prematurely closed connection while reading response
    header from upstream ...

もちろん、私のクライアント(RESTクライアントまたはブラウザー)は502エラーを受け取ります。

〜4秒後には常にこのエラーが発生します。

ただし、この問題を防ぐ方法はわかりません。私はnginx設定ファイルにいくつかのパラメータを設定しようとしました:

location my_api_url {
    [...]
    uwsgi_buffer_size 32k;
    uwsgi_buffers 8 32k;
    uwsgi_busy_buffers_size 32k;

    uwsgi_read_timeout 300;
    uwsgi_send_timeout 300;

    uwsgi_connect_timeout 60;
}

しかし、問題はまだここにあります。また、これらのパラメーターをuWSGI構成ファイル(wsgi.ini)に設定しようとしました。

buffer-size=8192
ignore-sigpipe=true
ignore-write-errors=true

応答時間を最適化する前に、この問題に解決策があることを願っています。別の投稿で機能しているものが見つかりません。私は大量のデータを処理するので、私の応答時間は、場合によっては4〜10秒になります。

あなたが私を助けることができることを願っています:)

よろしくお願いします。

22
JulCh

アップロードするときにチャンクエンコーディングを使用する場合があります。 uWSGIオプション --chunked-input-timeout 、それはデフォルトで4秒です(それは defaults の値に--socket-timeout、4秒です)。

理論的には問題がどこかにあるかもしれませんが、前述のオプションを試すことをお勧めします。さらに、迷惑な例外は私が持っている理由です

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

私のuWSGI構成で(2つではなく3つのオプションを提供することに注意してください):

  • ignore-sigpipe uWSGIにSIGPIPEエラーを表示させません。
  • ignore-write-errorsは、エラーを表示しません。 uwsgi_response_writev_headers_and_body_do;
  • disable-write-exceptionは、書き込み時にOSErrorを生成しません。
19
paka

私の場合、Nwsはuwsgiのバックプロキシとして、config http-timeout は長時間実行されるリクエストで通常待機するようにサーバーを設定します。

Nginxプロキシ宣言に次のオプションが含まれていることに注意してください。

proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;

ゲートウェイのタイムアウトに関して何もしていませんでした

0
Evhz