nginx uWSGI引发OSError:大型请求期间出现写入错误

fcy6dtqo  于 2023-11-17  发布在  Nginx
关注(0)|答案(3)|浏览(173)

我的应用程序使用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 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秒之间。
希望你能帮助我:)
多谢了。

7lrncoxx

7lrncoxx1#

当你上传东西的时候,你可能会使用分块编码。有一个uWSGI选项--chunked-input-timeout,默认为4秒(默认值为--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
zxlwwiss

zxlwwiss2#

在我的例子中,Nginx作为uwsgi的backproxy,配置http-timeout设置服务器在长时间运行的请求中正常等待。
请注意,nginx代理声明中包含以下选项:

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

字符串
在网关超时问题上什么都没做

xkrw2x1b

xkrw2x1b3#

我在uwsgi.ini配置中添加了[socket-timeout=xxx],它工作了。

相关问题