在使用Python的uWSGI时修复管道错误问题

31
在Python中访问REST资源(my_resource)时,uWSGI服务器在其日志中抛出以下错误。
SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request my_resource (ip <my_ip>) !!!
uwsgi_response_write_body_do(): Broken pipe [core/writer.c line 164]
IOError: write error

看起来这与超时有关(客户端在请求完成处理之前断开连接)。

这是什么样的超时,如何修复?

3个回答

14

这取决于您的前端服务器。例如, nginx 有 uwsgi_read_timeout 参数(通常设置为60秒)。uWSGI http路由器默认的 --http-timeout 也是60秒等等。由于您提到了一个rest api,我很怀疑需要超过60秒才能生成响应,您确定没有某些错误的响应头触发前端web服务器关闭连接吗?


是的,我非常确定。这个单一的请求需要更长时间来生成响应,有特定的原因,我们将在必要时处理。然而,目前增加超时时间似乎是解决问题的方法。谢谢! - Juan Carlos Coto
我遇到了同样的问题,但无法用这种方式解决。 我正在使用 Flask 并且期望请求会更大一些,因为它们携带着变长在2秒至15秒之间的音频二进制数据。即使是在请求中传递小的音频示例,我仍然在错误日志中收到这个消息。 - lithiumlab
我遇到的问题已经通过升级OpenSSL版本1.0.2g得到解决。 - lithiumlab

8

如果您正在使用 uwsgi nginx 插件,请考虑使用

uwsgi_connect_timeout 180;
uwsgi_read_timeout 180;
uwsgi_send_timeout 180;

这些值应该添加到哪个文件中? - user873275
2
在nginx.conf文件内部 - Chris Maes

0

这里的StackOverflow答案帮助了我uwsgi_ignore_client_abort on

42个赞:

问题是客户端中断连接,然后Nginx关闭连接而没有告诉uwsgi中断。然后当uwsgi返回结果时,套接字已经关闭。Nginx在日志中写入499错误,而uwsgi抛出IOError。

非最佳解决方案是告诉Nginx不要关闭套接字,等待uwsgi返回响应。

在你的nginx.config中添加uwsgi_ignore_client_abort。

location @app {
    include uwsgi_params;
    uwsgi_pass unix:///tmp/uwsgi.sock;

    # when a client closes the connection then keep the channel to uwsgi open. Otherwise uwsgi throws an IOError
    uwsgi_ignore_client_abort on;
}

不清楚是否可以告诉Nginx关闭uwsgi连接。关于这个问题还有另一个SO问题:(将http中止/关闭从nginx传播到uwsgi / Django)
Yuda Prawira David Dehghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接