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

问题描述 投票:0回答:3

我的应用程序使用nginx,在服务器端使用uWSGI。当我发出一个大请求(响应时间> 4s)时,会出现以下内容:

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 秒之间。

希望你能帮助我:)

提前非常感谢。

python nginx uwsgi
3个回答
34
投票

可能的情况是,当您上传内容时,您使用分块编码。 有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
    写入生成。

3
投票

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

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

proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
关于网关超时,

我们没有做任何事情。


3
投票
[socket-timeout=xxx]

配置中添加了

uwsgi.ini
,它起作用了。
    

© www.soinside.com 2019 - 2024. All rights reserved.