uWSGI引发OSError:在大请求期间写入错误

Jul*_*lCh 20 python nginx uwsgi

我的应用程序使用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
Run Code Online (Sandbox Code Playgroud)

似乎uWSGI尝试在流中写入,但此流已经关闭.当我检查nginx log(error.log)时:

upstream prematurely closed connection while reading response
    header from upstream ...
Run Code Online (Sandbox Code Playgroud)

当然,我的客户端(REST客户端或浏览器)收到502错误.

我总是在~4s后得到这个错误.

但是,我不知道如何防止这个问题.我试着在我的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;
}
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.我还尝试在uWSGI配置文件(wsgi.ini)中设置这些参数:

buffer-size=8192
ignore-sigpipe=true
ignore-write-errors=true
Run Code Online (Sandbox Code Playgroud)

在尝试优化响应时间之前,我希望这个问题有一个解决方案.我没有找到一个在另一篇文章中工作的人.我使用大量数据,因此在某些情况下,我的响应时间将在4到10秒之间.

希望你能帮我 :)

非常感谢提前.

小智 17

可能是这样的情况,当您上传内容时,您使用分块编码.有uWSGI选项 --chunked-input-timeout,默认为4秒(默认 值为--socket-timeout4秒).

虽然理论上问题可能在其他地方,但我建议你尝试上述选项.另外,烦人的例外是我拥有的原因

ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true
Run Code Online (Sandbox Code Playgroud)

在我的uWSGI配置中(注意我提供了3个选项,而不是2个):

  • ignore-sigpipe 使uWSGI不显示SIGPIPE错误;
  • ignore-write-errors使它不显示例如错误uwsgi_response_writev_headers_and_body_do;
  • disable-write-exception防止 OSError写入时生成.

  • 请注意,根据uWSGI最新版本,应提供`ignore-sigpipe`,`ignore-write-errors`和“ disable-write-exception`不带参数。参见https://uwsgi-docs.readthedocs.io/en/latest/Options.html (2认同)
  • 要复制常规(不大)请求的错误,请在 uWSGI 支持的站点上打开一个页面,然后快速按 F5(刷新)键几次。对于测试上述配置更改非常有帮助。 (2认同)