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

时间:2016-03-22 14:18:02

标签: 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

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

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

当然,我的客户端(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;
}

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

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

在尝试优化响应时间之前,我希望这个问题有一个解决方案。我找不到一个在另一个岗位上工作的人。我处理大量数据,因此在某些情况下,我的响应时间将在4-10秒之间。

希望你能帮助我:)。

提前多多感谢。

3 个答案:

答案 0 :(得分:16)

当您上传内容时,可能会使用分块编码。 有uWSGI选项 --chunked-input-timeout, 默认情况下为4秒(defaults--socket-timeout,即4秒)。

虽然理论上问题可能在其他地方,但我建议你试试 上述选择。另外,烦人的例外是我

的原因
ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true
在我的uWSGI配置中(请注意,我提供了3个选项,而不是2个):

  • ignore-sigpipe使uWSGI不显示SIGPIPE错误;
  • ignore-write-errors使其无法显示错误 例如uwsgi_response_writev_headers_and_body_do;
  • disable-write-exception阻止 写作OSError代。

答案 1 :(得分:2)

在我的情况下,Nginx作为uwsgi的反向代理,配置http-timeout将服务器设置为在长时间运行的请求中正常等待。

请注意,nginx代理声明中包含以下选项:

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

关于网关超时没有任何操作

答案 2 :(得分:0)

我在[socked-timeout=xxx]配置中添加了uwsgi.ini,它可以正常工作。